将部分拆分为多个内存区域

时间:2016-08-17 11:30:14

标签: c ld cortex-m

我正在ARM Cortex-M微控制器上开发一个应用程序,它有两个RAM库(64kB)。第一个银行紧跟在内存映射中的第二个银行。

目前,内存库在我的链接描述文件中分为两个区域。第一个区域包含.bss.data部分。第二个库用于.heap.stack,每个只占1kB(我在FreeRTOS中使用不同的堆栈,它也管理它自己的堆)。

我的问题是,.bss对于第一家银行来说太大了。因此,我想把它的一些内容转移到第二家银行。

实现此目的的一种方法是创建一个新部分,让我们称之为.secondbss,该部分链接到第二个银行。然后可以使用__attribute__((section(".secondbss")))将单个变量添加到此部分。

我没有使用此解决方案的原因是

  • 我真的想保持源代码的可移植性

  • 可能有很多变量需要这个属性,我不想为每个变量选择部分

有更好的解决方案吗?我已经把这两个记忆都想象成一个区域,但我不知道如何防止链接器在两个边界之间的边界上错位数据。

如何在不使用__attribute__标志的情况下解决问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

例如,您在0x200000000x20010000有2家银行。您希望将Bank2用于堆和(主)堆栈。由于 FreeRTOSConfig.h 中的.bss,我认为您有configTOTAL_HEAP_SIZE。现在查看 FreeRTOS / Source / portable / MemMang / 中的堆源代码。 pvPortMalloc()有5个实现内存分配的实现。

查看您使用的 heap_X.c 中的行

/* 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 */

因此,您可以将configAPPLICATION_ALLOCATED_HEAP设置为1,并告诉您链接器将ucHeap放在0x20010000

另一种方法是为每个设备编写包含堆和堆栈地址以及编辑源的地址。 对于 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.c heap_4.c 编辑函数prvHeapInit()

注意包含vPortDefineHeapRegions() heap_5.c

现在pvPortMalloc()将返回指向Bank2内存的指针。 pvPortMalloc()用于分配任务堆栈,TCB和用户可变量。阅读来源。主堆栈的位置取决于您的设备/架构。对于stm32(ARM),请参见向量表或如何更改MSP寄存器。