CC2530 常量计算出问题
时间:10-02
整理:3721RD
点击:
大家好:
最近在做CC2530裸机开发,没有涉及协议栈,只是当做普通的射频芯片来用,但是配置文件(xcl后缀的文件)用的是TI 的配置文件,这些配置文件主要是一些Flash空间的分配,另外工程的配置和TI的TI_MAC协议栈配置是一样的,现在发现一个很诡异的问题:
比如:
void a(uint32 x)
{
uint32 b = 1;
b += x*(uint32)3000;
}
当调用这个函数 a(1)的时候,计算值正确的情况应该是3001,但是CC2530计算的却是一个很大的数,明显的是计算溢出……这种情况怎么会溢出呢?
但是在TI的官方协议栈里面却又是正常的…… 详细对比了两个工程的配置,没什么区别……
希望遇到这样问题的朋友能给个解决方法!
但是如果修改下图黄色区域中的配置后(把ROM mapped as data 选项改成RAM memory),就又能计算正确……(TI的配置是ROM mapped as data)
最近在做CC2530裸机开发,没有涉及协议栈,只是当做普通的射频芯片来用,但是配置文件(xcl后缀的文件)用的是TI 的配置文件,这些配置文件主要是一些Flash空间的分配,另外工程的配置和TI的TI_MAC协议栈配置是一样的,现在发现一个很诡异的问题:
比如:
void a(uint32 x)
{
uint32 b = 1;
b += x*(uint32)3000;
}
当调用这个函数 a(1)的时候,计算值正确的情况应该是3001,但是CC2530计算的却是一个很大的数,明显的是计算溢出……这种情况怎么会溢出呢?
但是在TI的官方协议栈里面却又是正常的…… 详细对比了两个工程的配置,没什么区别……
希望遇到这样问题的朋友能给个解决方法!
但是如果修改下图黄色区域中的配置后(把ROM mapped as data 选项改成RAM memory),就又能计算正确……(TI的配置是ROM mapped as data)
上面选项的含义是常量和什么的位置,两种选择仅仅是一个在ROM另外一个在RAM中
8051 core的东西总是这么麻烦
你尝试写一个测试程序看看吧
uint32 MUL_CONST = 3000;
void a(uint32 x)
{
uint32 b = 1;
b += x*(uint32)MUL_CONST;
}
用变量操作可以正确,用我那种方法不能正常计算……
用变量操作可以正确,用我那种方法不能正常计算……
那个选项啊,
上面选项的含义是常量和什么的位置,两种选择仅仅是一个在ROM另外一个在RAM中
不要纠结别人的project怎么样
慢慢来,是什么原理就是什么原理,问题能定位,知道原因就好了
官方的project很有学问,得慢慢来,当然8051 core也蛮特别的,如果你之前玩别的core的话
总感觉哪里不对劲,还不知道后面等工程功能扩增了还会遇到什么莫名其妙的问题,都不敢再继续了……很想知道为什么会这样啊!因为我看TI 用的rom空间是flash映射过去的,如果我现在把变量和常量都存在ram里面,不知道我以后做串口升级或者程序数据处理多了会不会影响我的程序稳定性。
两个工程的差异仅仅是那个常量位置的选项吗,这个你又不能肯定,怎么说呢
不好继续讨论了
很明显,我已经告诉你测试方法了,定义一个变量自然不会出现你说的错误了,因为避开了常量,
如果你想搞清楚为什么这样,只好再找两个工程的差异了
我手边上没有这种环境,仅仅是理论分析,需要提供一些信息才好
有空把我的工程完全拷到官方里面试试,看看效果会如何