IT业行者,行者无疆
分类: 嵌入式
2010-09-27 09:25:12
from:
http://fangheng1005.blog.163.com/
INCLUDES.H文件
这个文件很简单,邵译书上要求所有的用户文件必须包含这个文件,但是ZLG的移植代码上又定义了一个CONFIG.H文件,你只需要,也是必须包含这个文件就可以了,在CONFIG.H文件已经包含了INCLUDES.H文件,好的,下面来说这个文件的代码吧
#include
#include
#include
这个就是你的OS源代码的相关路径啦,不要写错了哦,否则找不到源代码,你就。。。。。。。
肯定没戏了阿,还用说阿。
#define OSIntCtxSw()
至今也不是理解的很清楚,OSIntCtxSw()函数共在两个地方调用,一个是在OS_CPU_A.S文件中,另一个是在OS_CORE.C中,个人觉得是在OS_CORE.C文件中调用的是这个宏,就是return啦,而在OS_CPU_A.S文件中调用的是它自己的汇编语言啦,不知道对不对。
OS_CPU.H文件
#ifdef
#define OS_CPU_EXT
#else
#define OS_CPU_EXT
#endif
所有的全局变量的定义使用OS_CPU_EXT来定义,根据预编译方式,能自动识别,即自动加extern关键字,或者不加。还不懂啊???看邵译的书吧!
typedef unsigned char
typedef unsigned char
typedef signed
typedef unsigned short INT16U;
typedef signed
typedef unsigned int
typedef signed
typedef float
typedef double
typedef INT32U
定义OS统一使用的数据类型。这很容易理解,不用解释了。哈哈!记着哦,堆栈结构是32位的哦。
#define
本次ZLG移植采用的是方式2来开关中断,共有3种方式,邵贝贝书上有写,自己看啦。算了,写出来吧,方法2是执行OS_ENTER_CRITICAL()的第二个方法是先将中断禁止状态保存到堆栈中,然后禁止中断。而执行OS_EXIT_CRITICAL()的时候只是从堆栈中恢复中断状态。如果用这个方法的话,不管用户是在中断禁止还是允许的情况下调用µC/OS-Ⅱ服务,在整个调用过程中都不会改变中断状态。
#define OS_STK_GROWTH
ARM支持两种堆栈的生长方式,但是不幸的是ADS只支持一种,就是我们定义的这种了,呵呵。
#define
#define
#define
定义几个常量而已,后边会有使用的。
#ifndef USER_USING_MODE
#define
#endif
#ifndef OS_SELF_EN
#define
#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
__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)