嵌入式开发者社区

标题: 发现CCS变量赋值上的一个问题 [打印本页]

作者: lushidegreen    时间: 2016-1-27 14:15
标题: 发现CCS变量赋值上的一个问题
我在使用汉字点阵字库的时候,将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;

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


作者: 希望缄默    时间: 2016-1-27 19:59
这个...... 应该不算是 Bug 吧
我明天测试下看看~




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4