2016-08-17 1 views
0

두 개의 RAM 뱅크 à 64kB가있는 ARM Cortex-M 마이크로 컨트롤러에서 응용 프로그램을 개발 중입니다. 첫 번째 뱅크 바로 다음에 메모리 맵의 두 번째 뱅크가옵니다.섹션을 여러 메모리 영역으로 분할

메모리 뱅크는 현재 링커 스크립트에서 두 영역으로 나뉩니다. 첫 번째 영역에는 .bss.data 섹션이 있습니다. 두 번째 뱅크는 .heap.stack으로 사용되며, 각 뱅크는 1kB 만 사용됩니다 (FreeRTOS에서 다른 스택을 사용하고 있으며 자체 힙도 관리합니다).

제 문제는, .bss이 첫 번째 뱅크에 비해 너무 큽니다. 따라서 저는 그 중 일부를 두 번째 은행으로 옮기고 싶습니다.

이 작업을 수행하는 한 가지 방법은 두 번째 뱅크에 연결된 .secondbss이라고하는 새 섹션을 만드는 것입니다. 그런 다음 __attribute__((section(".secondbss")))을 사용하여 단일 변수를이 섹션에 추가 할 수 있습니다.

난 정말 내 소스 코드의 이식성을 유지하려는 나는이 솔루션을 사용하고 있지 않다 이유입니다

  • 가이 속성을 필요로 변수의 전체를 많이 할 수 있으며 단일 변수마다 섹션을 선택하고 싶지 않습니다.

더 나은 해결책이 있습니까? 이미 두 메모리를 하나의 영역으로 생각했지만 링커가 두 은행 간의 경계를 가로 지르는 데이터의 정렬을 조정하는 방법을 알지 못합니다.

__attribute__ 플래그를 사용하지 않고 어떻게 문제를 해결할 수 있습니까?

감사합니다.

답변

0

예를 들어 0x200000000x20010000에 2 개의 은행이 있습니다. 힙 및 (주) 스택에 대해 Bank2를 사용하려고합니다. 나는 당신이 .bssconfigTOTAL_HEAP_SIZE이고, 이 FreeRTOSConfig.h이기 때문에 큰 것으로 가정합니다. 이제 힙 소스를 FreeRTOS/Source/portable/MemMang/으로보십시오. 메모리 할당을 수행하는 pvPortMalloc()의 5 가지 구현이 있습니다.

당신은 그래서 당신은 1에서 configAPPLICATION_ALLOCATED_HEAP을 설정하고 0x20010000에서 ucHeap을 배치 링커에 말할 수

/* 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 ]; 
#endif /* configAPPLICATION_ALLOCATED_HEAP */ 

를 사용 의 행 heap_X.c 본다.

또 다른 방법은 힙 및 스택 주소를 포함하고 소스를 편집하는 각 장치에 대한 헤더를 작성하는 것입니다. 우리가 다음 변경을 할 수 heap_1.c경우 :

// somewhere in devconfig.h 
#define HEAP_ADDR 0x20010000 

// in heap_1.c 
// remove code related ucHeap 
// 
// remove static uint8_t *pucAlignedHeap = NULL; 
// and paste: 
static uint8_t *pucAlignedHeap = (uint8_t *)HEAP_ADDR; 

뿐만 아니라 heap_2.cheap_4.c 편집 기능 prvHeapInit()하십시오.

vPortDefineHeapRegions()을 포함하는 heap_5.c에주의하십시오.

이제 pvPortMalloc()은 Bank2의 메모리에 대한 포인터를 반환합니다. pvPortMalloc()은 태스크, TCB 및 사용자 변수의 할당 스택에 사용됩니다. 소스를 읽으십시오. 메인 스택의 위치는 장치/아키텍처에 따라 다릅니다. stm32 (ARM)의 경우 벡터 테이블 또는 MSP 레지스터 변경 방법을 참조하십시오.

+0

좋습니다. 감사합니다. 이것은 이미 많은 도움이됩니다. 그러나 링커에게 같은 섹션에 대해 두 뱅크를 사용하도록 지시하는 방법이 없습니까? 이 방법으로 현재의 문제를 해결할 수 있지만 양쪽 은행간에 경계가없는 것처럼 두 은행을 사용하는 방법을 알고 싶습니다. 내 눈에는 이것이 정렬 문제 일뿐입니다. – eeucalyptus

+1

[There] (https://answers.launchpad.net/gcc-arm-embedded/+question/223976)는 섹션과 비슷한 문제입니다. "따라서 특정 오브젝트 파일을 수동으로 배치 할 수 있습니다." –

+0

'.bss2 (무부하) _foo.o_에서 ALIGN (4) {foo.o (. .bss라고 .bss라고 *)}> RAM2' 모두 '.bss' RAM2 데이터에 대한 것이다. 시작시이 메모리를 보통'.bss' 섹션으로 채우십시오. –

관련 문제