🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/nb-iot) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 本节课将讲解基于SDK创建并执行多个任务。 ### 打开本节课配套的工程,如下图所示。 ![](https://img.kancloud.cn/41/04/41042d02724a4970eb85c25fb56b75b2_346x699.png =300x) ### 本节课配套工程在上节课的基础上新增了一些服务和任务。 <br/> ## **svc_plugins服务** 插件服务svc\_plugins用于提供一些零碎的服务,例如反转LED状态、在显示器上显示一些特性信息等。svc\_plugins.h代码如下: ### ``` #ifndef __SVC_PLUGINS_H__ #define __SVC_PLUGINS_H__ #include <stdint.h> /* *插件服务初始化 */ void svcPluginsInit(void); /* *反转LED灯的亮灭状态 */ void svcPluginsToggleLed(void); /* *在显示器中显示内容 *@param line1 - 第1行的内容 *@param line2 - 第2行的内容 *@param line3 - 第3行的内容 *@param line4 - 第4行的内容 */ void svcPluginsLcdWrite(const uint8_t *line1, const uint8_t *line2, const uint8_t *line3, const uint8_t *line4); #endif /* #ifndef __SVC_PLUGINS_H__ */ ``` <br/> ## **task_test** 上节课已经讲解过Task任务,其任务内容是每隔2秒记录日志信息,这里对其稍微修改了一下,修改后的代码如下: ### ``` void taskTestRunner(uint8_t id, void *args) { svcLogWrite((uint8_t *)"Task[TEST] Running...\n"); } ``` <br/> ## **task_led** task\_led任务内容是每个1秒反转LED的状态,task\_led.c的代码如下: ### ``` #include "task_led.h" #include "svc_plugins.h" #include "svc_task.h" static void taskLedRunner(uint8_t, void *); /* *LED任务初始化 */ void taskLedInit() { /*一直重复进行:1s后执行回调函数taskLedRunner*/ svcTaskAdd(1000, 1, taskLedRunner, 0); } /* * 回调函数,定义此任务的具体工作内容 */ void taskLedRunner(uint8_t id, void *args) { /* 反转LED灯的亮灭装状态 */ svcPluginsToggleLed(); } ``` <br/> ## **task_uart** task\_uart任务的工作内容是每隔1秒记录日志内容,task_uart.c的代码如下: ### ``` #include "task_uart.h" #include "svc_log.h" #include "svc_task.h" static void taskUartRunner(uint8_t, void *); /* * Uart任务初始化 */ void taskUartInit() { /*一直重复进行:1s后执行回调函数taskUartRunner*/ svcTaskAdd(1000, 1, taskUartRunner, 0); } /* *回调函数,定义此任务的具体工作内容 */ void taskUartRunner(uint8_t id, void *args) { /* 记录日志信息 */ svcLogWrite((uint8_t *)"Task[UART] Running...\n"); } ``` <br/> ## **task_lcd** task\_lcd任务的工作内容是每隔1秒刷新显示器的显示内容,task_lcd.c的代码如下: ``` #include "task_lcd.h" #include "svc_task.h" #include "svc_plugins.h" #include <string.h> #include <stdio.h> static void taskLcdRunner(uint8_t, void *); /* *显示器任务初始化 */ void taskLcdInit() { /*一直重复进行:1s后执行回调函数taskLcdRunner*/ svcTaskAdd(1000, 1, taskLcdRunner, 0); } /* *回调函数,定义此任务的具体工作内容 */ void taskLcdRunner(uint8_t id, void *args) { static int count = 0; char msg[16]; sprintf(msg, "Count=%d", count++); svcPluginsLcdWrite((uint8_t *)"TASK[LCD]", (uint8_t *)"", (uint8_t *)msg, (uint8_t *)""); } ``` <br/> ## **编写Main函数** main.c的代码如下: ``` #include "main.h" #include "task_lcd.h" #include "task_uart.h" #include "task_led.h" #include "task_test.h" #include "svc_plugins.h" #include "svc_log.h" #include "svc_task.h" #include "hal_oled12864.h" #include "hal_led.h" #include "hal_uart.h" #include "hal_system.h" static void halInit(void); static void svcInit(void); static void taskInit(void); int main(void) { halInit();//HAL初始化 svcInit();//Service初始化 taskInit();//任务初始化 //每隔1毫秒查看有没有任务需要执行 while (1) { halSystemDelayUs(1000); svcTaskPoll(1); } } /* *HAL初始化 */ void halInit() { halSystemInit();//系统初始化 halUartInit(115200);//串口初始化 halLedInit();//LED初始化 halOLED12864Init();//显示器初始化 //如果需要使用更多硬件资源,需要在这里增加更多初始化 } /* *Service组件初始化 */ void svcInit() { svcTaskInit();//任务管理服务初始化 svcLogInit();//日志服务初始化 svcPluginsInit();//插件服务初始化 //如果需要使用更多Server组件,需要在这里增加更多初始化 } /* * 各个任务初始化 */ void taskInit() { taskTestInit(); taskLedInit(); taskLcdInit(); taskUartInit(); //如果需要使用更多Task,需要在这里增加更多初始化 } ``` ## **代码测试** * 编译链接工程代码,把生成的Hex文件烧录到开发板中。 ### * 把STM32开发板的第1、2、3和4打到右边,第5和6位打到左边,如图所示。 ![](https://img.kancloud.cn/58/9a/589a66f16f8ca111d36b54fac452805c_1076x1045.png =250x) ### * 把OLED显示器按如图所示插入到开发板中,如图所示。 ![](https://img.kancloud.cn/23/64/236467c39179dc011ca5252f81b63cae_474x533.png =300x) ### * 使用USB线连接开发板到电脑,然后打开串口助手并做好相关配置,可以看到、日志消息,如图所示。 ![](https://img.kancloud.cn/05/bc/05bc7bf52a2289dfbf7973f89c2aad32_1019x746.png =500x) ### * 同时,在开发板上可以看到LED闪烁、显示屏不断地刷新,如图所示。 ![](https://img.kancloud.cn/57/84/5784a5de07aa85cd6957168ae77ccd99_403x546.png =300x) <br/> <br/> ## **商务合作** 如有以下需求,可扫码添加管理员好友,注明“**商务合作**” * 项目定制开发,技术范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等; * 入驻平台,成为讲师; * 接项目赚外快; * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](images/screenshot_1637114207608.png =150x) (非商务合作**勿扰**,此处**非**技术支持)