실제 구현 메커니즘
User 레벨 코드 (간단함):
pub fn led_blinker() -> ! {
// 사용자는 단순히 함수만 작성
}
컴파일러 레벨에서 자동 생성 (매크로가 수행):
#[unsafe(link_section = ".app_stacks")]
static mut LED_BLINKER_STACK: [u32; 128] = [0; 128];
#[unsafe(link_section = ".app_registry")]
static LED_BLINKER_METADATA: AppMetadata = AppMetadata
{
id: 0,
name: "led_blinker",
entry_fn: Some(led_blinker), // 함수 포인터
직접 저장
stack_ptr_fn: Some(led_blinker_stack_ptr), // 스택
포인터 함수
// ...
};
unsafe extern "C" fn led_blinker() -> ! { /* 원래 코드
*/ }
cortex-m-rt 링커가 자동 처리:
.app_stacks 섹션 → RAM에 배치
.app_registry 섹션 → FLASH에 배치
섹션 순서와 주소 자동 결정
핵심 특징
✅ 컴파일러 레벨 자동화: 매크로가 모든 보일러플레이트
생성
✅ 링커 레벨 통합: cortex-m-rt가 메모리 배치 담당✅
타입 안전성: 함수 포인터로 직접 연결, 문자열 매칭
불필요
✅ 메모리 관리: 스택과 메타데이터 모두 컴파일 타임에
할당
이는 Tock OS나 다른 임베디드 RTOS에서 사용하는 선언적
앱 등록 패턴과 동일. 사용자는 #[app] 속성만
붙이면, 나머지는 모두 컴파일러와 링커가 자동
처리할 수 있다.