小智
首先感谢B站up主小智-学长提供的优质开源项目并且还有详细的视频、文档教学。视频教学包括硬件设计、软件设计和外壳结构的设计,视频的链接如下:
【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022_哔哩哔哩_bilibili
其中freertos的一些内容参考了这篇文章:(45条消息) FreeRTOS系列第18篇---FreeRTOS队列API函数_研究是为了理解的博客-CSDN博客,博主关于freertos系列的文章都很棒,有兴趣的朋友可以学习下。
DesktopScreenDemoV4.0.0的源码可以在小智学长的线上文档中下载到Docs (feishu)。
此文主要用于个人学习成果的检验,如果能帮助到像我一样的初学者那就更好了。如果有理解错的或者写得不够好的地方,希望各位大佬不吝赐教,小弟一定虚心学习!
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&STAif(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)函数的个人学习分享到这里就结束了,感谢耐心观看的小伙伴,希望对大家能有一点帮助!
小智
首先感谢B站up主小智-学长提供的优质开源项目并且还有详细的视频、文档教学。视频教学包括硬件设计、软件设计和外壳结构的设计,视频的链接如下:
【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022_哔哩哔哩_bilibili
其中freertos的一些内容参考了这篇文章:(45条消息) FreeRTOS系列第18篇---FreeRTOS队列API函数_研究是为了理解的博客-CSDN博客,博主关于freertos系列的文章都很棒,有兴趣的朋友可以学习下。
DesktopScreenDemoV4.0.0的源码可以在小智学长的线上文档中下载到Docs (feishu)。
此文主要用于个人学习成果的检验,如果能帮助到像我一样的初学者那就更好了。如果有理解错的或者写得不够好的地方,希望各位大佬不吝赐教,小弟一定虚心学习!
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&STAif(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)函数的个人学习分享到这里就结束了,感谢耐心观看的小伙伴,希望对大家能有一点帮助!
发布评论