久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1639|回復: 5
收起左側

遇到一個非常奇怪的C語言while循環問題

[復制鏈接]
ID:997026 發表于 2023-5-11 12:26 | 顯示全部樓層 |閱讀模式
大家好

問題是:
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--;
        }
}
回復

使用道具 舉報

ID:1064118 發表于 2023-5-11 13:21 | 顯示全部樓層
程序在主循環外邊,跑一次是對的
回復

使用道具 舉報

ID:997026 發表于 2023-5-11 13:31 | 顯示全部樓層
zywng2153 發表于 2023-5-11 13:21
程序在主循環外邊,跑一次是對的

不至于吧,我這個循環是有條件的,中斷中計時5s才會減到0,不至于跑一遍阿
回復

使用道具 舉報

ID:123289 發表于 2023-5-11 14:41 | 顯示全部樓層
解決此類問題建議:
1、畫出程序流程圖
2、從邏輯上走通流程圖。
對照出現的問題,是否還能走通。
難免會深入到某【函數】內部,但【函數】是借來的,不是自己寫的。就需要進入研究,如此才能將流程圖完善、完整、流通。
這樣所有的問題就通了。
回復

使用道具 舉報

ID:353115 發表于 2023-5-11 16:20 | 顯示全部樓層
daojishi_display_cnt要聲明成vu8,避免編譯器優化
回復

使用道具 舉報

ID:213173 發表于 2023-5-11 16:35 | 顯示全部樓層
在編譯器里走單步看看
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久日韩精品 | 久久r久久| 中文字幕亚洲无线 | 91精品国产91久久综合桃花 | 中文字幕一区二区三区在线观看 | 精品一区二区三区四区五区 | 欧美国产日韩一区二区三区 | 91免费在线视频 | 亚洲午夜视频在线观看 | 中文字幕高清免费日韩视频在线 | 99色综合 | 国产一区二区 | 色婷婷久久久久swag精品 | 成年人在线视频 | 国产精品一区二区av | 久久福利电影 | 国产精品国产精品国产专区不卡 | 亚洲日韩中文字幕一区 | 国产精品久久久久久久久久久免费看 | 97精品国产97久久久久久免费 | 日本不卡一区二区三区 | 婷婷狠狠 | 午夜理伦三级理论三级在线观看 | 一级毛片免费看 | 精品久久影院 | 久久久久久高潮国产精品视 | 无码国模国产在线观看 | 西西裸体做爰视频 | 欧美国产日韩在线观看成人 | 亚洲视频在线观看 | 在线三级网址 | 天天色天天色 | 色爱综合网| 99久久国产| 二区在线视频 | 夜夜草| 欧美日韩不卡在线 | 成人国产精品一级毛片视频毛片 | 成人免费一级视频 | 一区天堂 | 亚洲欧美视频一区二区 |