DSP调试中遇到一个奇怪的问题,把程序放到FLASH运行,同时把部分函数拷贝到RAM运行时,出现地址不对齐问题。
有一段代码:
float Ki;
//定义一个数组,存放传过来的浮点数
unsigned int Ki_Addr[2];
Ki = *(float*)Ki_Addr;//按照浮点数格式取数据
其中Ki_Addr[2]是通过上位机发送过来的浮点数,存放在4个字节的数组中。然后把该数据取出来赋值给Ki,在RAM里运行一切正常,但FLASH里运行出现取数据错误和数据丢失问题。
举例:
假设上位机传过来的是浮点数0.3,其定点数格式为
Ki_Addr[] = 0X3E999999
(浮点定点数在线转换网址https://lostphp.com/hexconvert/)
正常来说,Ki可以被强制转换为浮点数0.3,但现在Ki_Addr的值正确,为0x3e999999,但ki取该地址的数据结果为
看到了吧,高2位0x3E变成了低2位0x99,而低2位则直接变成了0,出现地址不对齐和数据丢失。
解决方法
目前原因还未找到,但已经找到解决方案。
只需要把Ki_Addr也拷贝到RAM中即可。
具体步骤参考论坛:
http://bbs.eeworld.com.cn/thread-509979-1-1.html
为防止失效copy了一下
#pragma DATA_SECTION ( symbol , " section name " );
对应的使用例子为:
#pragma DATA_SECTION(bufferB, “my_sect”)
char bufferA[512];
char bufferB[512];
而其中的 my_sect是在对应工程的cmd文件中进行指定的,你可以在cmd文件的
MEMORY
{
RAM1: o = 200h, l = 10h
…
}
中专门指定出一块RAM用来存放你的变量,此段RAM的起始地址直接定成你想要给变量分配的固定地址,再给它自己起个名字RAM1,自己可以定。其中o后为起始地址,l为长度。
而后在
SECTIONS
{
…
my_sect > RAM1
}
中指定my_sect存在RAM1中即可。
这样symbol就可以放在固定的地址了。
操作步骤
实际上我只在28335.cmd的 SECTIONS部分
SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHB PAGE = 0
.pinit : > FLASHB, PAGE = 0
.text : > FLASHB PAGE = 0
codestart : > BEGIN PAGE = 0
ramfuncs : > FLASHB PAGE = 0
csmpasswds