heap 영역에 task 할당해주는 함수가 있나요?
553
작성한 질문수 7
동적할당을 이용한 방법으로
configSUPORT_DYNAMIC_ALLOCATION 선언후
xTaskCreate 사용하면 BSS 영역에 task 할당이 된다고 하셨는데 동적할당은 heap 영역에 되는게 아닌가요?
xTaskCreate가 BSS 영역에 할당하는 함수라면
xTaskCreateStatic 함수와 다름이 없을거같다고 생각됩니다.
heap 영역(동적메모리)에 굳이 할당하고 싶다면 어떤 함수를 사용하면 되나요?
BSS는 정적메모리영역인데 동
heap 영역에 할당하면 좋은점이 있을까요?
답변 1
0
안녕하세요. 김영선님!
이미 알고 계신 내용처럼 malloc 함수를 이용하면 heap 영역에서 메모리 할당이 일어나는 것 맞습니다.
FreeRTOS 는 자체적인 동적 메모리 할당자(pvPortMalloc)를 제공하고 있습니다. 이 함수는 BSS 영역을 동적 메모리 할당을 위한 메모리 풀(pool)로 사용합니다.
아래 소스 코드의 113 라인, 58 라인 참조
../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c
113라인
void *pvPortMalloc( size_t xWantedSize )
{
BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
void *pvReturn = NULL;
vTaskSuspendAll();
{
/* If this is the first call to malloc then the heap will require
initialisation to setup the list of free blocks. */
if( pxEnd == NULL )
{
prvHeapInit(); // 메모리 풀 생성
}
else
{
mtCOVERAGE_TEST_MARKER();
}
58라인
/* Allocate the memory for the heap. */
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
/* The application writer has already defined the array used for the RTOS
heap - probably so it can be placed in a special segment or address. */
extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; // 사용자가 명시적으로 메모리 풀을 제공
#else
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; // BSS 에서 메모리 풀이 생성
#endif /* configAPPLICATION_ALLOCATED_HEAP */
heap 영역(동적메모리)에 굳이 할당하고 싶다면 다음과 같이 하시면 될 것 같네요.
FreeRTOSConfig.h 내에 '#define configAPPLICATION_ALLOCATED_HEAP 1' 선언하신 후
main 함수내에서 FreeRTOS 가 시작하기 전에 아래처럼 메모리 풀을 만들어 줍니다.
uint8_t* ucHeap; // 전역변수로 선언 필수
ucHeap = (uint8_t*)malloc(configTOTAL_HEAP_SIZE);
malloc 함수는 thread safe 하지 않기 때문에 FreeRTOS 가 동작하기 전에만 사용 가능하고요. 당연히 태스크 함수내에서는 사용할 수 없습니다.
xTaskCreateStatic() 의 경우 태스크가 사용할 TCB 와 스택 메모리를 사용자가 명시적으로 선언해 준다는 점 말고는 xTaskCreate() 와 별 차이가 없다고 생각하시면 됩니다.
만약에 포팅을 할때 1년에 한번 잡는 치명적인 문제를 해결하는 코드가 들어갔다고 가정하면
0
57
2
STM32 포팅할 때 STM32 Project가 없음
0
167
2
FreeRTOS 멀티코어 지원안됨?
0
87
2
[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화
0
85
2
포팅 부탁드립니다!
0
60
1
포팅 부탁드립니다. <NUCLEO-G071RB>
0
67
2
상호배제 후 되지를 않아서 질문드립니다.
0
62
1
수료증 발급 기준 수정 요청
1
72
1
재진입가능여부에 관한 질문
1
67
1
01_TASKMAN프로젝트 디버깅 모드 실패
1
77
2
그러면 malloc/free가 아닌 동적할당자를 써서 메모리를 할당했기떄문에
1
71
2
실행순서
1
77
2
uart 전송중에는 스위칭이 금지되나요?
1
74
2
스택오버플로우 실습 중 stack size 설정 질문
0
81
2
포팅 원합니다.
2
77
2
코루틴 실습질문
1
100
2
TODO 2번 문제
1
141
4
10. 선점형 커널 그림 설명중 우선순위가 반대인 경우에도 Task B가 먼저 수행되나요?
1
82
2
디버거모드에 진입이 안됩니다.
0
176
2
prvExampleTaskHook 함수 호출 부분에 대해 문의드립니다.
0
120
2
보드 STM32H735IG와 강의 호환 여부 문의
1
153
3
[ L152RE ] 원샷 소프트타이머 실행 잘 되시나요?
1
159
2
Deferred Interrupt Processing 샘플 예제 문의 드립니다.
1
121
2
포팅 서비스 부탁드립니다
1
125
2





