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时,表示堆栈增长方向是从高地址往低地址增长;

转载于:https://www.cnblogs.com/jasontian996/p/10787102.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值