Linker-Script based Task Allocation Structure

Nitroblue 1·2025년 10월 27일

실제 구현 메커니즘

User 레벨 코드 (간단함):

  pub fn led_blinker() -> ! {
      // 사용자는 단순히 함수만 작성
  }

컴파일러 레벨에서 자동 생성 (매크로가 수행):

1. 스택 메모리 자동 할당

#[unsafe(link_section = ".app_stacks")]
static mut LED_BLINKER_STACK: [u32; 128] = [0; 128];

2. 앱 메타데이터 자동 등록

#[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), // 스택
 포인터 함수
    // ...
};

3. extern "C" ABI 강제 변환

unsafe extern "C" fn led_blinker() -> ! { /* 원래 코드
 */ }

cortex-m-rt 링커가 자동 처리:

  • .app_stacks 섹션 → RAM에 배치

  • .app_registry 섹션 → FLASH에 배치

  • 섹션 순서와 주소 자동 결정

    핵심 특징

    ✅ 컴파일러 레벨 자동화: 매크로가 모든 보일러플레이트
    생성
    ✅ 링커 레벨 통합: cortex-m-rt가 메모리 배치 담당✅
    타입 안전성: 함수 포인터로 직접 연결, 문자열 매칭
    불필요
    ✅ 메모리 관리: 스택과 메타데이터 모두 컴파일 타임에
    할당

    이는 Tock OS나 다른 임베디드 RTOS에서 사용하는 선언적
    앱 등록 패턴과 동일. 사용자는 #[app] 속성만
    붙이면, 나머지는 모두 컴파일러와 링커가 자동
    처리할 수 있다.

0개의 댓글