1.动态创建任务
#include "FreeRTOS.h"
#include "task.h"
/*
功能:动态创建一个任务,所需的RAM会自动从FreeRTOS堆中分配
参数:
参数1:任务实现函数指针(函数名)
参数2:任务名称(字符串)
参数3:任务堆栈大小,单位为字
参数4:任务传入参数
参数5:任务优先级
参数6:任务句柄
返回值:pdPASS:创建成功 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:创建失败,堆空间不足
注意:configSUPPORT_DYNAMIC_ALLOCATION必须在FreeRTOSConfig.h中设置为1,或者未定义(在这种情况下,
它将默认为1),这个RTOS API函数才会可用
*/
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
2.静态创建任务
#include "FreeRTOS.h"
#include "task.h"
/*
功能:静态创建一个任务,所需的RAM会自动从FreeRTOS堆中分配
参数:
参数1:任务实现函数指针(函数名)
参数2:任务名称(字符串)
参数3:任务堆栈大小,单位为字
参数4:任务传入参数
参数5:任务优先级
参数6:任务堆栈指针
参数7:任务控制块指针
返回值:NULL:创建失败 !=NULL:任务句柄
注意:在FreeRTOSConfig.h中必须将configSUPPORT_STATIC_ALLOCATION设置为1,这个RTOS API函数才会可用。
*/
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer );
3.挂起任务
#include "FreeRTOS.h"
#include "task.h"
/*
功能:挂起任务
参数:任务句柄,当传入NULL的时候,则挂起任务自己
返回值:无
注意:INCLUDE_vTaskSuspend必须定义为1才能使用该功能
*/
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
4.恢复任务
#include "FreeRTOS.h"
#include "task.h"
/*
功能:恢复任务
参数:任务句柄
返回值:无
注意:INCLUDE_vTaskSuspend必须定义为1才能使用该功能
*/
void vTaskResume( TaskHandle_t xTaskToResume );
5.在中断中恢复任务
#include "FreeRTOS.h"
#include "task.h"
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );
6.获取任务优先级
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );
7.设置任务优先级
void vTaskPrioritySet( TaskHandle_t xTask,
UBaseType_t uxNewPriority );
8.系统延时
#include "FreeRTOS.h"
#include "task.h"
/*
功能:使任务进入阻塞态,根据传入的参数延时多少个tick(系统节拍)
参数:延时周期;
系统节拍周期为1000Hz,延时周期时基就是1ms
系统节拍周期为100Hz,延时周期时基就是10ms
宏pdMS_TO_TICKS()可以把ms转换为tick
返回值:无
注意:INCLUDE_vTaskDelay必须置1
*/
void vTaskDelay( const TickType_t xTicksToDelay );
9.绝对延时
#include "FreeRTOS.h"
#include "task.h"
/*
功能:使任务进入阻塞态,直到一个绝对延时时间到达
参数:
参数1:记录上一次任务唤醒系统节拍值,通过xTaskGetTickCount函数获取
参数2:系统延时周期(tick)
返回值:无
注意:INCLUDE_vTaskDelayUnyil必须置1,CubeMX默认为0
*/
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,
const TickType_t xTimeIncrement );
- 注意
相对延时:即当在系统功能复杂的情况下我们想要延时10ms的时候,有可能实际延时大于10ms,因为可能在延时之前发生了中断,而中断的执行需要时间
绝对延时:即使发生中断,延时仍然为10ms
- 相对延时图解
- 绝对延时图解
- 示例
//此处延时7s
for(;;)
{
HAL_Delay(2000);
printf("Task is Runing!\r\n");
osDelay(5000);
}
//次数延时5s
TickType_t WakeTime = xTaskGetTickCount();
for(;;)
{
HAL_Delay(2000);
printf("Task is Runing!\r\n");
vTaskDelayUntil(&WakeTime, 5000);
}
10.获取系统节拍值
#include "FreeRTOS.h"
#include "task.h"
/*
功能:获取系统节拍值,从调度器开启时候就开始计数
参数:无
返回值:当前系统节拍值
*/
volatile TickType_t xTaskGetTickCount( void );
11.挂起调度器
- 系统维护一个计数uxSchedulerSuspended,每挂起一次该值+1,系统初始化的时候为0
- 当它大于0时候表示禁止调度,等于0则打开调度(允许调度)
/*
功能:挂起调度锁,即挂起所有任务
*/
void vTaskSuspendAll( void );
12.恢复调度器
/*
功能:恢复调度锁,即恢复所有任务
注意:xTaskResumeAll()只恢复调度程序。它不会取消之前通过调用vTaskSuspend()暂停的任务
*/
BaseType_t xTaskResumeAll( void );
13.创建消息队列
#include "FreeRTOS.h"
#include "queue.h"
/*
功能:创建一个消息队列并返回消息队列句柄
参数:
参数1:队列一次可容纳消息的最大长度
参数2:队列中每个消息体大小(由此可分析该数组为多为数组或者结构体数组)
返回值:NUll:创建失败 Any other value:创建成功,返回消息句柄
注意:队列可用于任务与任务之间的通信,也可用于中断与任务之间的通信,可在调度器开启之前创建消息队列
*/
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,
UBaseType_t uxItemSize );
14.发送消息
#include "FreeRTOS.h"
#include "queue.h"
/*
功能:在任务中往消息队列里面传入消息(其中xQueueSend等价于xQueueSendToBack入到队尾,xQueueSendToFront入到队头),
之所以可从队头插入是以为要处理某些紧急消息,满足实时性
参数:
参数1:消息队列句柄
参数2:要发送的消息的地址
参数3:阻塞等待时间
返回值:pdPASS:发送成功 errQUEUE_FULL:队列满,发送失败
*/
BaseType_t xQueueSend(
QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait
);
15.从中断中发送消息
#include "FreeRTOS.h"
#include "queue.h"
/*
功能:在中断中发送消息至消息队列(其中xQueueSendFromISR等价于xQueueSendToBackFromISR入到队尾,xQueueSendToFrontFromISR入到队头),之所以可从队头插入是以为要处理某些紧急消息,满足实时性
参数:
参数1:消息队列句柄
参数2:要发送的消息的地址
参数3:NULL
返回值:pdPASS:发送成功 errQUEUE_FULL:队列满,发送失败
注意:调用此函数会触发上下文切换(当前被中断的任务优先级低于解除阻塞的任务);在开启调度器之前不能调度此函数;在中断中发送消息不能被阻塞,因为中断不是任务
*/
BaseType_t xQueueSendFromISR
(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
16.接收消息
#include "FreeRTOS.h"
#include "queue.h"
/*
功能:在任务中读取消息队列
参数:
参数1:消息队列句柄
参数2:接收消息的缓冲区
参数3:阻塞等待时间
返回值:pdTRUE:接收成功 pdFALSE:接收失败,消息队列为NULL
*/
BaseType_t xQueueReceive(
QueueHandle_t xQueue,
void *pvBuffer,
TickType_t xTicksToWait
);
17.创建软件定时器
#include "FreeRTOS.h"
#include "timers.h"
/*
功能:创建一个软件定时器,并返回一个软件定时器的句柄,此处只是创建了软件定时器,并没有启动软件定时器
参数:
参数1:定时器名称(调试使用)
参数2:定时周期值(单位为tick)
参数3:自动装载标志位(pdTURE/pdFALSE)
参数4:软件定时器标识符(多态特性,即多个定时器调用同一个回调函数,根据这个标识符区分不同的软件定时器)
参数5:软件定时器回调函数(void vCallbackFunction( TimerHandle_t xTimer );)
返回值:NULL:创建失败,否则创建成功,返回事件标志组句柄
*/
TimerHandle_t xTimerCreate
( const char * const pcTimerName,
const TickType_t xTimerPeriod,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction );
18.开启软件定时器
#include "FreeRTOS.h"
#include "timers.h"
/*
功能:启动软件定时器
参数:
参数1:软件定时器句柄
参数2:发送软件定时器命令,阻塞等待时间,其内部调用的消息队列
返回值:pdPASS:消息队列已发送 pdFALL:消息队列已满
注意:configUSE_TIMERS必须置1
*/
BaseType_t xTimerStart( TimerHandle_t xTimer,
TickType_t xBlockTime );
19.重启软件定时器
#include "FreeRTOS.h"
#include "timers.h"
/*
功能:重启软件定时器.如果软件定时器已经启动,则重新计算超时时间;如果没启动,则重启软件定时器
参数:
参数1:软件定时器句柄
参数2:发送软件定时器命令,阻塞等待时间,其内部调用的消息队列
返回值:pdPASS:消息队列已发送 pdFALL:消息队列已满
注意:configUSE_TIMERS必须置1
*/
BaseType_t xTimerReset( TimerHandle_t xTimer,
TickType_t xBlockTime );
20.获取软件定时器标识符
#include "FreeRTOS.h"
#include "timers.h"
/*
功能:获取软件定时器标识符值
参数:软件定时器句柄
返回值:软件定时器标识符
*/
void *pvTimerGetTimerID( TimerHandle_t xTimer );
21.改变软件定时器周期
#include "FreeRTOS.h"
#include "timers.h"
/*
功能:改变软件定时器周期,如果软件定时器未启动,会启动软件定时器
参数:
参数1:软件定时器句柄
参数2:新的定时周期
参数3:阻塞等待时间
返回值:pdPASS:消息队列已发送 pdFALL:消息队列已满
*/
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
TickType_t xNewPeriod,
TickType_t xBlockTime );