uCos-II移值(一)
os_cpu.h文件
该文件主要是完成操作系统使用的内部数据类型、常数以及宏的定义,这些都是与处理器平台密切相关的;
第一部分
以下部分定义了系统内部常用的数据类型,为了增加系统的可移植性,系统内核只使用自己定义的INT8U、INT8S等数据类型,而不使用和编译器密切相关的unsigned char、unsigned short等数据类型;
所以,在不同处理器或者不同编译器平台下,这些数据类型的长短是不同的,需要特别注意;
定义了堆栈数据类型OS_STK,这是操作系统要求且必须定义的数据类型(根据处理器使用的堆栈位数决定数据类型);
定义了保护程序状态寄存器的数据类型OS_CPU_SR,这个数据类型只有在定义了OS_CRITICAL_METHOD为3时才会被系统使用到(该数据类型由程序状态寄存器的宽度决定);
typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;     
typedef signed   char  INT8S;     
typedef unsigned short INT16U;    
typedef signed   short INT16S;    
typedef unsigned int   INT32U;    
typedef signed   int   INT32S;    
typedef float          FP32;      
typedef double         FP64;      
typedef unsigned int   OS_STK;    
typedef unsigned int   OS_CPU_SR; 
第二部分
声明了几个在外部文件中(os_cpu_a.s)定义的函数,以供操作系统使用;
void  OSCtxSw(void);                   //普通任务切换函数
void  OSIntCtxSw(void);                //中断任务切换函数
void  OSStartHighRdy(void);            //启动最高优先级任务的函数
void  OS_CPU_PendSVHandler(void);
void  OS_CPU_SysTickHandler(void);
void  OS_CPU_SysTickInit(INT32U cnts);
第三部分
宏OS_CRITICAL_METHOD定义了系统进入临界代码前后,开关中断的方式;系统规定这个宏可以有三种不同的值,不同的值对应着不同的系统开关中断宏OS_ENTER_CRITICAL()与OS_EXIT_CRITICAL()的实现;
三种不同的情况分别为:
- 当OS_CRITICAL_METHOD被定义的值为1时,采用第一种方式,即宏OS_ENTER_CRITICAL()只简单的调用处理器内部指令,关中断,宏OS_EXIT_CRITICAL()也是简单的调用处理器指令,开中断;这种方式最简单,但是会带来问题,若在进入临界段前后中断是打开的,那么这种方式不会有问题,若进入临界段前后中断是关闭的,那么在临界段代码退出后,系统中断就处于中断允许状态了;
 - 当OS_CRITICAL_METHOD被定义的值为2时,在进入临界区前,宏OS_ENTER_CRITICAL()需要将处理器程序状态寄存器(包含了中断允许标志)保存到堆栈中,然后执行关中断操作;退出临界区时,宏OS_EXIT_CRITICAL()需要从堆栈中读出前面所保存的数据并恢复到程序状态寄存器中;所以这种方式,不会改变进入临界段前后系统中断允许状态;但是同样会有出现问题的可能,堆栈如果在某种情况下被冲掉,在中断状态恢复时就会出现处理器异常;
 - 当OS_CRITICAL_METHOD被定义的值为3时,系统内每个需要调用开关中断宏的函数中都多了一个OS_CPU_SR类型的局部变量cpu_sr,该变量被用来记录程序状态寄存器(包含了中断允许标志)的值;在进入临界段时,将程序状态寄存器的值拷贝到cpu_sr中并关中断,退出临界段时将值恢复到程序状态寄存器中;
 
#define  OS_CRITICAL_METHOD   3u                           //临界区模式选择第三种
#if OS_CRITICAL_METHOD == 3u
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();} //进入临界区,定义在os_cpu_a.asm中
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);} //退出临界区
#endif
第四部分
定义了宏OS_TASK_SW(),在操作系统内部通过调用该宏来实现系统在两个任务之间的切换,这种切换是在非中断状态下,所以称为普通任务切换函数;
#define  OS_TASK_SW()   OSCtxSw() //任务切换函数OSCtxSw()定义在os_cpu_a.asm中;
定义了宏OS_STK_GROWTH,当值为1时,表示堆栈增长方向是从高地址往低地址增长;
                    
                
                
            
        
浙公网安备 33010602011771号