Nucleus SE 파티션 메모리: 구성, API, 모범 사례
RTOS Revealed 시리즈 보기
메모리 파티션은 이전 기사에서 소개되었으며, 기존 C malloc() 함수와 비교되었습니다. 파티션은 파티션 풀에서 가져온 고정 크기 메모리 블록으로, 태스크가 의존할 수 있는 결정론적 할당과 해제를 제공합니다.
파티션 사용하기
Nucleus SE에서 파티션 풀은 컴파일 타임에 정의됩니다. 애플리케이션당 최대 16개 풀 구성 가능. 풀이 정의되지 않으면 모든 관련 데이터 구조와 API 코드가 빌드에서 생략되어 풋프린트 최소화.
풀은 단순히 여러 개의 동일한 파티션으로 분할된 연속 메모리 영역입니다. 애플리케이션이 풀의 크기와 개수를 제어합니다. 태스크가 파티션을 요청하면 블록 포인터를 받습니다. 호출자가 할당된 경계 내에 머무르는 것은 호출자의 책임입니다. 파티션은 해제 API를 통해 어떤 태스크든 풀로 반환할 수 있습니다. 풀이 고갈되면 API 매개변수와 빌드 옵션에 따라 에러 반환 또는 태스크 일시 중단.
메모리 파티션 구성
파티션 풀 수
파티션 풀은 nuse_config.h의 #define 문으로 활성화. 핵심 심볼은 NUSE_PARTITION_POOL_NUMBER로 풀 개수 설정. 기본값 0(풀 비활성화). 유효 범위 1~16; 잘못된 값은 nuse_config_check.h가 생성하는 컴파일 타임 #error 유발.
0이 아닌 값으로 설정하면 필요한 데이터 구조 활성화 및 ROM 초기화, 아래 API 인에이블 심볼 잠금 해제.
API 인에이블
각 서비스 콜은 nuse_config.h에 인에이블 매크로 존재. 파티션 관련 심볼:
NUSE_PARTITION_ALLOCATE
NUSE_PARTITION_DEALLOCATE
NUSE_PARTITION_POOL_INFORMATION
NUSE_PARTITION_POOL_COUNT
기본적으로 모두 FALSE로 구현 빌드에서 제외. 기능 사용 위해 해당 매크로 TRUE로 설정. 풀 정의 없이 API 활성화 시(NUSE_Partition_Pool_Count() 제외) 컴파일 타임 에러. 비활성화된 API 호출 시 링크 타임 에러.

파티션 풀 서비스 콜
Nucleus RTOS는 파티션 풀용 7개 서비스 콜 제공. Nucleus SE에서는 핵심 할당/해제 API만 구현. 아래 표는 각 콜, 구현 상태, 간단 설명:
| API | 구현 | 설명 |
NU_Allocate_Partition() | 구현됨 | 파티션 할당. |
NU_Deallocate_Partition() | 구현됨 | 파티션 해제. |
NU_Partition_Pool_Information() | 구현됨 | 풀 메타데이터 조회. |
NU_Established_Partition_Pools() | 구현됨 | 활성 풀 개수 세기. |
NU_Create_Partition_Pool() | 미구현 | 동적 풀 생성. |
NU_Delete_Partition_Pool() | 미구현 | 동적 풀 삭제. |
NU_Partition_Pool_Pointers() | 미구현 | 풀 포인터 반환. |
Nucleus RTOS나 SE 모두 파티션 풀 리셋 루틴 제공 안 함. 이 설계 선택은 태스크가 파티션 할당 후 포인터를 다른 태스크에 넘겨 최종 해제하는 일반적인 유스케이스 반영. 풀 리셋은 모든 파티션을 암묵적으로 자유로 표시해 태스크 수준 계약을 깨뜨릴 수 있음.
할당 및 해제 서비스
핵심 연산:
- 할당: 파티션을 사용 중으로 표시하고 주소 반환.
- 해제: 파티션을 자유로 표시.
Nucleus RTOS 할당 API
프로토타입:
STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool, VOID **return_pointer, UNSIGNED suspend);
반환 값: NU_SUCCESS, NU_NO_PARTITION, NU_INVALID_POOL, NU_INVALID_POINTER, NU_INVALID_SUSPEND, NU_TIMEOUT, NU_POOL_DELETED.
Nucleus SE 할당 API
프로토타입:
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
매개변수:
pool – 사용할 풀 인덱스.
return_pointer – 할당된 블록 주소.
suspend – NUSE_NO_SUSPEND 또는 NUSE_SUSPEND.
반환 코드는 RTOS와 유사하나 NUSE_ 접두사. 비태스크 스레드에서 잘못된 일시 중단 요청이나 블로킹 API 비활성화 시 NUSE_INVALID_SUSPEND 발생.
전체 구현 연습은 RTOS Revealed 시리즈 후속 기사 참조.