找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 966|回复: 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--;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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、从逻辑上走通流程图。
对照出现的问题,是否还能走通。
难免会深入到某【函数】内部,但【函数】是借来的,不是自己写的。就需要进入研究,如此才能将流程图完善、完整、流通。
这样所有的问题就通了。
回复

使用道具 举报

5#
ID:353115 发表于 2023-5-11 16:20 | 只看该作者
daojishi_display_cnt要声明成vu8,避免编译器优化
回复

使用道具 举报

6#
ID:213173 发表于 2023-5-11 16:35 | 只看该作者
在编译器里走单步看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表