FreeRTOS学习笔记

知识点

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管理之外的,单片机的中断任务)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇