標(biāo)題: 遇到一個(gè)非常奇怪的C語言while循環(huán)問題 [打印本頁]

作者: hxdby    時(shí)間: 2023-5-11 12:26
標(biāo)題: 遇到一個(gè)非常奇怪的C語言while循環(huán)問題
大家好

問題是:
1,我把 read_data_from_EEPROM();這個(gè)函數(shù)注釋掉,show_the_daojishi();這個(gè)顯示開機(jī)倒計(jì)時(shí)的函數(shù)就變卡死了。
而read_data_from_EEPROM();這個(gè)函數(shù)只是從外部EEPROM讀取保存的數(shù)據(jù),和show_the_daojishi();沒有任何關(guān)聯(lián),我不知道怎么就影響了?

2,我把read_data_from_EEPROM();注釋掉,專門來調(diào)試show_the_daojishi();這個(gè)函數(shù),試圖知道為什么顯示不正常的原因。
顯示不正常的主要現(xiàn)象是,數(shù)碼管數(shù)顯示停留在了4,然后就一直卡死在4這個(gè)數(shù)字不動。
我用調(diào)試器仿真了一下,發(fā)現(xiàn)daojishi_display_cnt這個(gè)變量在中斷中是正常自減的,最后也減到了0,然后停在0,但是show_the_daojishi();中的while循環(huán)并沒有退出循環(huán),實(shí)際此時(shí)daojishi_display_cnt已經(jīng)是0了,但是顯示上卡死在4一直不動,我加了一個(gè)變量get_the_step,仿真了下,發(fā)現(xiàn)get_the_step最終為1,說明循環(huán)只跑了一次就停了。start_the_bl這個(gè)變量的值也一直是0,說明根本沒往下跑,是卡死在while循環(huán)中,而且這個(gè)循環(huán)只跑了一次。

但daojishi_display_cnt明明已經(jīng)減到0了呀,說明中斷是沒問題的,那么為什么while沒有退出循環(huán),而且值循環(huán)了一次就卡死了呢?

雖然寫的程序也比較多了,但有時(shí)會遇到莫名其妙的問題,搞了好多天都沒找到原因。可能是個(gè)很簡單的問題,但是所謂當(dāng)局者迷,旁觀者清,我入局太深也許看不到,希望各位大神幫我分析分析,不勝感激!

有如下C語言程序:

unsigned char  get_the_step=0; //記錄循環(huán)次數(shù)
unsigned char  start_the_bl=0;
unsigned char  daojishi_display_cnt=5; //開機(jī)倒計(jì)時(shí)變量,在中斷中自減
void show_the_daojishi();  //倒計(jì)時(shí)顯示
void Display_Write_OneData_with_Addr(unsigned char weima, unsigned char duanma); //數(shù)碼管顯示函數(shù)
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();  //主任務(wù)

int main(void)
{
     read_data_from_EEPROM(); //如果注釋掉這個(gè)函數(shù),倒計(jì)時(shí)顯示不正常
     show_the_daojishi(); //5s倒計(jì)時(shí)顯示
     start_the_bl=1;

    while(1)
    {
          main_task_run();  //主任務(wù)運(yùn)行
    }
}


void show_the_daojishi()
{
     while(daojishi_display_cnt !=0) //初值為5,在中斷中自減到0退出循環(huán)
     {
          get_the_step++;
          Display_Write_OneData_with_Addr(1, table_duanma[daojishi_display_cnt]); //顯示倒計(jì)時(shí)
     }
}


//中斷服務(wù)程序,1s進(jìn)一次中斷
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    時(shí)間: 2023-5-11 13:21
程序在主循環(huán)外邊,跑一次是對的
作者: hxdby    時(shí)間: 2023-5-11 13:31
zywng2153 發(fā)表于 2023-5-11 13:21
程序在主循環(huán)外邊,跑一次是對的

不至于吧,我這個(gè)循環(huán)是有條件的,中斷中計(jì)時(shí)5s才會減到0,不至于跑一遍阿
作者: yzwzfyz    時(shí)間: 2023-5-11 14:41
解決此類問題建議:
1、畫出程序流程圖
2、從邏輯上走通流程圖。
對照出現(xiàn)的問題,是否還能走通。
難免會深入到某【函數(shù)】內(nèi)部,但【函數(shù)】是借來的,不是自己寫的。就需要進(jìn)入研究,如此才能將流程圖完善、完整、流通。
這樣所有的問題就通了。
作者: qsssuv    時(shí)間: 2023-5-11 16:20
daojishi_display_cnt要聲明成vu8,避免編譯器優(yōu)化
作者: wulin    時(shí)間: 2023-5-11 16:35
在編譯器里走單步看看




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1