大家好
问题是:
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--;
}
}
|