>[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)
(非商务合作**勿扰**,此处**非**技术支持)
- 课程简介
- 配套资源下载
- 配套开发套件简介
- 简介
- 硬件组成 & 技术参数
- STM32 Pro 主板 原理图 & PCB图
- STM32 Std 主板 原理图 & PCB图
- 板载设备使用说明
- STM32开发指南
- 1. 搭建开发环境
- 1.1 Keil MDK简介与安装
- 1.2 STM32 Pack 简介与安装
- 1.3 CH34x 驱动简介与安装
- 1.4 ISP 串口下载工具
- 1.5 串口调试工具
- 2. STM32 开发基础
- 2.1 新建工程
- 2.2 实现第1个程序
- 2.3 Hex 文件烧录详解
- 3. 移植官方标准工程模板
- 4. GPIO实验:LED
- 5. 系统延时应用
- 6. GPIO实验:按键
- 7. GPIO中断实验——按键触发实验
- 8. 使用定时器TIM3
- 9. 串口通信实验
- 10. ADC 实验
- 11. OLED显示器实验
- 12. SDK 设计思想
- 13. SDK 架构解析
- 14. 多任务应用实验
- 15. 输入型任务:按键输入实验
- 16. 输入型任务:串口接收实验
- 17. 高精度温湿度传感器实验
- 进阶课程