11.24:完善注释和MarkDown自述文件。
This commit is contained in:
84
README.md
84
README.md
@@ -1,3 +1,85 @@
|
|||||||
# FreeRTOS_LoRa_Environment_Assistant
|
# FreeRTOS_LoRa_Environment_Assistant
|
||||||
|
|
||||||
基于STM32F103C8T6最小系统板与正点原子ATK-LORA模块开发智能环境监测系统,构建双LoRa节点网络,通过RS485、I2C、SPI、单总线等常用协议采集温湿度等传感器数据;采用定点组网模式与LoRa网关通信,结合Wi-Fi模块将数据推送至基于MQTT协议的EMQX Broker服务器;采用FreeRTOS进行任务调度优化,保障多线程数据采集与传输;在每一个节点通过LVGL图形库添加可视化界面,通过OLED显示屏实时显示数据信息和可操控设备;通过开发Android App,集成实时数据可视化、远程设备控制、安全监控及异常报警等功能。
|
## 项目概述:
|
||||||
|
**该项目为裸机开发“LoRa 2Nodes Demo”的升级版。**不仅移植了FreeRTOS操作系统,而且完善了传输协议。减少了远程操控延迟的同时,保证项目的稳定运行。基于 STM32F103C8T6 最小系统板与正点原子 ATK-LORA 模块开发智能环境监测系统,构建双 LoRa 节点网络,通过 I2C、SPI、单总线等常用协议采集温湿度等传感器数据;采用定点组网模式与 LoRa 网关通信,结合 Wi-Fi 模块将数据推送至基于 MQTT 协议的 EMQX Broker 服务器;采用 FreeRTOS 进行任务调度优化,保障多线程数据采集与传输;在每一个节点通过 LVGL 图形库添加可视化界面,通过 OLED 显示屏实时显示数据信息和可操控设备;通过开发 Android App,集成实时数据可视化、远程设备控制、安全监控及异常报警等功能。
|
||||||
|
## 项目实现:
|
||||||
|
### 一、使用FreeRTOS操作系统:
|
||||||
|
**优点及作用:** 可保证每个任务不会因为延迟被阻塞,大幅度减小远程操控的延迟。
|
||||||
|
#### 以环境监测节点为例:
|
||||||
|
**1、创建任务:**创建了LED状态灯任务、温湿度检测任务、向网关节点传输数据、从网关节点接收数据和检测执行器指令控制LED灯五个任务。
|
||||||
|
**2、创建消息队列:**温湿度检测任务将采集到的温湿度数据通过队列发送到传输数据任务,实现数据的保护。
|
||||||
|
**3、创建中断触发消息队列:**创建串口触发消息队列,当串口3接收到消息触发中断后,将数据包传送到消息队列,同时创建一个任务用于接收消息队列,并用于后续的检测接收到的数据包是否完整、是否有相关指令。
|
||||||
|
**4、创建二值信号量:**创建检测LED指令消息队列,调用LoRa.c中检测数据包的函数,检测消息队列是否有相关的控制指令,若有相关的控制指令,则触发信号量;在其他任务中判断该信号量是否被触发,若被触发则控制LED灯开启,反之关闭。
|
||||||
|
### 二、自定义传输协议:
|
||||||
|
**1、节点:**
|
||||||
|
|
||||||
|
| 功能 | 状态 | 说明 |
|
||||||
|
|------ |------|------|
|
||||||
|
| 实时预览 | ✅ | 已完成 |
|
||||||
|
| 语法高亮 | ✅ | 已完成 |
|
||||||
|
| 导出功能 | ✅ | 已完成 |
|
||||||
|
## 本系统在FreeRTOS中引用的api:
|
||||||
|
### 一、多任务创建与运行
|
||||||
|
**1、概念:**通过定义任务句柄、名称、优先级,从而实现多任务同时在单核的单片机中以并发或抢占的形式运行。在FreeRTOS中,时钟源频率通常被设定为1kHz(#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )),时间片1tick也就是1ms。在任务优先级相同的情况下,多个任务按照一个时间片切换运行,也就是轮询式调度;当其中一个任务的优先级较高时(数值较高),该任务会打断其他任务的运行,也就是抢占式调度。在创建任务后,会产生任务控制块,简称TCB,TCB在切换任务的时候,会将创建任务的指针保存到创建的栈里,也就是保存任务现场,直到任务切换过来后再复原现场。FreeRTOS的任务分为4个状态,分别为就绪态、运行态、挂起态和阻塞态,当其中一个任务遇到延时等情况,会进入到阻塞态,会执行其他任务知道延时结束,低优先级任务被高优先级任务打断也同理。
|
||||||
|
**2、使用到的api函数:**
|
||||||
|
- 任务函数:
|
||||||
|
```c
|
||||||
|
void vTask(void *<参数>);
|
||||||
|
```
|
||||||
|
- 创建任务函数:
|
||||||
|
```c
|
||||||
|
TaskHandle_t xTaskHandler;
|
||||||
|
xTaskCreate(
|
||||||
|
(TaskFunction_t ) vTask,
|
||||||
|
(char * ) "<定义一个任务名称>",
|
||||||
|
(configSTACK_DEPTH_TYPE) 1024,
|
||||||
|
(void * ) NULL, (若有参数则写参数名称)
|
||||||
|
(UBaseType_t ) <优先级,数字越大优先级越高>
|
||||||
|
(TaskHandle_t * ) &xTaskHandler);
|
||||||
|
```
|
||||||
|
- 启动任务调度函数:
|
||||||
|
```c
|
||||||
|
vTaskStartScheduler();
|
||||||
|
```
|
||||||
|
### 二、消息队列:
|
||||||
|
**1、概念:**在初始化消息队列函数种,有两个参数,第一个是队列的长度,也就是这个队列能存放多少个数据;第二个参数就是每个数据的大小,单位为字节,在stm32中uint8_t指针的长度一般是4字节。在多个任务需要共用一个变量值以传递数据的时候,使用消息队列可以很好地保护数据的传输不会被其他用到相关变量的任务干扰。消息队列通过发送队列和接收队列的函数,将不同的任务搭建起一个传递参数的桥梁,从而确保传递数据时不被其他任务干扰,造成数据的误差。如DHT11接收到温湿度数据,将温湿度数据传输到LoRa发送数据的任务中。
|
||||||
|
**2、使用到的api函数:**
|
||||||
|
- 创建队列句柄:
|
||||||
|
```c
|
||||||
|
QueueHandle_t xQueueHandler;
|
||||||
|
```
|
||||||
|
- 创建队列:
|
||||||
|
```c
|
||||||
|
xQueueHandler = xQueueCreate(
|
||||||
|
(UBaseType_t) <队列的长度,单位字节>,
|
||||||
|
(UBaseType_t) <每个数据的大小>);
|
||||||
|
```
|
||||||
|
- 发送队列,也就是将数据存入队列,等待接收,接收时长从0到portMAX_DELAY,如下所示。
|
||||||
|
```c
|
||||||
|
xQueueSend(xQueueHandler, <要传递的变量,指向其地址>, pdMS_TO_TICKS(10));
|
||||||
|
```
|
||||||
|
- 在中断中发送队列(在串口初始化中设置中断抢占优先级配置拉满,且需要设置上下文转换以免造成阻塞):
|
||||||
|
```c
|
||||||
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
xQueueSendFromISR(xQueueUsart3IrqHdlr, &ulRxData, &xHigherPriorityTaskWoken);
|
||||||
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||||
|
```
|
||||||
|
- 接收队列,可接收普通和中断的队列:
|
||||||
|
```c
|
||||||
|
xQueueReceive(xQueueHandler, <要传递的变量,指向其地址>, portMAX_DELAY);
|
||||||
|
```
|
||||||
|
### 三、信号量:
|
||||||
|
**1、概念:**信号量一般用于任务管理。常用的分为二值信号量、计数型信号量和互斥信号量3种信号量,其中二值信号量全称为二进制信号量,用于任务同步,类似于状态机,而后两者分别用于多资源和单资源的管理,资源管理就相当于停车场,多资源管理相当于停车场的多个车位,若停车位停满车就不能停车了,单资源同理。这三种信号量都只有0或1两种值。使用信号量的过程,以二值信号量为例,为创建二值信号量->释放二值信号量->获取二值信号量。释放二值信号量共有两个函数,释放任务中信号量和释放中断中信号量。信号量和状态机类似,释放信号量就相当于改变标志位,而获取信号量相当于获取改变的标志位以决定是否改变执行器的状态。由于只有0和1两种值,因此适用于只有开和关两种状态的执行器。
|
||||||
|
**2、使用到的api函数:**
|
||||||
|
- 动态创建二值信号量:
|
||||||
|
```c
|
||||||
|
SemaphoreHandle_t xSemaphoreHandler;
|
||||||
|
```
|
||||||
|
- 发送信号量:
|
||||||
|
```c
|
||||||
|
xSemaphoreGive(xSemaphoreHandler);
|
||||||
|
```
|
||||||
|
- 接收信号量:(接收句柄、等待时长)
|
||||||
|
```c
|
||||||
|
if (xSemaphoreTake(xSemLedOnHdlr, pdMS_TO_TICKS(10)) == pdTRUE);
|
||||||
|
```
|
||||||
@@ -1,26 +1,72 @@
|
|||||||
<EFBFBD><EFBFBD>Ŀʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
#
|
||||||
һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㣺
|
|
||||||
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>led״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʪ<EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽڵ㴫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
## 项目实现逻辑:
|
||||||
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD>ʪ<EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>ն<EFBFBD><EFBFBD>У<EFBFBD>ͬʱ<EFBFBD>½<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
**一、环境监测节点:**
|
||||||
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
|
- 1、创建任务:创建了led状态任务、温湿度检测任务和向网关节点传输数据三个任务。
|
||||||
<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>FreeRTOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>api<EFBFBD><EFBFBD>
|
- 2、创建消息队列:温湿度检测任务将采集到的温湿度数据通过队列发送到传输数据任务,实现数据的保护。在中断服务函数中创建串口接收队列,同时新建一个所有执行器检测状态的任务,用于分析串口队列数据是否符合触发条件,若符合则触发二值信号量,反之则不触发。
|
||||||
һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
|
- 3、创建中断触发消息队列:在串口3创建消息队列,当串口3接收到消息触发中断后,将消息传送到消息队列,同时创建一个任务用于接收消息队列。
|
||||||
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD>ʵ<EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD>ڵ<EFBFBD><EFBFBD>˵ĵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>FreeRTOS<EFBFBD>У<EFBFBD>ʱ<EFBFBD><EFBFBD>ԴƵ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨Ϊ1kHz(#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ))<29><>ʱ<EFBFBD><CAB1>Ƭ1tickҲ<6B><D2B2><EFBFBD><EFBFBD>1ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1>Ƭ<EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>У<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯʽ<D1AF><CABD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC>ϸ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֵ<EFBFBD>ϸߣ<CFB8><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռʽ<D5BC><CABD><EFBFBD>ȡ<EFBFBD><C8A1>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3A3ACBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ飬<C6BF><E9A3AC><EFBFBD><EFBFBD>TCB<43><42>TCB<43><42><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ὣ<F2A3ACBB><E1BDAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>뱣<EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>Ҳ<EFA3AC><D2B2><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD>ԭ<EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD>FreeRTOS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<CEAA><34>״̬<D7B4><CCAC><EFBFBD>ֱ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><F1B1BBB8><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳͬ<D2B2><CDAC><EFBFBD><EFBFBD>
|
## 本系统在FreeRTOS中引用的api:
|
||||||
2<EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>api<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
**一、多任务创建与运行:**
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>void vTask(void *<<3C><><EFBFBD><EFBFBD>>);
|
- 1、概念:通过定义任务句柄、名称、优先级,从而实现多任务同时在单核的单片机中以并发或抢占的形式运行。在FreeRTOS中,时钟源频率通常被设定为1kHz(#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )),时间片1tick也就是1ms。在任务优先级相同的情况下,多个任务按照一个时间片切换运行,也就是轮询式调度;当其中一个任务的优先级较高时(数值较高),该任务会打断其他任务的运行,也就是抢占式调度。在创建任务后,会产生任务控制块,简称TCB,TCB在切换任务的时候,会将创建任务的指针保存到创建的栈里,也就是保存任务现场,直到任务切换过来后再复原现场。FreeRTOS的任务分为4个状态,分别为就绪态、运行态、挂起态和阻塞态,当其中一个任务遇到延时等情况,会进入到阻塞态,会执行其他任务知道延时结束,低优先级任务被高优先级任务打断也同理。
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TaskHandle_t xTaskHandler;
|
- 2、使用到的api函数:
|
||||||
|
任务函数:
|
||||||
|
```c
|
||||||
|
void vTask(void *<参数>);
|
||||||
|
```
|
||||||
|
创建任务函数:
|
||||||
|
```c
|
||||||
|
TaskHandle_t xTaskHandler;
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
(TaskFunction_t ) vTask,
|
(TaskFunction_t ) vTask,
|
||||||
(char * ) "<<3C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>>",
|
(char * ) "<定义一个任务名称>",
|
||||||
(configSTACK_DEPTH_TYPE) 1024,
|
(configSTACK_DEPTH_TYPE) 1024,
|
||||||
(void * ) NULL, <20><><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
(void * ) NULL, (若有参数则写参数名称)
|
||||||
(UBaseType_t ) 2,<2C><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>Խ<EFBFBD>ߣ<EFBFBD>
|
(UBaseType_t ) <优先级,数字越大优先级越高>
|
||||||
(TaskHandle_t * ) &xTaskHandler);
|
(TaskHandle_t * ) &xTaskHandler);
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vTaskStartScheduler();
|
```
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
|
启动任务调度函数:
|
||||||
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><EFBFBD>еij<EFBFBD><EFBFBD><EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4>Ŷ<EFBFBD><C5B6>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ݵĴ<DDB5>С<EFBFBD><D0A1><EFBFBD><EFBFBD>λΪ<CEBB>ֽڣ<D6BD><DAA3><EFBFBD>stm32<33><32>uint8_tָ<74><D6B8><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>4<EFBFBD>ֽڡ<D6BD><DAA1>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>п<EFBFBD><D0BF>Ժܺõر<C3B5><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĴ<DDB5><C4B4>䲻<EFBFBD>ᱻ<EFBFBD><E1B1BB><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>кͽ<D0BA><CDBD>ն<EFBFBD><D5B6>еĺ<D0B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBDA8>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EEA1A3>DHT11<31><31><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ʪ<EFBFBD><CAAA><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ʪ<EFBFBD><CAAA><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>䵽LoRa<52><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
|
```c
|
||||||
2<EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>api<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
vTaskStartScheduler();
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
```
|
||||||
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õķ<EFBFBD>Ϊ<EFBFBD><EFBFBD>ֵ<EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ж<EFBFBD>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD>ȫ<EFBFBD><C8AB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷ֱ<DFB7><D6B1><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>Դ<EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Դ<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>൱<EFBFBD><E0B5B1>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>൱<EFBFBD><E0B5B1>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>λͣ<CEBB><CDA3><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD>Դͬ<D4B4><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>0<EFBFBD><30>1<EFBFBD><31><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ʹ<EFBFBD><CAB9><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9>̣<EFBFBD><CCA3>Զ<EFBFBD>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD>-><3E>ͷŶ<CDB7>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD>-><3E><>ȡ<EFBFBD><C8A1>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŶ<CDB7>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3>ͷ<EFBFBD><CDB7>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>൱<EFBFBD>ڸı<DAB8><C4B1><EFBFBD>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>൱<EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD>ı<EFBFBD><C4B1>ı<EFBFBD>־λ<D6BE>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ı<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>0<EFBFBD><30>1<EFBFBD><31><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>п<EFBFBD><D0BF><EFBFBD><CDB9><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
**二、消息队列:**
|
||||||
2<EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>api<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
- 1、概念:在初始化消息队列函数种,有两个参数,第一个是队列的长度,也就是这个队列能存放多少个数据;第二个参数就是每个数据的大小,单位为字节,在stm32中uint8_t指针的长度一般是4字节。在多个任务需要共用一个变量值以传递数据的时候,使用消息队列可以很好地保护数据的传输不会被其他用到相关变量的任务干扰。消息队列通过发送队列和接收队列的函数,将不同的任务搭建起一个传递参数的桥梁,从而确保传递数据时不被其他任务干扰,造成数据的误差。如DHT11接收到温湿度数据,将温湿度数据传输到LoRa发送数据的任务中。
|
||||||
<EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
- 2、使用到的api函数:
|
||||||
|
创建队列句柄:
|
||||||
|
```c
|
||||||
|
QueueHandle_t xQueueHandler;
|
||||||
|
```
|
||||||
|
创建队列:
|
||||||
|
```c
|
||||||
|
xQueueHandler = xQueueCreate(
|
||||||
|
(UBaseType_t) <队列的长度,单位字节>,
|
||||||
|
(UBaseType_t) <每个数据的大小>);
|
||||||
|
```
|
||||||
|
发送队列,也就是将数据存入队列,等待接收,接收时长从0到portMAX_DELAY,如下所示。
|
||||||
|
```c
|
||||||
|
xQueueSend(xQueueHandler, <要传递的变量,指向其地址>, pdMS_TO_TICKS(10));
|
||||||
|
```
|
||||||
|
在中断中发送队列(在串口初始化中设置中断抢占优先级配置拉满,且需要设置上下文转换以免造成阻塞):
|
||||||
|
```c
|
||||||
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
xQueueSendFromISR(xQueueUsart3IrqHdlr, &ulRxData, &xHigherPriorityTaskWoken);
|
||||||
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||||
|
```
|
||||||
|
接收队列,可接收普通和中断的队列:
|
||||||
|
```c
|
||||||
|
xQueueReceive(xQueueHandler, <要传递的变量,指向其地址>, portMAX_DELAY);
|
||||||
|
```
|
||||||
|
**三、信号量:**
|
||||||
|
- 1、概念:信号量一般用于任务管理。常用的分为二值信号量、计数型信号量和互斥信号量3种信号量,其中二值信号量全称为二进制信号量,用于任务同步,类似于状态机,而后两者分别用于多资源和单资源的管理,资源管理就相当于停车场,多资源管理相当于停车场的多个车位,若停车位停满车就不能停车了,单资源同理。这三种信号量都只有0或1两种值。使用信号量的过程,以二值信号量为例,为创建二值信号量->释放二值信号量->获取二值信号量。释放二值信号量共有两个函数,释放任务中信号量和释放中断中信号量。信号量和状态机类似,释放信号量就相当于改变标志位,而获取信号量相当于获取改变的标志位以决定是否改变执行器的状态。由于只有0和1两种值,因此适用于只有开和关两种状态的执行器。
|
||||||
|
- 2、使用到的api函数:
|
||||||
|
动态创建二值信号量:
|
||||||
|
```c
|
||||||
|
SemaphoreHandle_t xSemaphoreHandler;
|
||||||
|
```
|
||||||
|
发送信号量:
|
||||||
|
```c
|
||||||
|
xSemaphoreGive(xSemaphoreHandler);
|
||||||
|
```
|
||||||
|
接收信号量:(接收句柄、等待时长)
|
||||||
|
```c
|
||||||
|
if (xSemaphoreTake(xSemLedOnHdlr, pdMS_TO_TICKS(10)) == pdTRUE);
|
||||||
|
```
|
||||||
@@ -179,8 +179,8 @@ void vTaskLoRaMsgRec(void *pvParameters)
|
|||||||
|
|
||||||
void vCreateTasksList(void)
|
void vCreateTasksList(void)
|
||||||
{
|
{
|
||||||
#if defined __LED_H__
|
// #if defined __LED_H__
|
||||||
#if LED_PC13_WORK_MODE == LED_PC13_STM32_STATE_MODE
|
// #if LED_PC13_WORK_MODE == LED_PC13_STM32_STATE_MODE
|
||||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F1A3ACB2><EFBFBD><EFBFBD>ֱ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><C6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>ջ<EFBFBD><D5BB>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F1A3ACB2><EFBFBD><EFBFBD>ֱ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><C6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>ջ<EFBFBD><D5BB>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
(TaskFunction_t ) vTaskStateLed,
|
(TaskFunction_t ) vTaskStateLed,
|
||||||
@@ -189,7 +189,7 @@ void vCreateTasksList(void)
|
|||||||
(void * ) NULL,
|
(void * ) NULL,
|
||||||
(UBaseType_t ) 2,
|
(UBaseType_t ) 2,
|
||||||
(TaskHandle_t * ) &xTaskStateLedHdlr);
|
(TaskHandle_t * ) &xTaskStateLedHdlr);
|
||||||
#else
|
// #else
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
(TaskFunction_t ) vTaskLedControl,
|
(TaskFunction_t ) vTaskLedControl,
|
||||||
(char * ) "TaskName_LedControl",
|
(char * ) "TaskName_LedControl",
|
||||||
@@ -197,9 +197,9 @@ void vCreateTasksList(void)
|
|||||||
(void * ) NULL,
|
(void * ) NULL,
|
||||||
(UBaseType_t ) 2,
|
(UBaseType_t ) 2,
|
||||||
(TaskHandle_t * ) &xTaskLedCtrlHdlr);
|
(TaskHandle_t * ) &xTaskLedCtrlHdlr);
|
||||||
#endif
|
// #endif
|
||||||
#endif
|
// #endif
|
||||||
#if defined __RELAY_H__
|
// #if defined __RELAY_H__
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
(TaskFunction_t ) vTaskFanControl,
|
(TaskFunction_t ) vTaskFanControl,
|
||||||
(char * ) "TaskName_FanControl",
|
(char * ) "TaskName_FanControl",
|
||||||
@@ -207,8 +207,8 @@ void vCreateTasksList(void)
|
|||||||
(void * ) NULL,
|
(void * ) NULL,
|
||||||
(UBaseType_t ) 2,
|
(UBaseType_t ) 2,
|
||||||
(TaskHandle_t * ) &xTaskFanCtrlHdlr);
|
(TaskHandle_t * ) &xTaskFanCtrlHdlr);
|
||||||
#endif
|
// #endif
|
||||||
#if defined __DHT11_H__
|
// #if defined __DHT11_H__
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
(TaskFunction_t ) vTaskDht11,
|
(TaskFunction_t ) vTaskDht11,
|
||||||
(char * ) "TaskName_DHT11",
|
(char * ) "TaskName_DHT11",
|
||||||
@@ -216,8 +216,8 @@ void vCreateTasksList(void)
|
|||||||
(void * ) NULL,
|
(void * ) NULL,
|
||||||
(UBaseType_t ) 2,
|
(UBaseType_t ) 2,
|
||||||
(TaskHandle_t * ) &xTaskDht11Hdlr);
|
(TaskHandle_t * ) &xTaskDht11Hdlr);
|
||||||
#endif
|
// #endif
|
||||||
#if defined __LORA_H__
|
// #if defined __LORA_H__
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
(TaskFunction_t ) vTaskLoRaToGatePkt,
|
(TaskFunction_t ) vTaskLoRaToGatePkt,
|
||||||
(char * ) "TaskName_LoRaSendToGateway",
|
(char * ) "TaskName_LoRaSendToGateway",
|
||||||
@@ -232,7 +232,7 @@ void vCreateTasksList(void)
|
|||||||
(void * ) NULL,
|
(void * ) NULL,
|
||||||
(UBaseType_t ) 2,
|
(UBaseType_t ) 2,
|
||||||
(TaskHandle_t * ) &xTaskLoRaMsgRecHdlr);
|
(TaskHandle_t * ) &xTaskLoRaMsgRecHdlr);
|
||||||
#endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void vCreateQueuesList(void)
|
void vCreateQueuesList(void)
|
||||||
|
|||||||
9
STM32/Gateway_Node/EventRecorderStub.scvd
Normal file
9
STM32/Gateway_Node/EventRecorderStub.scvd
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
|
||||||
|
|
||||||
|
<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
|
||||||
|
<events>
|
||||||
|
</events>
|
||||||
|
|
||||||
|
</component_viewer>
|
||||||
File diff suppressed because one or more lines are too long
@@ -117,10 +117,30 @@
|
|||||||
<pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
|
<pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
|
||||||
</DebugOpt>
|
</DebugOpt>
|
||||||
<TargetDriverDllRegistry>
|
<TargetDriverDllRegistry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>ARMRTXEVENTFLAGS</Key>
|
||||||
|
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
|
||||||
|
</SetRegEntry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>DLGTARM</Key>
|
||||||
|
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
|
||||||
|
</SetRegEntry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>ARMDBGFLAGS</Key>
|
||||||
|
<Name></Name>
|
||||||
|
</SetRegEntry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>DLGUARM</Key>
|
||||||
|
<Name>(105=-1,-1,-1,-1,0)</Name>
|
||||||
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>ST-LINKIII-KEIL_SWO</Key>
|
<Key>ST-LINKIII-KEIL_SWO</Key>
|
||||||
<Name>-U/ -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 -WK0-R0</Name>
|
<Name>-U/ -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 -WK0-R0</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
@@ -135,12 +155,12 @@
|
|||||||
<DebugFlag>
|
<DebugFlag>
|
||||||
<trace>0</trace>
|
<trace>0</trace>
|
||||||
<periodic>1</periodic>
|
<periodic>1</periodic>
|
||||||
<aLwin>0</aLwin>
|
<aLwin>1</aLwin>
|
||||||
<aCover>0</aCover>
|
<aCover>0</aCover>
|
||||||
<aSer1>0</aSer1>
|
<aSer1>0</aSer1>
|
||||||
<aSer2>0</aSer2>
|
<aSer2>0</aSer2>
|
||||||
<aPa>0</aPa>
|
<aPa>0</aPa>
|
||||||
<viewmode>0</viewmode>
|
<viewmode>1</viewmode>
|
||||||
<vrSel>0</vrSel>
|
<vrSel>0</vrSel>
|
||||||
<aSym>0</aSym>
|
<aSym>0</aSym>
|
||||||
<aTbox>0</aTbox>
|
<aTbox>0</aTbox>
|
||||||
@@ -171,6 +191,16 @@
|
|||||||
<pszMrulep></pszMrulep>
|
<pszMrulep></pszMrulep>
|
||||||
<pSingCmdsp></pSingCmdsp>
|
<pSingCmdsp></pSingCmdsp>
|
||||||
<pMultCmdsp></pMultCmdsp>
|
<pMultCmdsp></pMultCmdsp>
|
||||||
|
<SystemViewers>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\USART2</Name>
|
||||||
|
<WinId>35905</WinId>
|
||||||
|
</Entry>
|
||||||
|
<Entry>
|
||||||
|
<Name>System Viewer\USART3</Name>
|
||||||
|
<WinId>35904</WinId>
|
||||||
|
</Entry>
|
||||||
|
</SystemViewers>
|
||||||
<DebugDescription>
|
<DebugDescription>
|
||||||
<Enable>0</Enable>
|
<Enable>0</Enable>
|
||||||
<EnableFlashSeq>0</EnableFlashSeq>
|
<EnableFlashSeq>0</EnableFlashSeq>
|
||||||
@@ -1331,7 +1361,7 @@
|
|||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>FreeRTOS/portable</GroupName>
|
<GroupName>FreeRTOS/portable</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ void vUsartSendByte(USART_TypeDef *xUsartId, uint8_t ucByte)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>麯<EFBFBD><E9BAAF>
|
* @brief <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>麯<EFBFBD><E9BAAF>
|
||||||
* @note һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<31><36><EFBFBD><EFBFBD>ģʽ<C4A3>¡<EFBFBD>uint8_t<5F><74>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>һ<EFBFBD><D2BB>Length<74><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
* @note һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<31><36><EFBFBD><EFBFBD>ģʽ<C4A3>¡<EFBFBD>uint8_t<5F><74>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>һ<EFBFBD><D2BB>Length<74><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
* @param *xUsartId ѡ<>ں<F1B4AEBF>
|
* @param *xUsartId ѡ<>ں<F1B4AEBF>
|
||||||
* @param *pucArray Ҫ<><D2AA><EFBFBD>͵<EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
* @param *pucArray Ҫ<><D2AA><EFBFBD>͵<EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
* @param usLength <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
|
* @param usLength <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ void vTaskStateLed(void *pvParameters)
|
|||||||
{
|
{
|
||||||
vPc13LedOn();
|
vPc13LedOn();
|
||||||
vTaskDelay(1000);
|
vTaskDelay(1000);
|
||||||
vUsartPrintf(USART3, "USART3 Printf Test\r%d\n", 123);
|
vUsartPrintf(USART3, "USART3 Printf Test %d\r\n", 123);
|
||||||
vPc13LedOff();
|
vPc13LedOff();
|
||||||
vTaskDelay(1000);
|
vTaskDelay(1000);
|
||||||
}
|
}
|
||||||
@@ -40,15 +40,16 @@ void vTaskWifiConnection(void *pvParameters)
|
|||||||
uint8_t ucBufferQueueRec = 0;
|
uint8_t ucBufferQueueRec = 0;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
vUsartSendString(USART2, "AT\r\n");
|
vUsartPrintf(USART2, "AT+RST\r\n");
|
||||||
vTaskDelay(1000);
|
vTaskDelay(1000);
|
||||||
ucRetvalQueueWifiSt = xQueueReceive(xQueueUsart2IrqHdlr, &ucBufferQueueRec, pdMS_TO_TICKS(30));
|
ucRetvalQueueWifiSt = xQueueReceive(xQueueUsart2IrqHdlr, &ucBufferQueueRec, pdMS_TO_TICKS(30));
|
||||||
/* code */
|
/* code */
|
||||||
if (ucRetvalQueueWifiSt == pdTRUE)
|
if (ucRetvalQueueWifiSt == pdTRUE)
|
||||||
{
|
{
|
||||||
/* code */
|
/* code */
|
||||||
vUsartSendString(USART3, (char *)&ucBufferQueueRec);
|
vUsartPrintf(USART3, (char *)&ucBufferQueueRec);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
vUsartSendString(USART3, "Queue Receive failed!\r\n");
|
vUsartSendString(USART3, "Queue Receive failed!\r\n");
|
||||||
vTaskDelay(300);
|
vTaskDelay(300);
|
||||||
@@ -95,8 +96,8 @@ void vCreateSemaphoresList(void)
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
vUsartInit(USART1, 115200);
|
|
||||||
vUsartInit(USART2, 115200);
|
vUsartInit(USART2, 115200);
|
||||||
|
vUsartInit(USART3, 115200);
|
||||||
vDelayInit();
|
vDelayInit();
|
||||||
vPc13LedInit();
|
vPc13LedInit();
|
||||||
vCreateTasksList();
|
vCreateTasksList();
|
||||||
|
|||||||
Reference in New Issue
Block a user