>[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)
(非商务合作**勿扰**,此处**非**技术支持)
- 课程简介
- 配套资源下载
- 配套开发套件简介
- 简介
- 硬件组成 & 技术参数
- 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. 高精度温湿度传感器实验
- 进阶课程