[开发工具]

求证, ChipON---IDE编译器 不支持 unsigned 加减法?

[复制链接]
2439|23
手机看帖
扫描二维码
随时随地手机跟帖
laoxu|  楼主 | 2016-6-25 16:27 | 显示全部楼层 |阅读模式
编写了一段应用程序,编译出错,查了老半天,发现 ChipON---IDE编译器 不支持 unsigned 加减法?
unsigned int  a, b, c;
// 先对 a, b 赋值
c = a + b;     
c = a - b;   

没法编译!!!



顺便测试了一下:
unsigned long  a, b, c;
// 先对 a, b 赋值
c = a + b;     
c = a - b;   

同样没法编译!!!




laoxu|  楼主 | 2016-6-25 16:30 | 显示全部楼层
顺便再测试了一下, unsigned int  , unsigned long 类型的 乘法,除法,取模 都 没法编译,出错。

使用特权

评论回复
laoxu|  楼主 | 2016-6-25 17:28 | 显示全部楼层
回家里,经测试,编译一次性全部通过,什么问题都没有,真搞不懂~~~

ChipON IDE 编译器 版本 都是 V2.4.10, 最新版。

星期一上班,将厂里电脑 重装 一下  ChipON IDE 编译器,再测试。

使用特权

评论回复
laoxu|  楼主 | 2016-6-25 18:23 | 显示全部楼层
测试了一下 浮点数,单一的 浮点加,减,乘,除 能编译,多写几句就出错了,编译通不过。

测试程序如下:
   float Fa,Fb,Fc,Fd;

   Fa = (float)((int)P0 << 2);
   Fb = Fa + Fa;
   Fc = Fa * Fa;
   Fd = Fb - Fc;

   P1 =(char)Fd;






使用特权

评论回复
laoxu|  楼主 | 2016-6-25 19:57 | 显示全部楼层
问题查出来了,连接 时,程序长度超出(苦于没提示,查了半天)。

改个ROM大一点的,即可编译,浮点 加减乘除 各一次,外加 数制转换,共用去 3.7K ROM容量。

这浮点运算的代码质量太差了,只能玩玩了~~~

使用特权

评论回复
laoxu|  楼主 | 2016-6-25 20:35 | 显示全部楼层
反复看了几遍反汇编代码,很多地方在做无用功,俺估计了一下,优化后,代码长度起码能缩短一半。

使用特权

评论回复
yangwenguan| | 2016-6-26 15:19 | 显示全部楼层
一笑而过,

使用特权

评论回复
Jim12345| | 2016-6-26 17:07 | 显示全部楼层
小容量确实浮点耗空间,使用时需要注意。

当前发布的MCU不擅长于计算(系统结构和编译器都没做这方面的优化,不过后续可以适当做一些优化,但总体来说计算不是8位的擅长),更加擅长于控制的目的。

使用特权

评论回复
Jim12345| | 2016-6-26 17:08 | 显示全部楼层
个人认为,当前的MCU状态下,需要计算或速度一般来说上32位,32位在大尺寸计算上有天生的优势。

使用特权

评论回复
laoxu|  楼主 | 2016-6-27 07:50 | 显示全部楼层
Jim12345 发表于 2016-6-26 17:07
小容量确实浮点耗空间,使用时需要注意。

当前发布的MCU不擅长于计算(系统结构和编译器都没做这方面的优 ...

浮点是后来测试的,一开始是发现 无符号数运算不支持,现重装 ChipON---IDE后,问题解决。

使用特权

评论回复
laoxu|  楼主 | 2016-6-27 07:54 | 显示全部楼层
还有一个问题,昨天发现的,用汇编写的, 编译成 O文件,在 C中 link ,发现 ASM 中定义的变量,在 C中无法引用。

使用特权

评论回复
jianzhengg| | 2016-6-27 10:31 | 显示全部楼层
这个肯定是可以的,你下次能不能把具体代码拿出来。出错信息拿出来,这样没法给你解释。。。

使用特权

评论回复
jianzhengg| | 2016-6-27 10:35 | 显示全部楼层
laoxu 发表于 2016-6-27 07:54
还有一个问题,昨天发现的,用汇编写的, 编译成 O文件,在 C中 link ,发现 ASM 中定义的变量,在 C中无法 ...

第一,你得确定连接上了没有,修改连接选项没有
第二,确认符号,汇编符号需要在前面加一个下划线,c中main对应汇编符号_main
第三,确认汇编符号被声明为全局符号没有,需要global声明,.global _main
第四,C中声明没有,在C中需要声明对应的符号,然后才能使用,void main();

使用特权

评论回复
laoxu|  楼主 | 2016-6-27 12:38 | 显示全部楼层
jianzhengg 发表于 2016-6-27 10:35
第一,你得确定连接上了没有,修改连接选项没有
第二,确认符号,汇编符号需要在前面加一个下划线,c中ma ...

这些都加了, C 和 ASM(编译成 O文件),之间的调用( 函数 和 变量),函数 两者之间 互相调用 正常,变量 只能 C 中定义,ASM中调用正常,反之,变量 在 ASM 中定义,C中无法调用,编译时显示变量没定义错误。

加下划线 和 不加 下划线 都试过,确实不能用。

使用特权

评论回复
laoxu|  楼主 | 2016-6-27 12:43 | 显示全部楼层
ASM 中定义:

    .global  ABC123
    .global  _ABC456
ABCDEF  .udata
ABC123          .res  1
_ABC456          .res  1

使用特权

评论回复
laoxu|  楼主 | 2016-6-27 12:57 | 显示全部楼层
对变量加与减 下划线 轮个测试,当测试
extern char  ABC456;

//主函数
void main()
{  ABC456 = P1;
}

编译通过了,谢谢。

使用特权

评论回复
123654789| | 2016-6-28 14:39 | 显示全部楼层
为什么laoxu你这样有空研究这些啊。

使用特权

评论回复
sdwys| | 2016-7-2 14:49 | 显示全部楼层
一个新产品的完善总要有人去推动,翻着看了一下帖子,感觉此单片机还需要完善。

使用特权

评论回复
Jim12345| | 2016-7-3 08:13 | 显示全部楼层
sdwys 发表于 2016-7-2 14:49
一个新产品的完善总要有人去推动,翻着看了一下帖子,感觉此单片机还需要完善。 ...

针对具体的问题的方式比较好。

使用特权

评论回复
laoxu|  楼主 | 2016-7-4 11:02 | 显示全部楼层
123654789 发表于 2016-6-28 14:39
为什么laoxu你这样有空研究这些啊。

对其内核构架比较喜欢,业余爱好罢了~~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:猜猜俺是谁的马夹?

146

主题

2274

帖子

221

粉丝