小智-学长esp32桌面小屏幕_DesktopScreenDemoV4.0.0_进入后台任务处理的代码学习

首先感谢B站up主小智-学长提供的优质开源项目并且还有详细的视频、文档教学。视频教学包括硬件设计、软件设计和外壳结构的设计,视频的链接如下:

【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022_哔哩哔哩_bilibili

其中freertos的一些内容参考了这篇文章:(45条消息) FreeRTOS系列第18篇---FreeRTOS队列API函数_研究是为了理解的博客-CSDN博客,博主关于freertos系列的文章都很棒,有兴趣的朋友可以学习下。

DesktopScreenDemoV4.0.0的源码可以在小智学长的线上文档中下载到Docs (feishu.cn)。

此文主要用于个人学习成果的检验,如果能帮助到像我一样的初学者那就更好了。如果有理解错的或者写得不够好的地方,希望各位大佬不吝赐教,小弟一定虚心学习!

DesktopScreenDemoV4.0.0 app_main.c文件中对桌面小屏幕的功能实现用到了三个函数,所以我计划把项目代码分成三篇文章来进行分享,主要分成三个部分,sleep_mode_init()函数、background_task(void* arg)函数和app_main函数。这一节与大家一起学习的是background_task(void* arg)函数的内容。

background_task(void* arg)函数是DesktopScreen后台的任务处理函数。函数原型如下:

static void background_task(void* arg)
{
    int apsta_close_count = 0;
    for(;;){
        printf("background_task run... \n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        //首次更新
        if(has_first_time_httpdata_request() == true && get_wifi_sta_status() == WIFI_STA_MODE_CONNECT_SUCCESS){ 1.
            ds_http_request_all(); 2.
            set_has_first_time_httpdata_request(); 3.
        }
        //下拉请求更新
        if(has_update_httpdata_request() == true){ 4.
            if(get_is_ap_sta_open()){ 5.
                if(get_wifi_sta_status() == WIFI_STA_MODE_CONNECT_SUCCESS){ 6.
                    ds_http_request_all(); 7.
                    set_update_httpdata_request(false); 8.
                }
            }else{ 
                ds_wifi_send_event(AP_STA_START); 9.
                vTaskDelay(1000 / portTICK_PERIOD_MS); 10.
            }
        }
        //关闭wifi AP&STA 计时
        if(get_is_ap_sta_open() == true && apsta_close_count == 0){ 
            //重置10min计时
            apsta_close_count = (600 - 10); 11.
        }
        if(apsta_close_count > 0){
            apsta_close_count --;
            if(apsta_close_count == 0){
                ds_wifi_send_event(AP_STA_STOP); 12.
                vTaskDelay(1000 / portTICK_PERIOD_MS); 
                set_update_httpdata_request(false); 13.
            }
        }
        //设置页面 开启AP&STA
        if(ds_ui_get_now_show_page() == PAGE_TYPE_SETTING){
            if(get_is_ap_sta_open() == false){
                ds_wifi_send_event(AP_STA_START); 14.
                vTaskDelay(1000 / portTICK_PERIOD_MS);
            }
        }
    }
}

1.假如has_first_time_httpdata_request()函数的返回值,系统数据结构体中http数据首次更新标志位是否为真;同时判断WiFi的STA模式是否连接成功。

bool has_first_time_httpdata_request(){
    return g_system_data.first_time_httpdata_request;
}

WIFI_STA_MODE_STATUS_E get_wifi_sta_status(){
    return g_system_data.wifi_sta_status;
}

2.调用ds_http_request_all()发送http全部请求,获取粉丝数、天气、时间。函数内部调用ds_http_request_type(HTTP_REQUEST_TYPE_E type)函数将需要请求的项目通过xQueueSend( xQueue, pvItemToQueue, xTicksToWait )函数发送到队列上。这个队列发送函数实际上是一个宏,真正被调用的函数是xQueueGenericSend()。这个宏向队列尾部投递一个队列项。项目以拷贝的形式入队,而不是以引用形式入队。绝不可以在中断服务例程中调用这个宏,在中断中需要使用带有中断保护的版本xQueueSendFromISR()来完成相同的功能。函数原型如下:

typedef enum{
    HTTP_GET_TIME =0,
    HTTP_GET_WEATHER,
    HTTP_GET_FANS,
    HTTP_GET_CITY,
}HTTP_REQUEST_TYPE_E;

void ds_http_request_all(){
    ds_http_request_type(HTTP_GET_FANS);
    ds_http_request_type(HTTP_GET_WEATHER);
    ds_http_request_type(HTTP_GET_TIME);
    ds_http_request_type(HTTP_GET_FANS);
}

void ds_http_request_type(HTTP_REQUEST_TYPE_E type){
    HTTP_REQUEST_TYPE_E evt;
    evt = type;
    xQueueSend(http_request_event_queue, &evt, 0);
}

#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \
    xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )

3.设置首次更新标志位为否。函数原型如下:

void set_has_first_time_httpdata_request(){
    g_system_data.first_time_httpdata_request = false;
}

4.调用函数获取刷新http数据更新请求标志位,判断是否为真。函数原型如下:

bool has_update_httpdata_request(){
    return g_system_data.update_httpdata_request;
}

5.判断是否开启WIFI的AP和STA模式。

6.判断WIFI的STA是否成功连接,意思就是设备是否连上热点。

7.见2.

8.调用函数设置http数据更新请求标志位为否。函数原型如下:

void set_update_httpdata_request(bool update){
    g_system_data.update_httpdata_request = update;
}

9.如果没有打开WIFI的AP和STA调用WIFI事件发送函数对它们进行开启。函数内部调用队列发送函数将项目发送到队列上。

void ds_wifi_send_event(WIFI_SET_EVENT_E event){
    WIFI_SET_EVENT_E evt;
    evt = event;
    xQueueSend(wifi_event_queue, &evt, 0);
}

10.延时1秒,portTICK_PERIOD_MS是一个为1000的宏。

11.重置关闭WIFI AP和STA模式倒计时。

12.如果倒计时计数器减到0时,调用WIFI事件发送函数关闭AP和STA模式。

13.4.

14.如果屏幕处于设置页面,并且没有AP和STA模式没有打开,那就调用WIFI事件发送函数启动它们。

小结:background_task(void* arg)函数的个人学习分享到这里就结束了,感谢耐心观看的小伙伴,希望对大家能有一点帮助!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值