合泰编译器有点坑
我最近在用合泰的单片机调试一个无线模块,收发始终建立不起联系,我一直以为是程序的问题,于是对着数据手册,改了又改,整个人都不好了,后来在一位高手的指点下,发现了合泰的编译器默认是将“代码优化”这个选项勾选了的,我将这个选项去掉,直接就调试成功了,后来查了代码优化的相关资料,结果如下以下是我在百度上找到的资料:
所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。程序代码可以是中间代码(如四元式代码),也可以是目标代码。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码短(运行时间更短、占用空间更小),时空效率优化。原则上,优化可以在编译的各个阶段进行,但最主要的一类是对中间代码进行优化,这类优化不依赖于具体的计算机,在不改变程序运行效果的前提下,对被编译的程序进行等价变换,使之能生成更加高效的目标代码。
我个人的理解是:如果现将PA1设置为高电平,之后再将PA1设置为低电平,这样就出现了一个下降沿,若在代码优化的概念里面,直接会呈现出PA1为低电平,将之前的步骤“优化”掉了,这对于设计硬件的程序简直是致命的。
以上都是一些个人理解,有错误的地方还希望指正‘
不知道使用合泰单片机的朋友们有没有遇到过类似的问题,听说在嵌入式这个问题是很关键的,如果有了解的朋友们讲解一下吧,不胜感激{:smile:}
二零一五年 五月二十七日夜 不一定是编译器的Bug
很有可能是头文件中对PA1的定义不够严谨。如果定义没有加上volatile修饰符,那么编译器是没错的。如果已经加了这个,那就是编译器的Bug 现在越来越不喜欢用合泰的片子了。用的话,建议用Hi-Tech for Holtek这个编译器,效率比合泰自家的强 我用过义隆的C编译器,刚开始也是有问题,后来对比了生成的汇编,发现了他的C编译器,有类似你说的状况,运算的结果都没问题,但是过程中对于I/O的存取,他的方法有BUG,还好有人告诉你取消勾选优化,我这个就没得选择,只能自己回避,呼叫I/O汇编. 建议所有的全局变量都要加上volatile修饰符,局部变量也建议加上,我仿真测试过有些函数局部变量没加volatile也是会被优化掉的,
中断里用到的全局变量更是要加上volatile修饰符,不然这个变量牙根儿就不会在中断里执行。 怎么听着像volatile 的现象? 会优化的C才好用,volatile这个词多敲几次就记住了 确实有点坑! 同感现在公司做的东西用合泰海尔的 这两个都是用官方提供的ide 所以现在感觉用 新的ide 要先研究研究它的编译器{:lol:} 你试试2L说的, 如果加上volatile,还不好用,才是编译器的问题。
我记得Keil51,里是用SFR来定义寄存器,keil优化时,不会对寄存器的表达式进行优化,这一点也算是人性化了。
而IAR中,是没有SFR的,定义寄存器时,都是加了volatile wicy001 发表于 2015-5-28 08:57
你试试2L说的, 如果加上volatile,还不好用,才是编译器的问题。
我记得Keil51,里是用SFR来定义寄存器, ...
学习了{:smile:} 使用合泰自家的編譯器的時候,在窗口上面有個 說明 ,
下拉有幾個文檔,裡面有很多關於編譯器下編寫程序的注意事項。
看過一遍再寫就不會出現這種問題了。
文檔裡面都有提到這些事項。 先怀疑是自己的问题,再顺着摸索,能学到很多东西…… 可以把具体代码贴上来看看,或者自己对比汇编分析 自己捣弄着玩吗 给老板打工还有时间纠结这些吗?{:shutup:} ijlc1314 发表于 2015-5-28 01:09
现在越来越不喜欢用合泰的片子了。用的话,建议用Hi-Tech for Holtek这个编译器,效率比合泰自家的强 ...
Hi-Tech for Holtek值得拥有 mathison 发表于 2015-9-19 10:07
Hi-Tech for Holtek值得拥有
虽然是好多年前的产品了,但是依然那么优秀
页:
[1]