🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/nb-iot) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **SDK 源码结构** 打开本节课配套的工程,其文件结构如下图所示。 ![](https://img.kancloud.cn/1e/e7/1ee7f01a36ccbfe0259ae8ce457c944e_364x541.png =300x) ### 其中以hal开头的文件都属于HAL,以svc开头的文件都属于Service组件。由于前面课程已经一步一步地带读者实现了部分HAL API,故不展开讲解,后续课程将重点讲解Service组件和Task。 <br/> ## **任务管理服务 svc_task** svc\_task提供任务管理服务,是整个框架运转以及调度的核心,使用了消息队列的设计方式,可以添加或删除周期性或非周期性的任务。svc\_task.h文件的代码如下: ### ``` #ifndef __SVC_TASK_H__ #define __SVC_TASK_H__ #include <stdint.h> /* 最大的任务数量为10个 */ #define SVC_TASK_MAX (10) /* * 初始化 */ void svcTaskInit(); /* * 新增任务 * * @param interval - 多少毫秒(ms)后到期执行此任务 * @param repeat - 是否重复执行此Task:1表示重复执行,0表示不重复 * @callback - 回调函数,到期后自动执行此函数 * @args - 传给回调函数的参数 * @Return: * 0xFF : 错误 * 0 ~ (SVC_TASK_MAX - 1) : Task ID */ uint8_t svcTaskAdd(uint16_t interval, uint8_t repeat, void (*callback)(uint8_t, void *), void *args); /* *删除指定的任务 *@param tid - 待删除的Task的ID */ void svcTaskRemove(uint8_t tid); /* *查看有没有需要执行的任务,如有则执行 *@param tick - tick */ void svcTaskPoll(uint16_t tick); #endif /* __SVC_TASK_H__ */ ``` <br/> ## **SDK 使用示例** 接下来通过一个简单的例子直观地了解SDK的使用方式。 <br/> **1. 创建测试任务** 笔者在工程的根目录中新建了task\_test.h和task\_test.c文件,task\_test.h声明初始化该任务的函数接口给到main函数进行初始化,task\_test.h内容如下: ``` #ifndef __TASK_TEST_H__ #define __TASK_TEST_H__ void taskTestInit(void); #endif /* __TASK_TEST_H__ */ ``` <br/> task\_test.c是任务具体内容的实现(每隔2秒输出消息给串口)代码如下: ``` #include "task_test.h" #include "svc_task.h" #include "svc_log.h" static void taskTestRunner(uint8_t, void *); /* *测试任务任务初始化 */ void taskTestInit() { /*一直重复进行:2s后执行回调函数taskTestRunner*/ svcTaskAdd(2000, 1, taskTestRunner, 0); } /* *回调函数,定义此任务的具体工作内容 */ void taskTestRunner(uint8_t id, void *args) { /* 记录日志消息 */ svcLogWrite((uint8_t *)"task-test running...\n"); } ``` 上述代码定义了一个测试任务,该任务的内容是仅仅是记录日志消息,并且被设定为每隔两秒执行一次。 ### 日志记录函数svcLogWrite由svc\_log组件提供,在svc\_log.h中定义并在svc\_log.c中实现,其工作内容是把日志消息传递给 HAL 层的 Uart 并输出。 <br/> **2. 编写主函数** 打开main.c文件,代码如下: ### ``` #include "main.h" #include "task_test.h" #include "svc_log.h" #include "svc_task.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();//Task初始化 while (1) { halSystemDelayUs(1000);//延迟1毫秒 svcTaskPoll(1);//查看有没有需要执行的任务,如有则执行 } } /* *HAL初始化 */ void halInit() { halSystemInit();//系统初始化 halUartInit(115200);//串口初始化 halLedInit();//LED初始化 //如果需要使用更多硬件资源,需要在这里增加更多初始化 } /* *Service组件初始化 */ void svcInit() { svcTaskInit();//任务管理服务器初始化 svcLogInit();//日志服务初始化 //如果需要使用更多Service组件,需要在这里增加更多初始化 } /* *Task初始化 */ void taskInit() { taskTestInit();//测试任务初始化 //如果需要使用更多Task,需要在这里增加更多初始化 } ``` <br/> **代码测试** 1.编译链接工程代码,把生成的Hex文件烧录到开发板中。 ### 2.把STM32开发板的第1、2、3和4打到右边,第5和6位打到左边,如图所示。 ![](https://img.kancloud.cn/58/9a/589a66f16f8ca111d36b54fac452805c_1076x1045.png =250x) ### 3.使用Micro USB线连接开发板到电脑,然后打开串口助手并做好相关配置,可以看到每隔 2 秒打印日志消息,如图所示。 ![](https://img.kancloud.cn/bf/43/bf43a2f3b7d47c247ed3697977b43aa6_752x666.png =500x) <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) (非商务合作**勿扰**,此处**非**技术支持)