ucos-iii学习之资源管理

时间:2024-04-04 09:00:59

共享资源可以是:变量,结构体,内存空间,IO等。
推荐使用mutex保护共享资源。
大部分独占资源的方法是创建临界段:关中断,锁调度器,信号量,mutex。
1.关中断方式
独占共享资源的最快和最简单的方法是关中断。
关中断时间越短越好,不然会影响系统响应外部事件的及时性。
当临界段很短时可以使用关中断的方法。
只有这种方法才可以让任务和ISR共享资源。
2.锁调度器
如果任务不需要和ISR共享资源,就可以通过调度器来访问共享资源。
3.信号量
通常有两种类型的信号量:二值信号量和多值信号量。
只有任务才允许使用信号量,ISR是不允许的。

信号量相关的API函数总结
ucos-iii学习之资源管理

(1)二值信号量
人物通过“post”函数释放信号量。如果没有任务在等待这个信号量,信号量计数值会被递增。如果有任务在等待这个信号量,其中高优先级的挂起任务被就绪,但信号量计数值不会递增。
(2)信号量计数值
当共享资源同时被多个任务访问时,信号量计数值用于标记共享资源能同时被多少个任务访问。
(3)信号量需注意的事项
用信号量访问共享资源不会导致中断延迟。
访问一个简短的共享资源时,不推荐使用信号量。
信号量会导致一种严重的问题:优先级反转。
(4)信号量的结构
如果创建信号量时将信号量计数值被初始化为1,那么它就是二值信号量。
如果创建信号量时将信号量计数值被初始化大于1,那么它就是多值信号量。
信号量在使用之前必须被创建。
在访问共享资源之前任务必须通过OSSemPend()获得这个信号量。
(5)优先级反转
4.互斥信号量mutex
mutex:一种特殊类型的二值信号量,用于解决优先级反转问题。
只有任务才可以使用mutex。

mutex相关API
ucos-iii学习之资源管理

5.死锁
死锁,就是两个任务互相等待对方所占用的资源的情况。
用这些方式防止死锁:
(1)童年给一个时间不要申请多于一个mutex
(2)不要直接申请mutex(该申请放到器件驱动中和可重入函数中)
(3)在处理之前先获得全部所需要的mutex
(4)任务间以同样的顺序申请资源