QAQwawa 2022-03-12 15:51 采纳率: 66.7%
浏览 15
已结题

为什么把常数换成了a,周期就翻了四倍呀

问题遇到的现象和发生背景
void T0_Init()
{
    TMOD=0x01;
    TH0=(65536-50/1.09)/256;      
    TL0=(65536-50/1.09);
    TR0=1;    //启动定时器0
    ET0=1;    //打开中断
}

void T0_Int()interrupt 1     //1是定时器0的序号
{
    static int cnt,scanf_cnt1;           //staic 可使cnt scanf_cnt都作为一个全局变量可以保存它被修改以后的值
    char a;        
    a=45;
    scanf_cnt1=(10*a+500)/70;
    TH0=(65536-50/1.09)/256;    //定时50    us     11/1.09~10    TH0=(65536-10/1.09)/256;
    TL0=(65536-50/1.09);

    cnt++;
    if(cnt>270)           //270次大约达到20ms
        cnt=0;
    if(cnt<scanf_cnt1) //通过改变scanf_cnt的值来改变占空比,高电平的时间
        led1=1;
    else 
        led1=0;
}

只有这里有a;第一次我是写scanf_cnt=(1045+500)/70;
测出来的周期是20ms
后来我想让scanf_cnt变成可控的,就写成scanf_cnt1=(10
a+500)/70;
但是测出来的周期是80ms,我弄不明白

  • 写回答

1条回答 默认 最新

  • _GX_ 2022-03-12 17:28
    关注

    这因为编译器在编译阶段直接计算出常量表达式(10*45+500)/70的结果。如果你写成(10*a+500)/70,这不是常量表达式,编译器需要生成代码计算一次乘法,一次加法和一次除法才能得到结果,所以时间周期就长了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 创建了问题 3月12日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)