打印
[技术讨论]

遇到一个非常奇怪的while循环问题

[复制链接]
286|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
showmyself|  楼主 | 2023-5-11 12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,

有如下程序,

unsigned char  get_the_step=0; //记录循环次数
unsigned char  start_the_bl=0;
unsigned char  daojishi_display_cnt=5; //开机倒计时变量,在中断中自减
void show_the_daojishi();  //倒计时显示
void Display_Write_OneData_with_Addr(unsigned char weima, unsigned char duanma); //数码管显示函数
unsigned char  table_duanma[10]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f};  //段码0~9
void read_data_from_EEPROM();  //读取EEPROM中保存的值
void main_task_run();  //主任务

int main(void)
{
     read_data_from_EEPROM(); //如果注释掉这个函数,倒计时显示不正常
     show_the_daojishi(); //5s倒计时显示
     start_the_bl=1;

    while(1)
    {
          main_task_run();  //主任务运行
    }
}


void show_the_daojishi()
{
     while(daojishi_display_cnt !=0) //初值为5,在中断中自减到0退出循环
     {
          get_the_step++;
          Display_Write_OneData_with_Addr(1, table_duanma[daojishi_display_cnt]); //显示倒计时
     }
}


//中断服务程序,1s进一次中断
void TIM3_IRQHandler(void)
{
   if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);

        if(daojishi_display_cnt !=0)
        {
             daojishi_display_cnt--;
        }
}

问题是:
1,我把 read_data_from_EEPROM();这个函数注释掉,show_the_daojishi();这个显示开机倒计时的函数就变卡死了。
而read_data_from_EEPROM();这个函数只是从外部EEPROM读取保存的数据,和show_the_daojishi();没有任何关联,我不知道怎么就影响了?

2,我把read_data_from_EEPROM();注释掉,专门来调试show_the_daojishi();这个函数,试图知道为什么显示不正常的原因。
显示不正常的主要现象是,数码管数显示停留在了4,然后就一直卡死在4这个数字不动。
我用调试器仿真了一下,发现daojishi_display_cnt这个变量在中断中是正常自减的,最后也减到了0,然后停在0,但是show_the_daojishi();中的while循环并没有退出循环,实际此时daojishi_display_cnt已经是0了,但是显示上卡死在4一直不动,我加了一个变量get_the_step,仿真了下,发现get_the_step最终为1,说明循环只跑了一次就停了。start_the_bl这个变量的值也一直是0,说明根本没往下跑,是卡死在while循环中,而且这个循环只跑了一次。

但daojishi_display_cnt明明已经减到0了呀,说明中断是没问题的,那么为什么while没有退出循环,而且值循环了一次就卡死了呢?

虽然写的程序也比较多了,但有时会遇到莫名其妙的问题,搞了好多天都没找到原因。可能是个很简单的问题,但是所谓当局者迷,旁观者清,我入局太深也许看不到,希望各位大神帮我分析分析,不胜感激!

使用特权

评论回复

相关帖子

沙发
yaosongjin2018| | 2023-5-12 17:44 | 只看该作者
有问题的函数不贴出来,让大家去猜迷吗

使用特权

评论回复
板凳
qiangtech| | 2023-5-12 17:57 | 只看该作者
这是因为你的daojishi_display_cnt--是在TIMER中断中操作的,而在主程序中去WHILE比较它。你需要在unsigned char  daojishi_display_cnt=5;前面加volatile关键字。  volatile unsigned char  daojishi_display_cnt=5;   

使用特权

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

本版积分规则

48

主题

117

帖子

1

粉丝