nios2探索之uCOS-II移植

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012386878/article/details/13095471

uCOS-II知识汇总;

一、内核结构;

1、访问共享资源时,实现互斥的方法有:

(1)、关中断。关中断可以保证另一个任务或者中断服务不能访问共享资源。在应用程序代码,关中断的时间不能太长,否则会影响系统的中断响应时间。

(2)、使用测试并置位操作(TAS,Test and Set)。当两个任务共享共享资源时,约定好,先测试一个全局变量,如果变量为0,允许任务与共享资源打交道。如果中断服务也遵循这个约定,可以防止中断服务破坏共享资源。TAS可以有两种实现方法,一是处理器提供的一条不会被中断的TAS指令,二是在关中断中做TAS操作然后开中断。

(3)、禁止,然后允许任务切换。中断可以访问共享资源,但是因为不能进行任务切换,所以另一任务不能访问共享资源。禁止任务切换违背了内核的初衷。

(4)、使用信号量。这种方法是被提倡使用的。有二值信号量和计数型信号量。


2、临界区代码用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()保护,这两个宏的实现有三种方法:

(1)、OS_CRITICAL_METHOD=1,简单的用处理器的关中断和开中断指令。这样会有一个问题,如果OS_ENTER_CRITICAL()之前中断就是关的,OS_EXIT_CRITICAL()后中断就打开了,这往往不是期望的行为,应该让中断回到OS_ENTER_CRITICAL()之前的状态。

(2)、OS_CRITICAL_METHOD=2,在堆栈中保存中断的开关状态,然后关中断,重新开中断时只要从堆栈中恢复中断状态。一般使用嵌入式汇编来实现堆栈操作,但是注意,有些处理器有堆栈指针相对寻址时,如果在嵌入汇编指令改变了堆栈指针(动态地增减),所有的栈偏移量都会出现偏差,这种情况编译器是没法处理的,这会导致严重错误。

(3)、OS_CRITICAL_METHOD=3,这需要编译器的扩展功能来实现,编译器必须允许用户得到当前处理器状态字的值,并保存在C函数的局部变量中。


猜你喜欢

转载自blog.csdn.net/u012386878/article/details/13095471