IAR 最高优化出问题!请进来讨论下!

zzfei90 2011-10-25 10:39:28
函数如下:
LCD_Display_unum8bit(17, Line5, timerun->Sec%100/10);//刷新秒显示
LCD_Display_unum8bit(18, Line5, timerun->Sec%100%10);
这样个位显示没问题,十位一直是0
把IAR速度优化优先级设置为中就没问题,或者是把两句中间加个1US的延时函数也可以,再或者把第二句改成
LCD_Display_unum8bit(18, Line5, timerun->Sec);
甚至是
LCD_Display_unum8bit(18, Line5, timerun->Sec%100);
都不会出问题,就是不能把"%10"加上,一加上十位就不正常显示(个位仍正常显示),十位一直显示0,仿真的时候看变量值是正确的,就是显示出来不对
我的延时函数不是用那种循环来实现的,关于volatile的问题我已经注意了
有没有哪位遇到过相同问题的 过来讨论下

void LCD_Display_unum8bit(uint8_t Xpos,uint16_t Ypos,uint8_t num8bit)
{
uint8_t Ascii;
uint16_t xaddress;
xaddress=Xpos*8;
if(num8bit>9) num8bit=num8bit%100%10;
Ascii=0x30+num8bit;
LCD_DrawChar(xaddress, Ypos, &Ascii16[Ascii * 16],8);
}

...全文
1082 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-10-30
  • 打赏
  • 举报
回复
优化分速度和大小,你是那一个?
zzfei90 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 schlafenhamster 的回复:]

timerun->Sec%100%10;应该:
timerun->Sec%60%10
[/Quote]
不行

我看过反汇编的代码 就用的寄存器不一样 一个用R6 另一个用的R7 别的没什么区别啊 为什么就不行呢
skylkj 2011-10-29
  • 打赏
  • 举报
回复
优化的问题最好还是反汇编来慢慢找吧。中级和高级各反汇编一次,对比着看哪边有问题

iar是比较奇怪,我之前做个东西,代码超出限制了,我调高了优化等级整个程序就完全不对头了。后来不得已只能改回来,自己精简代码
schlafenhamster 2011-10-29
  • 打赏
  • 举报
回复
timerun->Sec%100%10;应该:
timerun->Sec%60%10
zzfei90 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 skylkj 的回复:]

x%100%10 不就等同于 x%10 吗

直接
LCD_Display_unum8bit(18, Line5, timerun->Sec%10); 试试呢
[/Quote]

加上%100都没问题 就是不能加%10

更重要的是 现在我还在调这个项目 现在把优化级别开到高怎么调都不行了 非得把优化级别开到中。。。
真郁闷啊
zzfei90 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 great_bug 的回复:]

注意运算符优先级---------余数要低于除尘的吧?
LCD_Display_unum8bit(17, Line5, (timerun->Sec%100)/10);//这样试试?
[/Quote]

试过了 该加括号的地方都加了 还是不行。。。
Great_Bug 2011-10-28
  • 打赏
  • 举报
回复
除法------打错字了.
Great_Bug 2011-10-28
  • 打赏
  • 举报
回复
注意运算符优先级---------余数要低于除尘的吧?
LCD_Display_unum8bit(17, Line5, (timerun->Sec%100)/10);//这样试试?
skylkj 2011-10-28
  • 打赏
  • 举报
回复
x%100%10 不就等同于 x%10 吗

直接
LCD_Display_unum8bit(18, Line5, timerun->Sec%10); 试试呢
shupo 2011-10-28
  • 打赏
  • 举报
回复
精神可嘉
AnYidan 2011-10-27
  • 打赏
  • 举报
回复
lz 精神可嘉

优化是 compiler 中最麻烦的部分
lixun00 2011-10-27
  • 打赏
  • 举报
回复
底层硬件驱动编写特别要注意延时的问题。

一般可以参考一下几种方法:

1.延时函数变量用volatile.

2.强制此函数低优化(依赖于编译器)

3.利用定时器

各有优点吧

有时候还要参考汇编代码
lbing7 2011-10-27
  • 打赏
  • 举报
回复
优化后的问题,加入了编译器的因素

已经不完全是程序员能控制的问题,想挑战自己对编译器的了解程度的话,可以多试试

我通常都是编译器不优化

我比较笨。。。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧