Files
FreeRTOS_LoRa_Environment_A…/STM32/Environment_Node/README.md

2.9 KiB
Raw Blame History

项目实现逻辑: 一、环境监测节点: 1、创建任务创建了led状态任务、温湿度检测任务和向网关节点传输数据三个任务。 2、创建消息队列温湿度检测任务将采集到的温湿度数据通过队列发送到传输数据任务实现数据的保护。在中断服务函数中创建串口接收队列同时新建一个所有执行器检测状态的任务用于分析串口队列数据是否符合触发条件若符合则触发二值信号量反之则不触发。 3、创建中断触发消息队列在串口3创建消息队列当串口3接收到消息触发中断后将消息传送到消息队列同时创建一个任务用于接收消息队列。 本系统在FreeRTOS中引用的api 一、多任务创建与运行: 1、概念通过定义任务句柄、名称、优先级从而实现多任务同时在单核的单片机中以并发或抢占的形式运行。在FreeRTOS中时钟源频率通常被设定为1kHz(#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ))时间片1tick也就是1ms。在任务优先级相同的情况下多个任务按照一个时间片切换运行也就是轮询式调度当其中一个任务的优先级较高时数值较高该任务会打断其他任务的运行也就是抢占式调度。在创建任务后会产生任务控制块简称TCBTCB在切换任务的时候会将创建任务的指针保存到创建的栈里也就是保存任务现场直到任务切换过来后再复原现场。FreeRTOS的任务分为4个状态分别为就绪态、运行态、挂起态和阻塞态当其中一个任务遇到延时等情况会进入到阻塞态会执行其他任务知道延时结束低优先级任务被高优先级任务打断也同理。 2、使用到的api函数 任务函数void vTask(void *<参数>); 创建任务函数TaskHandle_t xTaskHandler; xTaskCreate( (TaskFunction_t ) vTask, (char * ) "<定义一个任务名称>", (configSTACK_DEPTH_TYPE) 1024, (void * ) NULL, (若有参数则写参数名称) (UBaseType_t ) 2,(优先级,数字越大优先级越高) (TaskHandle_t * ) &xTaskHandler); 启动任务调度函数vTaskStartScheduler(); 二、消息队列: 1、概念在初始化消息队列函数种有两个参数第一个是队列的长度,也就是这个队列能存放多少个数据第二个参数就是每个数据的大小单位为字节在stm32中uint8_t指针的长度一般是4字节。在多个任务需要共用一个变量值以传递数据的时候使用消息队列可以很好地保护数据的传输不会被其他用到相关变量的任务干扰。消息队列通过发送队列和接收队列的函数将不同的任务搭建起一个传递参数的桥梁从而确保传递数据时不被其他任务干扰造成数据的误差。如DHT11接收到温湿度数据将温湿度数据传输到LoRa发送数据的任务中。 2、使用到的api函数 三、信号量: 1、概念信号量一般用于任务管理。常用的分为二值信号量、计数型信号量和互斥信号量3种信号量,其中二值信号量全称为二进制信号量用于任务同步类似于状态机而后两者分别用于多资源和单资源的管理资源管理就相当于停车场多资源管理相当于停车场的多个车位若停车位停满车就不能停车了单资源同理。这三种信号量都只有0或1两种值。使用信号量的过程以二值信号量为例为创建二值信号量->释放二值信号量->获取二值信号量。释放二值信号量共有两个函数释放任务中信号量和释放中断中信号量。信号量和状态机类似释放信号量就相当于改变标志位而获取信号量相当于获取改变的标志位以决定是否改变执行器的状态。由于只有0和1两种值因此适用于只有开和关两种状态的执行器。 2、使用到的api函数 动态创建二值信号量: