>[success] **技術支持說明**
> 1.**客服**提供簡單的技術支持,一般自主學習為主
> 2.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/nb-iot)
> 3.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解!
<br/>
本節課將講解基于SDK創建并執行多個任務。
###
打開本節課配套的工程,如下圖所示。

###
本節課配套工程在上節課的基礎上新增了一些服務和任務。
<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位打到左邊;

###
* 把OLED顯示器按如圖所示插入到開發板中

>[danger] 注意,開發板與顯示器是右邊對齊。
###
* 使用USB線連接開發板到電腦,然后打開串口助手,可以看到、日志消息,如圖所示。

###
* 同時,在開發板上可以看到LED閃爍、顯示屏不斷地刷新,如圖所示。

<br/>
<br/>
## **商務合作**
如有以下需求,可掃碼添加管理員好友,注明“**商務合作**”
* 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等;
* 入駐平臺,成為講師;
* 接項目賺外快;
* 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/)

(非商務合作**勿擾**,此處**非**技術支持)
- 課程介紹
- 配套資源下載
- 配套開發套件簡介
- 簡介
- 硬件組成 & 技術參數
- 電路原理圖 & PCB圖
- 撥碼開關使用說明
- 第一部分:無線通信 開發指南
- 1.1.1 NB-IoT:技術簡介
- 1.1.2 NB:CH34x USB轉串口驅動安裝
- 1.1.3 NB:AT 指令開發與測試
- 1.1.4 NB:基礎指令集簡介
- 1.1.5 NB:云端服務器
- 1.1.5.1 PuTTY 簡介與安裝
- 1.1.5.2 登錄云端服務器
- 1.1.6 NB:移遠官方工具簡介
- 1.1.7 NB:使用UDP協議與云端服務器通信
- 1.1.8 NB:使用TCP協議與云端服務器通信
- 1.1.9 NB:使用MQTT協議與云端服務器通信
- 進階課程
- 第二部分:STM32 開發指南
- 2.1 搭建開發環境
- 2.1.1 Keil MDK 簡介與安裝
- 2.1.2 STM32 Pack 簡介與安裝
- 2.1.3 CH34x 驅動簡介與安裝
- 2.1.4 其他開發工具
- 2.2 STM32 開發基礎
- 2.2.1 新建工程
- 2.2.2 實現第1個程序
- 2.2.3 Hex 文件燒錄詳解
- 2.3 移植官方標準工程模板
- 2.4 GPIO實驗——LED燈
- 2.5 系統延時應用
- 2.6 GPIO實驗——按鍵
- 2.7 GPIO中斷實驗——按鍵觸發
- 2.8 使用定時器TIM3
- 2.9 串口通信實驗
- 2.10 ADC 實驗
- 2.11 OLED顯示器實驗
- 2.12 SDK 設計思想
- 2.13 SDK 架構解析
- 2.14 多任務應用
- 2.15 輸入型任務:按鍵輸入
- 2.16 輸入型任務:串口接收
- 課外篇:項目實戰
- 基于STM32+NB-IoT的溫濕度采集
- 系統簡介
- 系統搭建
- 系統詳解
- 1.代碼編譯與架構說明
- 2.DHT11溫濕度傳感器
- 3. 數據通信任務說明
- 版權聲明與免責聲明