DSP程序在FLASH运行时变量地址不对齐问题解决方法

本文介绍了在DSP程序运行于FLASH时遇到的变量地址不对齐问题,表现为数据错误和丢失。作者发现将变量Ki_Addr拷贝到RAM中能解决问题,并详细提供了实现步骤,包括使用#pragma DATA_SECTION在CMD文件中定义内存段和在主程序中进行变量初始化。该方法适用于TI DSP 28335等芯片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值