Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

임베디드 소프트웨어/Zephyr

[nRF52840 + Zephyr] #9. Memory Management

방피터 2023. 6. 2. 21:30

제퍼에서 제공하는 Memory management 기능은 여러 가지가 있는데

k_malloc()과 k_free() 정도만 알면 될 것 같아.

사실 나머지는 어디서 어떻게 사용되는지 잘 모르겠거든 ㅋㅋ

누가 잘 아는 사람은 알려주고 ㅎ

제퍼에서 제공하는 Memory management 기능들

 

k_malloc()과 k_free()는 특별한 사용법이 없어.

malloc, free랑 동일하거든.

다만 prj.conf 에서

CONFIG_HEAP_MEM_POOL_SIZE(힙 크기) 만 설정해주면 끝이야.

 

굳이 이상한 예제를 만들어보자면

👇👇

//prj.conf
CONFIG_HEAP_MEM_POOL_SIZE=1024


//main.c
void main(void)
{
	for(;;){
		k_sleep(K_MSEC(1000));
		uint8_t* ptr = k_malloc(100);
		if(ptr){
			printk("Memory Allocated: %x\n",ptr);
			sprintf(ptr,"Hello World");
			printk("%s\n",ptr);
			k_free(ptr);
		} else {
			printk("Memory Not Allocated: %x\n",ptr);
		}
	}
}

1초 마다 memory 할당하고 sprintf로 문자열 삽입하고 printk로 출력했어.

뭐... 당연하게 잘 동작하겠지? ㅎ

당연히 잘 동작한다.

이제 설정한 힙 크기(1024)보다 더 크게 malloc해보자구.

👇👇👇

//prj.conf
CONFIG_HEAP_MEM_POOL_SIZE=1024


//main.c
void main(void)
{
	for(;;){
		k_sleep(K_MSEC(1000));
		uint8_t* ptr = k_malloc(1025);
		if(ptr){
			printk("Memory Allocated: %x\n",ptr);
			sprintf(ptr,"Hello World");
			printk("%s\n",ptr);
			k_free(ptr);
		} else {
			printk("Memory Not Allocated: %x\n",ptr);
		}
	}
}

그러면 당연히? ㅎㅎ 실패하겠지!!

메모리 할당 실패!

 

암튼 이런식으로 각 thread가 메모리를 "동적 할당"할 수 있는거지 ㅋㅋ

오랜만에 써보네 ㅋㅋ 동적 할당이라는 말을 ㅋㅋㅋ

Dynamic allocation!!

 

안녕!

 

2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #10. Time management

 

[nRF52840 + Zephyr] #10. Time management

제퍼도 다른 os와 마찬가지로 여러가지 시간관련 기능을 제공하고 있어. 대표적인게 os timer야. 임베디드 프로젝트를 하다보면 타이머를 자주 사용하게 되는데. 타이머를 하드웨어로 돌리려면 하

engschool.tistory.com

 

반응형