FreeRTOS와 task creation, SRAM, 힙 메모리
0.
마이크로컨트롤러, SoC, CPU, AP칩셋..
단어는 다양하지만, 모두 폰 노이만식 컴퓨터 구조를 가진 발명품들이다.
CPU 밑에 캐시메모리, 주기억장치인 SRAM과 DRAM,
보조 기억 장치인 하드디스크, SSD..
임베디드 기기에서는 EEPROM이나 Flash메모리를
이러한 기억장치들의 역할을 수행하는 것도 왕왕 보일 것이다.
이게 중요한 것은 아니고
task를 만드는 과정에 필요한 메모리, RAM의 용량을 알아보자.
1.
사용하는 보드의 데이터 시트를 보면
STM32F103RB는 다음과 같은 스펙을 가진다.
Flash Memory는 128KB,
SRAM은 20KB
가진다고 한다.
디스커버리보드는 SRAM1 112KB + SRAM2 16KB해서 토탈 용량이 128KB
뉴클리오는 20KB
2.
FreeRTOS는 이 20KB의 공간 안에서
Kernel Stack과 Heap Stack을 나눠서 사용한다.
cubeIDE와 FreeRTOSConfig.h를 확인하면
이 Total Heap Size를 확인할 수 있다.
heap size가 3072 Byte 인것을 확인할 수 있다.
1024 * 3 = 3072이니, 20KB중 3KB를 힙사이즈로 설정한 것을 알 수 있다.
3.
configTOTAL_HEAP_SIZE를 13KB로 설정하고 빌드했다.
아무 문제 없이 빌드가 된다.
4.
configTOTAL_HEAP_SIZE를 21KB로 설정했다.
오류가 발생하면서 RAM이 6672Byte만큼 오버플로우 되었다고 한다.
6.52KB정도 만큼 오버플로우 되었다는 것이고,
21KB로 했을 때, 6.52KB만큼 오버했으니,
이 상황에서 감당할 수 있는 최대 힙의 크기는 14.5KB정도 임을 예상해볼 수 있다.
5.5KB는 커널스택 크기일 것이다.
실제로도 14.5KB정도가 최대크기이다.
5.
FreeRTOS의 Task, Semaphore, Queue 등은
Control Block들에 의해서 관리된다.
리눅스는 커널의 특정 공간에 Process Control Block을
두고 거기서 프로세스를 관리하는 반면,
여기는 힙공간에 Task나 세마포어, 큐를 말록으로 동적할당(dynamic allocation)하고
Control Block를 개별적으로 가지는 형태를 가진다.
(statiscally allocate하는 기능도 존재한다.)
6.
xTaskCreate를 한다면,
힙 공간에는 다음과 같은 순서로 Task가 생성된다.
(1) TCB를 힙공간에 만들고 Initialize한 후, (pxTopOfStack)
(2) 그 뒤에 해당Task를 위한 전용(dedicatd) Stack를 만든다.
이 stack memory들은 ARM이 제공하는 PSP 레지스터에 의해 추적(trace)된다.
(3) 마지막으로 RTOS 커널의 스케쥴러큐에 Ready상태로 등록된다.
7.