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()" 챕터를 따르세요.

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.