本帖最后由 aple0807 于 2021-2-4 14:50 编辑
系统需要大量二值状态时,使用位带区可以大大节省内存空间,这两天研究了下IAR中 AT32F407位带的用法。
SRAM : 起始地址0x20000000, 位带映射起始地址0x22000000。
使用前1KB作为位带区控制,配置如下。
SRAM起始配置为 0x20000400。增加位带空间section 0x22000000-8*4KB(乘4是因为每bit在位带区占用4字节地址空间)。
位带区使用 at section的方式创建变量,并必须使用32bit变量。
IAR ICF文件修改:
原内存定义-编译器给非位带区变量分配内存使用
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF;
改为
define symbol __ICFEDIT_region_RAM_start__ = 0x20000400;
define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF;
/*-新增RAM区定义-8K bits*/
define symbol __ICFEDIT_region_BITRAM_start__ = 0x22000000; /* addr start */
define symbol __ICFEDIT_region_BITRAM_end__ = 0x22007FFF; /* 1kB * 8 * 4 */
define region BitRAM_region = mem:[from __ICFEDIT_region_BITRAM_start__ to __ICFEDIT_region_BITRAM_end__];
place in BitRAM_region { section .bit_section };
//头文件增加定义
#define OBJ_BIT @ ".bit_section"
//变量定义,注意 位带区变量必须为32bit整数
__root long bitset[256] OBJ_BIT;
__root long bitset2[256] OBJ_BIT;
__root long bitset3[256] OBJ_BIT;
__root long bitset4[256] OBJ_BIT;
这样编译后,上面的变量就分配在了bitband区,如下所示。
|