各位好:
我使用的开发环境是 IAR for 8051 8.30.3 , 在调试 CC2530F256 如下代码的时候,观察到的反汇编指令如图:
// DI 定义为 P1_1
右边汇编代码显示,一个左移位指令,和赋值语句, 用了这么多条指令,而且调试结果显示 DI = CY 这个赋值不成功(CY=1,但是赋值之后DI=0)
但是我使用 IAR for 8.10 重新测试这段代码发现,如下图, 明显效果比较好。 测试的时候 优化等级都为None。
请问,这是什么问题,有解决的办法吗?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
你好,谢谢回复。
1. C语言处理 cmd<<=1 与 cmd = cmd<<1是一样的,重新编译结果显示汇编代码一样。
2. 两个版本的优化等级一样
楼主,我用最新版生成的代码是
EW8051-9103-Autorun版本。最新的,今天刚刚去IAR下载的。
---------------------------------------------------------------------------------------------------代码如下----------------------------------------------------------
cmd<<=1; //先发高
\ 000012 EE MOV A,R6
\ 000013 C3 CLR C
\ 000014 33 RLC A
\ 000015 FE MOV R6,A
112 DI=CY; //取最高位
\ 000016 A2D7 MOV C,0xd0.7
\ 000018 E4 CLR A
\ 000019 33 RLC A
\ 00001A F8 MOV R0,A
\ 00001B A2D7 MOV C,0xd0.7
\ 00001D 9291 MOV 0x90.1,C
113 asm("NOP");
\ 00001F 00 NOP
114 DCKI=1; //时钟下降沿,数据被传输
\ 000020 D290 SETB 0x90.0
115 cmd=cmd<<1; //先发高位
\ 000022 EE MOV A,R6
\ 000023 C3 CLR C
\ 000024 33 RLC A
\ 000025 FE MOV R6,A
116 DI=CY; //取最高位
---------------------------------------------------------------------------------------------------------
对比内容,没有问题,估计是你那个版本的故障,或者bug,你去下载最新版试试看。9.103
补充一下,我把那个优化等级调整后,发现生成的代码不同。好神奇啊
我用了 9.10.2 效果还是那样,你用的是9.10.3 是正版呢还是 评估版?
我在官网下载的,然后注册了个序列号,是限制代码大小的序列号,你也可以注册个30天限制的。
我用的是 9.10.2 版本,用到时30天试用,我待会安装最新版试试看
hi, 我最后使用和你一样的最新版本的size 限制版本,但是结果还是和之前一模一样,请问你有配置什么吗? 而且你的那句 DI=CY; 的反汇编代码也是冗余。
我用的默认配置,是不是你修改配置导致的啊?DI=CY ;这句,估计跟头文件有关吧,我看编译后的名称都不同。我觉得不应该纠结这个,你这样完全是考察编译过程呢,只要编译后执行的结果达到我们的预期就行了。
我用的是默认配置,执行结果确实不正确,这是最致命的,你有观察断点处引脚的输出是正确的吗?
正确啊,我以前用CC2530开发产品的时候就没注意过这些编译细节,不过也没发现代码执行后出现跟我想法有出入的啊。比如你用Z-Stack开发,你还去考虑怎么编译成汇编吗?这个是不可能实现的。
我测试的结果真的是错误的,CY赋值给DI (DI定义为: #define DI P1_1),但是 在CY=1时,赋值给 DI之后,DI是0;
另外我咨询过 IAR的技术支持,他建议我用旧版。