标题: 遇到一个非常奇怪的C语言while循环问题 [打印本页]

作者: hxdby    时间: 2023-5-11 12:26
标题: 遇到一个非常奇怪的C语言while循环问题
大家好

问题是:
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没有退出循环,而且值循环了一次就卡死了呢?

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

有如下C语言程序:

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--;
        }
}

作者: zywng2153    时间: 2023-5-11 13:21
程序在主循环外边,跑一次是对的
作者: hxdby    时间: 2023-5-11 13:31
zywng2153 发表于 2023-5-11 13:21
程序在主循环外边,跑一次是对的

不至于吧,我这个循环是有条件的,中断中计时5s才会减到0,不至于跑一遍阿
作者: yzwzfyz    时间: 2023-5-11 14:41
解决此类问题建议:
1、画出程序流程图
2、从逻辑上走通流程图。
对照出现的问题,是否还能走通。
难免会深入到某【函数】内部,但【函数】是借来的,不是自己写的。就需要进入研究,如此才能将流程图完善、完整、流通。
这样所有的问题就通了。
作者: qsssuv    时间: 2023-5-11 16:20
daojishi_display_cnt要声明成vu8,避免编译器优化
作者: wulin    时间: 2023-5-11 16:35
在编译器里走单步看看




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1