OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3582|回复: 6

在网上看到一段代码,有不懂,又联系不上作者,贴出来问问大家

[复制链接]

5

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-1-15
在线时间
9 小时
发表于 2022-1-24 08:44:40 | 显示全部楼层 |阅读模式
这是一个基于STM32的freertos下WiFi模块的初始化,但是里面有三个while循环,在freertos中不是一个任务只有一个循环吗,请问一下如下代码是怎么运行的,请大神帮帮忙,若代码作者看到了,可以加下我企鹅码3422217339,麻烦备注一下你的项目名,谢谢。
最近在看看你写代码,好多不懂的地方,向你请教请教

uint8_t esp8266_init(void)
{
        uint8_t conn_server_n = 0;                //记录连接server的次数
        uint8_t conn_wifi_n = 0;                //记录连接WIFI次数
       
        set_config_mode();                                //设置成配置模式
       
        while(1)
        {
                //测试AT指令
                if(test_at())
                {
                        #if ESP8266_LOG
                        printf("AT测试成功\r\n");
                        #endif
                        //成功
                        break;        //跳出循环
                }
                else
                {
                        #if ESP8266_LOG
                        printf("AT测试失败\r\n");
                        #endif
                        //AT失败有两种情况:1.当前在透传模式 2.模块损坏
                        close_tran();        //关闭透传模式
                }
        }

        //关回显
        if(close_huixian())
        {
                #if ESP8266_LOG
                printf("关闭esp8266回显 正常\r\n");
                #endif
        }
        else
        {
                #if ESP8266_LOG
                printf("关闭esp8266回显 异常\r\n");
                #endif
        }
        //设置成客户端
        if(set_client())
        {
                #if ESP8266_LOG
                printf("设置成客户端 正常\r\n");
                #endif
        }
        else
        {
                #if ESP8266_LOG
                printf("设置成客户端 异常\r\n");
                #endif
        }
        //判断wifi连接是否正常        is_connect_ap
        while(is_connect_ap() == 0)
        {
                conn_wifi_n++;
                if(conn_wifi_n > WIFI_CONN_TIMES)
                {
                        #if ESP8266_LOG
                        printf("连接WIFI超时\r\n");
                        #endif
                        wifi_sta = WIFI_OFF_LINE;        //更新wifi状态
                        return 0 ;
                }
                if(connect_ap())
                {
                        auto_connect_ap();                        //设置自动连接WIFI
                        #if ESP8266_LOG
                        printf("连接wifi 正常\r\n");
                        #endif
                        break;
                }
                else
                {
                        #if ESP8266_LOG
                        printf("连接wifi 异常\r\n");
                        #endif
                }

        }
        wifi_sta = WIFI_ON_LINE;        //更新wifi状态
        #if ESP8266_LOG
        printf("连接wifi 正常\r\n");
        #endif
        while(is_connect_ap()!=3)
        {
                #if ESP8266_LOG
                printf("尝试连接服务器...\r\n");
                #endif
                conn_server_n++;
                if(conn_server_n > SERVER_CONN_TIMES)
                {
                        #if ESP8266_LOG
                        printf("服务器连接超时\r\n");
                        #endif
                        server_sta = SERVER_OFF_LINE;        //更新server状态
                        return 0 ;
                }
                if(connect_server())        //如果连接成功,则自动退出
                {
                        break;
                }
        }
        #if ESP8266_LOG
        printf("连接服务器 正常\r\n");
        #endif
       
        //设置透传模式1
        if(set_mode1())
        {
                #if ESP8266_LOG
                printf("设置透传模式1 正常\r\n");
                #endif
        }
        else
        {
                #if ESP8266_LOG
                printf("设置透传模式1 异常\r\n");
                #endif
        }               
        //开始透传
        if(start_tran())
        {
                #if ESP8266_LOG
                printf("开始透传 正常\r\n");
                #endif
                //开始接收数据
                set_tran_mode();
        }
        else
        {
                #if ESP8266_LOG
                printf("开始透传 异常\r\n");
                #endif
                return 0;
        }
        #if ESP8266_LOG
        printf("服务器在线\r\n");
        #endif
        server_sta = SERVER_ON_LINE;        //更新SERVER状态
        return 1;
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-1-15
在线时间
9 小时
 楼主| 发表于 2022-1-24 08:46:29 | 显示全部楼层
我咋感觉这while(1)会一直运行,停不下来阿
回复 支持 反对

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2019-12-13
在线时间
67 小时
发表于 2022-1-24 09:50:05 | 显示全部楼层
每个循环都有break,正常情况可以跳出,异常情况确实可能会卡while ,不过FreeRTOS是抢占式调度,其他更高优先级的线程不影响
回复 支持 反对

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2022-1-24 09:56:10 | 显示全部楼层
楼上说的对,每个循环都有相应的break,除非异常
回复 支持 反对

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2022-1-24 10:27:39 | 显示全部楼层
楼上的楼上说的对  这段程序 没有看出来有什么问题   应该是可以正常运行的
Nothing is impossible
回复 支持 反对

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2022-1-24 15:57:02 | 显示全部楼层
楼上说的都对
学无止境
回复 支持 反对

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-1-25 14:23:51 | 显示全部楼层

楼上的楼上说的对  这段程序 没有看出来有什么问题   应该是可以正常运行的


第一个while 循环是 while(1)  是任务循环
第二个while 循环   while(is_connect_ap() == 0)   判断wifi连接是否正常 ,如果连接不正常就一直等待,不往下面走
第三个while 循环   while(is_connect_ap()!=3)   判断是否连接上了服务器,如果连不上服务器就一直等待

        
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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