大家好
問題是:
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--;
}
}
|