知识点
STACK 任务堆栈: N * 4 字节
HEAP 堆:给FreeRTOS系统分配的总内存空间(包括堆栈)
如果正在运行的任务不是一个循环,或者存在返回,FreeRTOS就会重启MCU
在中断函数中调用FreeRTOS的专用中断函数(xxxFromISR),需要用 portYIELD_FROM_ISR() 进行任务调度,参数由中断函数提供
函数
任务相关函数
FreeRTOS系统运行的基本事件
xTaskCreate() 创建任务
xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
参数一:函数名
参数二:字符串函数名
参数三:堆栈大小
参数四:传递给任务的参数
参数五:优先级
参数六:任务句柄
返回:无
使用 FreeRTOS的 HEAP 的内存空间进行创建
xTaskCreateStatic() 创建静态任务
xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer )
参数一:函数名
参数二:字符串函数名
参数三:堆栈大小
参数四:传递给任务的参数
参数五:优先级
参数六:堆栈存放空间 (StackType_t 类型的数组)
参数七:任务控制块(StaticTask_t类型定义一个变量就行)
返回:任务句柄
直接用MCU的内存创建任务,不使用FreeRTOS的 HEAP 的内存空间进行创建
taskENTER_CRITICAL() 进入临界区
taskENTER_CRITICAL_FROM_ISR() 进入中断临界区
进入临界区后的代码不会被其他任务打断
taskEXIT_CRITICAL() 退出临界区
taskEXIT_CRITICAL_FROM_ISR() 退出中断临界区
uxTaskGetStackHighWaterMark() 查看任务剩余堆栈
vTaskSuspend(TaskHandle_t xTaskToSuspend) 将一个任务挂起
参数一:将被挂起的任务句柄,下同
返回:无
vTaskResume(TaskHandle_t xTaskToResume) 恢复被挂起的任务
xTaskGetCurrentTaskHandle()获取当前运行中任务的句柄
vTaskGetInfo()获取某个任务的信息
vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t * pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState )
参数一:任务句柄
参数二:返回TaskStatus_t类型的任务信息结构体
参数三:是否在返回的TaskStatus_t类型中返回 任务剩余的堆栈空间大小(usStackHighWaterMark)
参数四:指定任务的运行状态。因为获取任务的运行状态很耗时间,所以指定任务运行状态后该函数就不会去获取任务运行状态,设置为”eInvalid”后,该函数会去获取任务运行状态。
返回:无
uxTaskGetStackHighWaterMark( TaskHandle_t xTask )获取某个任务堆栈的历史剩余最小值
参数填NULL则表示获取当前任务堆栈的历史剩余最小值
xTaskGetTickCount()获取系统时间计数器值
返回:返回自任务调度器启动后的时钟节拍值,由系统configTICK_RATE_HZ决定,比如1000,那就是1ms
队列相关函数
用于任务与任务之间的数据传输,数据先进先出
xQueueCreate() 动态创建队列,返回队列句柄
xQueueCreateStatic() 静态创建队列,返回队列句柄
xQueueGenericCreate() 动态创建队列,可选队列类型
queueQUEUE_TYPE_BASE普通的消息队列
queueQUEUE_TYPE_SET队列集
queueQUEUE_TYPE_MUTEX互斥信号量
queueQUEUE_TYPE_COUNTING_SEMAPHORE计数型信号量
queueQUEUE_TYPE_BINARY_SEMAPHORE二值信号量
queueQUEUE_TYPE_RECURSIVE_MUTEX递归互斥信号量函数
xQueueCreate()创建队列的时候此参数默认选择的就是queueQUEUE_TYPE_BASE
xQueueGenericCreateStatic() 静态创建队列,可选队列类型
xQueueSend() 向队列末端添加队列项消息
xQueueSendFromISR() 中断使用
xQueueSendToFront() 向队列前段添加队列项数据
xQueueSendToFrontFromISR()中断使用
xQueueOverwrite() 向队列末端添加队列项消息,把旧的队列项数据挤出去
xQueueOverwriteFromISR()中断使用
xQueueReceive()从队列中读出队列项数据,并且删除这个队列项
xQueueReceiveFromISR()中断使用
xQueuePeek()从队列中读出队列项数据,但不删除这个队列项
xQueueReceiveFromISR()中断使用
uxQueueSpacesAvailable() 获取队列剩余大小
uxQueueMessagesWaiting()获取队列已使用大小
我傻逼了,不更了= –
我是菜逼,我又来更了
信号量
顾名思义,用来给任务之间传递信号,很像我一直在用的标志位,本质上就是个队列
类别:
二进信号量、计数型信号量、互斥信号量、递归互斥信号量
二进信号量:用做为开和关的通知
计数型信号量:释放计数+1,获取计数-1,Count获取当前计数
互斥信号量:我理解的是用做任务的切换,比如一些任务不能同时进行,就需要任务之间不断的释放和获取互斥信号量
递归互斥信号量:可以被同一个任务多次获取,但是释放的时候,获取了几次就要释放几次,我理解的用处就是用在不断需要确认的地方
xSemaphoreGiveFromISR() 在中断中释放信号量
不能对互斥信号量使用,因为互斥信号量有优先级设置,而中断没有优先级设置(指的是处于FreeRTOS管理之外的,单片机的中断任务)
xSemaphoreTakeFromISR()在中断中获取信号量
不能对互斥信号量使用,因为互斥信号量有优先级设置,而中断没有优先级设置(指的是处于FreeRTOS管理之外的,单片机的中断任务)