Chinaunix首页 | 论坛 | 博客
  • 博客访问: 665806
  • 博文数量: 255
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 2811
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-09 13:29
个人简介

IT业行者,行者无疆

文章分类

全部博文(255)

文章存档

2011年(121)

2010年(134)

我的朋友

分类: 嵌入式

2010-09-27 09:25:12

ARM在UC/OS II的移植日记(连载2)

from:

http://fangheng1005.blog.163.com/


INCLUDES.H文件

这个文件很简单,邵译书上要求所有的用户文件必须包含这个文件,但是ZLG的移植代码上又定义了一个CONFIG.H文件,你只需要,也是必须包含这个文件就可以了,在CONFIG.H文件已经包含了INCLUDES.H文件,好的,下面来说这个文件的代码吧

#include    "..\..\arm\os_cpu.h"

#include    "os_cfg.h"

#include    "..\..\source\ucos_ii.h"

这个就是你的OS源代码的相关路径啦,不要写错了哦,否则找不到源代码,你就。。。。。。。

肯定没戏了阿,还用说阿。

 

 

 

#define OSIntCtxSw()    return

至今也不是理解的很清楚,OSIntCtxSw()函数共在两个地方调用,一个是在OS_CPU_A.S文件中,另一个是在OS_CORE.C中,个人觉得是在OS_CORE.C文件中调用的是这个宏,就是return啦,而在OS_CPU_A.S文件中调用的是它自己的汇编语言啦,不知道对不对。

 

OS_CPU.H文件

#ifdef  OS_CPU_GLOBALS

#define OS_CPU_EXT

#else

#define OS_CPU_EXT  extern

#endif

所有的全局变量的定义使用OS_CPU_EXT来定义,根据预编译方式,能自动识别,即自动加extern关键字,或者不加。还不懂啊???看邵译的书吧!

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 INT32U         OS_STK;     

定义OS统一使用的数据类型。这很容易理解,不用解释了。哈哈!记着哦,堆栈结构是32位的哦。

#define     OS_CRITICAL_METHOD     2           

本次ZLG移植采用的是方式2来开关中断,共有3种方式,邵贝贝书上有写,自己看啦。算了,写出来吧,方法2是执行OS_ENTER_CRITICAL()的第二个方法是先将中断禁止状态保存到堆栈中,然后禁止中断。而执行OS_EXIT_CRITICAL()的时候只是从堆栈中恢复中断状态。如果用这个方法的话,不管用户是在中断禁止还是允许的情况下调用µC/OS-Ⅱ服务,在整个调用过程中都不会改变中断状态。

 

 

#define OS_STK_GROWTH    1               

ARM支持两种堆栈的生长方式,但是不幸的是ADS只支持一种,就是我们定义的这种了,呵呵。

#define     USR32Mode       0x10            

#define     SYS32Mode       0x1f             

#define     NoInt           0x80

定义几个常量而已,后边会有使用的。

 

#ifndef USER_USING_MODE

#define    USER_USING_MODE   USR32Mode     

#endif

 

#ifndef OS_SELF_EN

#define    OS_SELF_EN     0                    

#endif

固化???靠,没用过,不懂,以后再学习吧。

 

OS_CPU_EXT INT32U OsEnterSum;        

这是周立功的人自己定义的变量,主要用来解决中断嵌套及每个任务开关中断次数相互独立的问题,不知道本人这样理解对不对。

 

__swi(0x00) void OS_TASK_SW(void);             

__swi(0x01) void _OSStartHighRdy(void);        

__swi(0x02) void OS_ENTER_CRITICAL(void);      

__swi(0x03) void OS_EXIT_CRITICAL(void);       

__swi(0x40) void *GetOSFunctionAddr(int Index);

__swi(0x41) void *GetUsrFunctionAddr(int Index);

__swi(0x42) void OSISRBegin(void);             

__swi(0x43) int  OSISRNeedSwap(void);          

__swi(0x80) void ChangeToSYSMode(void);        

__swi(0x81) void ChangeToUSRMode(void);        

__swi(0x82) void TaskIsARM(INT8U prio);        

__swi(0x83) void TaskIsTHUMB(INT8U prio);      

ARM支持软件中断方式,ZLG利用了软件中断方式做了一些特定的函数,实现特定的功能,就是调用这个函数的时候产生一次中断,进入管理模式,进行一些特定功能的函数,比如任务切换、开中断、关中断等等,其实应该也有其它方式来实现这些函数的,但是ZLG就是采用了这种方式,呵呵,不过本人感觉,这种方式切实很棒的哦!其实本人觉得是因为移植中有一些函数必须在特权模式下完成,管理模式就是其中的一种特权模式啦,所以软件中断这种方式自然就被采用了。

(待续连载3)

阅读(756) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~