没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
I
第一章:范例
在这一章里将提供三个范例来说明如何使用 µC/OS-II。笔者之所以在本书一开始就写
这一章是为了让读者尽快开始使用 µC/OS-II。在开始讲述这些例子之前,笔者想先说明一
些在这本书里的约定。
这些例子曾经用 Borland C/C++ 编译器(V3.1)编译过,用选择项产生 Intel/AMD80186
处理器(大模式下编译)的代码。这些代码实际上是在 Intel Pentium II PC (300MHz)
上运行和测试过,Intel Pentium II PC 可以看成是特别快的 80186。笔者选择 PC 做为目标
系统是由于以下几个原因:首先也是最为重要的,以 PC 做为目标系统比起以其他嵌入式环
境,如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写 EPROM,不断地向 EPROM
仿真器中下载程序等等。用户只需要简单地编译、链接和执行。其次,使用 Borland C/C++
产生的 80186 的目标代码(实模式,在大模式下编译)与所有 Intel、AMD、Cyrix 公司的
80x86 CPU 兼容。
1.00 安装
µ
C/OS-II
本书附带一张软盘包括了所有我们讨论的源代码。是假定读者在 80x86,Pentium,或
者 Pentium-II 处理器上运行 DOS 或 Windows95。至少需要 5Mb 硬盘空间来安装 uC/OS-II。
请按照以下步骤安装:
1.进入到 DOS(或在 Windows 95 下打开 DOS 窗口)并且指定 C:为默认驱动器。
2.将磁盘插入到 A:驱动器。
3.键入 A:INSTALL 【drive】
注意『drive』是读者想要将µC/OS-II 安装的目标磁盘的盘符。
INSTALL.BAT 是一个 DOS 的批处理文件,位于磁盘的根目录下。它会自动在读者指定的
目标驱动器中建立\SOFTWARE 目录并且将 uCOS-II.EXE 文件从 A:驱动器复制到\SOFTWARE
并且运行。µC/OS-II 将在\SOFTWARE 目录下添加所有的目录和文件。完成之后 INSTALL.BAT
将删除 uCOS-II.EXE 并且将目录改为\SOFTWARE\uCOS-II\EX1_x86L,第一个例子就存放在这
里。
在安装之前请一定阅读一下 READ.ME 文件。当 INSTALL.BAT 已经完成时,用户的目标目
录下应该有一下子目录:
\SOFTWARE
这是根目录,是所有软件相关的文件都放在这个目录下。
\SOFTWARE\BLOCKS
子程序模块目录。笔者将例子中µC/OS-II 用到的与 PC 相关的函数模块编译以后放在这
个目录下。
\SOFTWARE\HPLISTC
这个目录中存放的是与范例 HPLIST 相关的文件(请看附录 D,HPLISTC 和 TO)。HPLIST.C
II
存放在\SOFTWARE\HPLISTC\SOURCE 目录下。DOS 下的可执行文件(HPLIST.EXE)存放在
\SOFTWARE\TO\EXE 中。
\SOFTWARE\TO
这个目录中存放的是和范例 TO 相关的文件(请看附录 D,HPLISTC 和 TO)。源文件 TO.C
存放在\SOFTWARE\TO\SOURCE 中,DOS 下的可执行文件(TO.EXE)存放在\SOFTWARE\TO\EXE
中。注意 TO 需要一个 TO.TBL 文件,它必须放在根目录下。用户可以在\SOFTWARE\TO\EXE
目录下找到 TO.TBL 文件。如果要运行 TO.EXE,必须将 TO.TBL 复制到根目录下。
\SOFTWARE\uCOS-II
与µC/OS-II 相关的文件都放在这个目录下。
\SOFTWARE\uCOS-II\EX1_x86L
这个目录里包括例 1 的源代码(参见 1.07, 例 1),可以在 DOS(或 Windows 95 下的 DOS
窗口)下运行。
\SOFTWARE\uCOS-II\EX2_x86L
这个目录里包括例 2 的源代码(参见 1.08, 例 2),可以在 DOS(或 Windows 95 下的 DOS
窗口)下运行。
\SOFTWARE\uCOS-II\EX3_x86L
这个目录里包括例 3 的源代码(参见 1.09, 例 3),可以在 DOS(或 Windows 95 下的 DOS
窗口)下运行。
\SOFTWARE\uCOS-II\Ix86L
这个目录下包括依赖于处理器类型的代码。此时是为在 80x86 处理器上运行 uC/OS-II
而必须的一些代码,实模式,在大模式下编译。
\SOFTWARE\uCOS-II\SOURCE
这个目录里包括与处理器类型无关的源代码。这些代码完全可移植到其它架构的处理器
上。
1.01 INCLUDES.H
用户将注意到本书中所有的 *.C 文件都包括了以下定义:
#include "includes.h"
III
INCLUDE.H 可以使用户不必在工程项目中每个*.C 文件中都考虑需要什么样的头文件。
换句话说,INCLUDE.H 是主头文件。这样做唯一的缺点是 INCLUDES.H 中许多头文件在一些
*.C 文件的编译中是不需要的。这意味着逐个编译这些文件要花费额外的时间。这虽有些不
便,但代码的可移植性却增加了。本书中所有的例子使用一个共同的头文件 INCLUDES.H,3
个副本分别存放在\SOFTWARE\uCOS-II\EX1_x86L,\SOFTWARE\uCOS-II\EX2_x86L,以及
\SOFTWARE\uCOS-II\EX3_x86L 中。当然可以重新编辑 INCLUDES.H 以添加用户自己的头文
件。
1.02 不依赖于编译的数据类型
因为不同的微处理器有不同的字长,µC/OS-II 的移植文件包括很多类型定义以确保可
移植性(参见\SOFTWARE\uCOS-II\Ix86L\OS_CPU.H,它是针对 80x86 的实模式,在大模式下
编译)。µCOS-II 不使用 C 语言中的 short,int,long 等数据类型的定义,因为它们与处理器
类型有关,隐含着不可移植性。笔者代之以移植性强的整数数据类型,这样,既直观又可移
植,如表 L1.1 所示。为了方便起见,还定义了浮点数数据类型,虽然µC/OS-II 中没有使用
浮点数。
程序清单 L1.1 可移植型数据类型。
Typedef unsigned char BOOLEAN;
Typedef unsigned char INT8U;
Typedef signed char INT8S;
Typedef unsigned int INT16U;
Typedef signed int INT16S;
Typedef unsigned long INT32U;
Typedef signed long INT32S;
Typedef float FP32;
Typedef double FP64;
#define BYTE INT8S
#define UBYTE INT8U
#define WORD INT16S
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U
IV
以 INT16U 数据类型为例,它代表 16 位无符号整数数据类型。µC/OS-II 和用户的应用
代码可以定义这种类型的数据,范围从 0 到 65,535。如果将µCO/S-II 移植到 32 位处理器
中,那就意味着 INT16U 不再不是一个无符号整型数据,而是一个无符号短整型数据。然而
将无论µC/OS-II 用到哪里,都会当作 INT16U 处理。 表 1.1 是以 Borland C/C++编译器为
例,为 80x86 提供的定义语句。为了和µC/OS 兼容,还定义了 BYTE,WORD,LONG 以及相应的
无符号变量。这使得用户可以不作任何修改就能将µC/OS 的代码移植到µC/OS-II 中。之所
以这样做是因为笔者觉得这种新的数据类型定义有更多的灵活性,也更加易读易懂。对一些
人来说,WORD 意味着 32 位数,而此处却意味着 16 位数。这些新的数据类型应该能够消除
此类含混不请
1.03 全局变量
以下是如何定义全局变量。众所周知,全局变量应该是得到内存分配且可以被其他模块
通过 C 语言中 extern 关键字调用的变量。因此,必须在 .C 和 .H 文件中定义。这种重复
的定义很容易导致错误。以下讨论的方法只需用在头文件中定义一次。虽然有点不易懂,但
用户一旦掌握,使用起来却很灵活。表 1.2 中的定义出现在定义所有全局变量的.H 头文件
中。
程序清单 L
1.2
定义全局宏。
#ifdef xxx_GLOBALS
#define xxx_EXT
#else
#define xxx_EXT extern
#endif
.H 文件中每个全局变量都加上了 xxx_EXT 的前缀。xxx 代表模块的名字。该模块的.C 文件
中有以下定义:
#define xxx_GLOBALS
#include "includes.h"
当编译器处理.C 文件时,它强制 xxx_EXT(在相应.H 文件中可以找到)为空,(因为
xxx_GLOBALS 已经定义)。所以编译器给每个全局变量分配内存空间,而当编译器处理其他.C
V
文件时,xxx_GLOBAL 没有定义,xxx_EXT 被定义为 extern,这样用户就可以调用外部全局
变量。为了说明这个概念,可以参见 uC/OS_II.H,其中包括以下定义:
#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif
OS_EXT INT32U OSIdleCtr;
OS_EXT INT32U OSIdleCtrRun;
OS_EXT INT32U OSIdleCtrMax;
同时,uCOS_II.H 有中以下定义:
#define OS_GLOBALS
#include “includes.h”
当编译器处理 uCOS_II.C 时,它使得头文件变成如下所示,因为 OS_EXT 被设置为空。
INT32U OSIdleCtr;
INT32U OSIdleCtrRun;
INT32U OSIdleCtrMax;
这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C 文件时,头文件变成
了如下的样子,因为 OS_GLOBAL 没有定义,所以 OS_EXT 被定义为 extern。
extern INT32U OSIdleCtr;
extern INT32U OSIdleCtrRun;
extern INT32U OSIdleCtrMax;
在这种情况下,不产生内存分配,而任何 .C 文件都可以使用这些变量。这样的就只需在 .H
文件中定义一次就可以了。
剩余341页未读,继续阅读
资源评论
mochou99
- 粉丝: 1
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功