如何将常量映射到指定的flash(ROM)空间
自己在cc2541上利用flash的最后两个页实现存储管理,想利用指定地址的常量定义,通过常量直接访问(读取)flash里存储的数据。
在.xcl 文件里定义了代码段“DATA_SAVE_BLOCK1”“DATA_SAVE_BLOCK1”
#if 1 #pragma location="DATA_SAVE_BLOCK1" __no_init uint8 _dsBuf1[DATA_SAVE_BLOCK1_SIZE]; #pragma required=_dsBuf1 #pragma location="DATA_SAVE_BLOCK2" __no_init uint8 _dsBuf2[DATA_SAVE_BLOCK2_SIZE]; #pragma required=_dsBuf2 #endif
目前只能用定义常量指针指向0x8000到0xffff的地址空间,然后通过修改MEMCTR寄存器手动切换bank映射,这样做有点麻烦,而且影响正常定义的常量访问
如果直接使用_dsBuf1就会像下面这样
void test_location(void) { int a=_dsBuf1[0]; a=a; }
会出现下面的错误
Error[e18]: Range error,
Number out of range
File: D:\BLE-CC254x-1.4.0_uart2ble-7\Projects\ble\BLE_Bridge\Source\flash_save.c, Line: 896
Source: MOV DPTR,#_dsBuf1 + 1
Where $ = test_location + 0x5 [0x2BDB2]
in module "flash_save" (D:\BLE-CC254x-1.4.0_uart2ble-7\Projects\ble\BLE_Bridge\CC2541DB\CC2541-UART\Obj\
flash_save.r51),
offset 0x5 in segment part 74, segment BANKED_CODE
What: (_dsBuf1 + 1) [0x6F011]
Allowed range: 0xFFFF3000 - 0xFFFF
Operand: _dsBuf1 [0x6f011]
in module flash_save (D:\BLE-CC254x-1.4.0_uart2ble-7\Projects\ble\BLE_Bridge\CC2541DB\CC2541-UART\Obj\
flash_save.r51),
Offset 0x1 in segment part 11, segment DATA_SAVE_BLOCK1
所以能否实现定义常量访问指定的flash空间而不需要手动修改MEMCTR寄存器来手动切换bank映射
xin,
你可以参考stack工程里面的OSAL->osal_snv_wrapper.c里面SNV是如何操作Flash的。
希望有帮助。
SNV里调用HalFlashRead()函数,也是要操作MEMCTR寄存器,难道没有更好的办法了?
如果用const声明一个普通的常量,这个常量会保存在flash的什么位置
如果再程序的不同地方引用这个常量(跨越多个Bank),这时编译器是如何处理的,(难道每个Bank都有一个常量的副本吗?)
编译选项用ROM maped as data
分页切换是必须的!
可以参考下边的:
#define CBYTE ((unsigned char volatile code *) 0)
#define CWORD ((unsigned int volatile code *) 0)
我是想这个切换能不能由编译器去处理,一般的常量地址也是在0x8000到0xffff的空间里,手动切换这段时间里的中断函数和子函数调用没处理好就会出问题,把const放ram里空间又不够。而且程序超过BANK0的时候BANK切换也是由编译器处理的吧
手动吧,增加一个get/set函数