微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 如何将常量映射到指定的flash(ROM)空间

如何将常量映射到指定的flash(ROM)空间

时间:10-02 整理:3721RD 点击:

自己在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函数

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top