RTOS 힙 사용 측면
기술노트 90383
아키텍처:
ARM
컴포넌트:
general
업데이트:
2021-07-15 오후 10:24
소개
본 기술 노트는 프로그램에서 힙(heap)을 사용하는 두 가지 상황에 대해서 다룹니다.(RTOS에 의해 관리되는 힙)
1: RTOS 힙 메모리 사용
프로그램에서 RTOS를 사용하며 모든 힙 소비자(malloc, new, printf 및 FILE 작업에 대한 호출)에 대해 RTOS에서 제공하는 힙 메모리를 사용하려는 경우
해결방법 1:
라이브러리 함수 malloc을 RTOS 상대방으로 리디렉션합니다.
예를 들어 "malloc"을 "OS_malloc"로 다시 정의하려면 다음 줄을 링커 옵션에 추가하십시오(Options -> Linker -> Extra Options -> Use command line options):
--redirect malloc=OS_malloc
--redirect free=OS_free
--redirect realloc=_not_implemented
--redirect calloc=_not_implemented
다음 코드 예는 OS_malloc 및 OS_free 함수에 대한 구현을 보여줍니다.
void * OS_malloc(size_t size)
{
char *p;
// ...
return p;
}
void OS_free(void* ptr)
{
// ...
}
2: RTOS를 시작하기 전에 RTOS 힙을 사용
RTOS에서 제공하는 힙을 사용하려면 먼저 RTOS 힙을 초기화하거나 RTOS를 시작해야 하는 경우가 많습니다.
"초기" 힙 사용의 일반적인 예는 '새로운' 연산자를 호출하는 글로벌 C++ 생성자이다. 글로벌 생성자는 시스템 시작 시 "동적 초기화" 중에 호출되며, 이는 RTOS 힙이 초기화되기 전일 수 있다.
또한 RTOS가 시작되기 전에 다른 RTOS 기능(예: 파일 시스템 작업 등)을 호출하는 것도 종종 문제가 됩니다.
해결방법 2:
A. 시스템을 시작하는 동안 동적 초기화를 억제합니다. Linker 옵션(Options -> Linker -> Extra Options):
--skip_dynamic_initialization
B. 응용 프로그램 소스 코드에서 라이브러리 함수에 호출을 추가합니다.
#include "iar_dynamic_init.h"
...
__iar_dynamic_initialization()
이 솔루션을 사용하면 동적 초기화가 이 초기화 함수에 대한 호출 시간까지 "지연"됩니다.
예제: Example project (IAR Embedded Workbench for ARM 6.30.7).zip 다음 링크를 확인하시기 바랍니다
해결방법 2, MQX specific info:
MQX 3.8 User Guide의 6.3 Global Constructors: "Initialize the constructors from _bsp_enable_card()" 챕터를 따르세요.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.