FreeRTOS资源管理

FreeRTOS资源管理

概览

在多任务环境中,资源访问可能不是原子操作,可能会导致资源的不一致

常见情况:

1.访问外设
比如,不同优先级的任务同时进行LCD的打印,可能会出现乱码。
2.读-写-改操作
读内存到寄存器,写寄存器,写回内存。
这种操作是非原子的,可能会被中断。
类似数据库的脏数据。
3.变量的非原子操作
更新重要的结构体或者大于体系结构自然长度的变量。
变量很大,可能会被中断,导致数据丢失或者损坏。
4.函数重入
如果一个函数除了访问自己栈空间上分配的数据
或者是内核寄存器中的数据外,不会访问其他任何数据,
则该函数是可重入的。

临界区与挂起调度器

基本临界区

基本临界区是指宏taskENTER_CRITICAL和taskEXIT_CRITICAL之间的代码区间。
基本临界区的代码不会切换到其他任务。
临界区是一种非常简单的实现方法,临界区的工工作仅仅是简单的把中断全部关掉。

临界区必须只有很短的时间,否则会影响中断相应时间。
临界区的嵌套是安全内核维护了嵌套深度计数,临界区只会在深度为0时才退出。

挂起调度器

可以通过挂起调度器来创建临界区,保护一段代码不会被其他任务打断。
可以使用vTaskSuspendAll挂起,使用xTaskResumeAll恢复

互斥量

互斥量是一种特殊的二值信号量,用于控制两个或者多个任务间访问共享资源。
互斥量和二值信号量的区别:
a.用于互斥的信号量必须归还
b.用户同步的信号通常是完成之后便丢弃,不再归还

1.优先级反转
高优先级的任务依赖低优先级任务的信号量,导致高优先级任务等待低优先级任务。

2.优先级继承
优先级继承暂时地将互斥量持有者的优先级提升至所有等待此互斥量的任务所具有的最高优先级。
互斥量持有者在归还互斥量时,优先级自动设置为其原来的优先级。

3.死锁
死锁是互斥功能的另一个潜在缺陷。
当两个任务在等待被对方持有资源时,两个任务都无法再继续执行。

守护任务
守护任务时对某一资源唯一具有所有权的任务。

资源管理API

API 功能
vTaskSuspendAll 挂起调度器
xTaskResumeAll 唤醒调度器
xSemaphoreCreateMutex 创建互斥量

猜你喜欢

转载自blog.csdn.net/zhangshuaiisme/article/details/84328580