FreeRTOS资源管理

FreeRTOS资源管理

概览

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

常见情况:

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

临界区与挂起调度器

基本临界区

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

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

挂起调度器

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

互斥量

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

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

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

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

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

资源管理API

API功能
vTaskSuspendAll挂起调度器
xTaskResumeAll唤醒调度器
xSemaphoreCreateMutex创建互斥量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值