发现CCS变量赋值上的一个问题 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2522|回复: 1
打印 上一主题 下一主题

发现CCS变量赋值上的一个问题

[复制链接]

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
跳转到指定楼层
楼主
发表于 2016-1-27 14:15:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用汉字点阵字库的时候,将16*16的点阵字库数据写到SPI FLASH中。然后通过区位码计算汉字的存储位置,再从SPI FLASH读取32字节的点阵数据显示到LCD上。


在计算的时候,有如下语句:
gbkh = buf[i++];
gbkl = buf;

其中,gbkh,gbkl是uint32_t型数据,buf[ ]是char型数组。
当buf[x]最高位为1时,赋值后,gbkh 的bit31~bit8会全部被置1。
例如:当i=0,buf[0] = BB, buf[1] = D4时,(注:0xBBD4是汉字“辉”的区位码)
gbkh = buf[i++];
gbkl = buf;

执行的结果是
gbkh = 0xFFFFFFBB;
gbkl = 0xFFFFFFD4;

程序后面使用者两个值来计算“辉”字在SPI FLASH中的存储位置时,就会出错。


同样的调节和语句,在MDK环境下编译时,
gbkh = buf[i++];
gbkl = buf;

执行的结果是
gbkh = 0x000000BB;
gbkl = 0x000000D4;


因此,这可能是CCS的编译器的一个bug:
在uint32_t和char之间的赋值运算时,没有将char直接转换成uint32_t型数据,而是先将char型转换成int32_t型,然后再转换成uint32_t。


在程序中,我在
gbkh = buf[i++];
gbkl = buf;

后面增加了两句
gbkh &= 0x000000FF;
gbkl &= 0x000000FF;

解决了字库点阵存储位置的计算错误。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2016-1-27 19:59:58 | 只看该作者
这个...... 应该不算是 Bug 吧
我明天测试下看看~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-3 02:22 , Processed in 0.034900 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表