多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[success] **技术支持说明** > 1.**客服**提供简单的技术支持,一般自主学习为主 > 2.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/nb-iot) > 3.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 本节课将讲解基于SDK创建并执行多个任务。 ### 打开本节课配套的工程,如下图所示。 ![](https://img.kancloud.cn/03/3a/033ab1142e03eb0ed95d92c11f31cf81_346x699.png =250x) ### 本节课配套工程在上节课的基础上新增了一些服务和任务。 <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文件烧录到开发板中; ### * 按如图所示把开发板的拨码开关的第1~4位打到右边,第5、6位打到左边; ![](https://img.kancloud.cn/34/9c/349cceae4177926416445b6daf932d24_664x827.png =200x) ### * 把OLED显示器按如图所示插入到开发板中 ![](https://img.kancloud.cn/05/2e/052e0fcb904938ddd881d51616ec73fb_2736x1427.png =350x) >[danger] 注意,开发板与显示器是右边对齐。 ### * 使用USB线连接开发板到电脑,然后打开串口助手,可以看到、日志消息,如图所示。 ![](https://img.kancloud.cn/eb/64/eb64fdd4c4f6885871575f0c11fc5ef5_1019x746.png =500x) ### * 同时,在开发板上可以看到LED闪烁、显示屏不断地刷新,如图所示。 ![](https://img.kancloud.cn/f4/80/f48086d2ba140ab94dac98621937fca6_2090x2408.png =300x) <br/> <br/> ## **商务合作** 如有以下需求,可扫码添加管理员好友,注明“**商务合作**” * 项目定制开发,技术范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等; * 入驻平台,成为讲师; * 接项目赚外快; * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =150x) (非商务合作**勿扰**,此处**非**技术支持)