共享资源:
变量(静态或全局变量)、数据结构体、RAM表格、I/O设备等。OS在使用一些资源时候,例如IO设备打印机,当任务1在使用打印机时候必须保证资源独享,避免其他任务修改打印内容导致出错,因此需要有资源共享机制。
一般推荐使用互斥信号量对共享资源实现保护
独占资源和创建临界区方法表
方法 | 优点 | 何时使用 |
---|---|---|
开关中断 | 能很快地结束访问共享资源,不推荐,会导致中断延迟 | 访问共享资源时间小于中断关闭时间 |
锁调度器 | 不推荐,有悖ucos任务切换 | 访问共享资源时间大于中断关闭时间,给调度器上锁时间短 |
信号量 | 信号量可能会造出优先级反转。然而,信号量方式的执行时间少于互斥信号量 方式 | 所有的任务可以无限期等待对共享资源的访问 |
互斥信号量 | 推荐使用这种方法访问共享资源,有内置的优先级,时间较久 | 当任务要访问的共享资源有截止时间 |
只有开关中断才能任务和中断程序共享资源。其它只能用于任务相关的资源共享。
关/开中断
和CPU 相关的操作,其相关代码被放在与CPU相关的文件中(见CPU.H)。uC/OS-III 中与CPU相关的模块叫做uC/CPU。每种架构的CPU 都需要设置相适应的uC/CPU 文件。
API | 注释 |
---|---|
CPU_SR_ALLOC() | 分配存储空间存储当前cpu的中断状态 |
CPU_CRITICAL_ENTER() | 关全局中断 |
CPU_CRITICAL_EXIT() | 开全局中断,恢复局部变量中存储的cpu中断状态 |
只有这种方法才能任务和中断程序共享资源。只要关中断的时间不比系统本身的关中断时间长,就不会影响到系统的中断延时。
锁调度器
如果任务不需要和ISR 共享资源,就可以通过锁调度器来访问共享资源。
实际上就是禁止任务调度已达到资源的独占
API | 注释 |
---|---|
OSSchedLock() | 锁调度 |
OSSchedUnlock() |