uC/OS II在pc上的移植与实现
本周的工作:将uC/OS II在pc上的移植并实现了一个例子,本身步骤并不难,但是由于使用软件年代久远(Borland C++ 4.5),整个系统在DOS下调用,故系统调试较为复杂,搜遍网上的百家之言,鲜有将问题描述得很全面的,往往只能在某一种情况下行得通,在此总结近几天的摸索,希望能较为全面的阐述uC/OS II在pc上的移植的全部步骤。
首先要明确:我们在网上能得到的uC/OS II压缩包,有80%都是来自于邵贝贝所译的Jean J.Labrosse 著的《嵌入式实时操作系统》一书(以及原版)后所附带的光盘。所以推荐找这本书来看看,里面详细的介绍了整个操作系统的结构,并附加了四个例子,以帮助理解。将压缩包解压出来(例如到C:根目录下),得到SOFTWARE文件夹就是整个系统的源代码——当然,里面有作者给的例程了。
C: \SOFTWARE
——这是根目录,是所有软件相关的文件都放在这个目录下。
+ C:\SOFTWARE\BLOCKS
——子程序模块目录。作者将例子中μC/OS-II用到的与PC相关的函数模块编译以后放在这个目录下。
+ C:\SOFTWARE\HPLISTC
——这个目录中存放的是与范例HPLIST相关的文件。HPLIST.C存放在C:\SOFTWARE\HPLISTC \SOURCE目录下。DOS下的可执行文件(HPLIST.EXE)存放在C:\SOFTWARE\TO\EXE中。
+ C:\SOFTWARE\TO
——这个目录中存放的是和范例TO相关的文件。
源文件TO.C存放在C:\SOFTWARE\TO\SOURCE 中, DOS下的可执行文件(TO.EXE)存放在C:\SOFTWARE\TO\EXE中。注意TO需要一个TO.TBL文件,它必须放在根目录下。用户可以在C:\SOFTWARE\TO\EXE目录下找到TO.TBL文件。如果要运行TO.EXE,必须将TO.TBL复制到根目录下。
+ C: \SOFTWARE\uCOS-II
——与μCOS-II 相关的文件都放在这个目录下。
# C:\SOFTWARE\uCOS-II\EX1_x86L
# C:\SOFTWARE\uCOS-II\EX2_x86L
# C: \SOFTWARE\uCOS-II\EX3_x86L
# C: \SOFTWARE\uCOS-II\Ix86L
——这些是作者给出的例程
# C: \SOFTWARE\uCOS-II\SOURCE
——这个目录里包括与处理器类型无关的源代码。这些代码完全可移植到其
它架构的处理器上。
说完了操作系统,再说下编译环境的问题。由于整个uC/OS-II都是在borland C++3下写出来的,所以推荐使用borland C3.1也可以,不过4.5支持asm的内嵌编译,故推荐。5.0以上没试过,不过4.5就可以,何必找更复杂的呢?VC在中国虽说随处可见,不过据说不支持编译uC/OS-II。没试过,不过VC参数设置之复杂,就算能编译,估计也要让人抓狂!
当然,要移植,就不得不和底层的硬件打交道,就不得不使用汇编,那么还差TASM这个利器。在此我使用的是TASM5.0。以上两个软件如果带安装程序(install.exe)的就方便许多了。否则还要在相关参数设置中设置正确的路径,否则连最简单的hello world都遍不同。
两个软件安装完以后是最重要的一步:设置环境变量!不设置的话bc就会提示“cannot locate tasm.exe”此时就算你亲自把tasm.exe拷到bc45/bin下都没有用。本人就在此干卡两天,其间试过各江湖大虾的偏方如:找高版本TASM,用默认路径等等,均不管用。其实就是个路径问题,使得bc找不到TASM。解决方法:右键单击我的电脑--->属性--->高级--->环境变量--->弹出“环境变量”对话框。在“用户变量”列表中找到path,不出意外,路径里面没有包含TASM的正确路径,添加之(C:\TASM\BIN;)。
编译方法,上星期的一篇文章中已经讲得很明白了,有两种方法。第一种利用例子中给出的MAKETEST.BAT文件通过调用BC下相关命令编译连接出可执行文件。这种方法适合在纯DOS的环境下操作,不存在路径的问题。不过前提是你要会编写批处理文件。
第二种方法是用BC这个集成开发环境,如果你已经正确设置了BC45。向BC45下INCLUDE目录拷贝这几个文件:INCLUDES.H、OS_CFG.H、OS_CPU.H、PC.H四个文件,当然,在INCLUDES.H中要修改其路径为BC45下的路径即
/*
#include "\software\ucos-ii\ix86l\bc45\os_cpu.h"
#include "os_cfg.h"
#include "\software\ucos-ii\source\ucos_ii.h"
#include "\software\blocks\pc\bc45\pc.h"
*/
#include "c:\bc45\include\os_cpu.h"
#include "c:\bc45\include\os_cfg.h"
#include "c:\bc45\include\pc.h"
#include "c:\bc45\include\ucos_ii.h"
然后在BC45的IDE中新建ide工程,应用工程、DOS(standard)、Large。然后添加工程所需要的文件,当然,这就是你裁剪功能后的uCOS_II系统文件以及你自己的应用程序源文件了。当然,这里因为是在PC上,PC功能函数模块也需要添加,这在其他CPU上应该是不一样的。具体文件是:OS_CPU_C.C、OS_CPU_A.ASM、uCOS_II.C、PC.C、test.c。
如果要编译例程一,相关文件具体路径如下:
SOFTWARE\ucos_ii\ix86\os_cpu_a.asm
SOFTWARE\ucos_ii\ix86\os_cpu_c.c
SOFTWARE\ucos_ii\ex1_x86l\bc45\source\test.c
SOFTWARE\blocks\pc\bc45\pc.c
SOFTWARE\ucos_ii\source\ucos_ii.c
这样,就可以compile、make all、build all了。
如果要编译例二,只需要把例二的test.c替换即可。当然最好是自己写。asm等文件的编写可参见原作者的那本书,讲得很透彻,毕竟就是他自己写的系统啊!
最后在此总结一句:其实没什么大不了的就是路径的问题。
附:环境变量
是包含关于系统及当前登录用户的环境信息的字符串,一些软件程序使用此信息确定在何处放置文件(如临时文件).
环境变量相当于给系统或用户应用程序设置的一些参数, 具体起什么作用这当然和具体的环境变量相关. 比如path, 是告诉系统, 当要求系统运行一个程序而没有告诉它程序所在的完整路径时, 系统除了在当前目录下面寻找此程序外, 还应到哪些目录下去寻找; 再如tc或vc++中, set include=path1;path2; 是告诉编译程序到哪里去找.h类型的文件; 当然不仅仅是指定什么路径, 还有其它的作用的, 如set dircmd=/4 设置一个环境变量的作用是在使用dir命令时会把/4作为缺省的参数添加到你的dir命令之后, 就像你的每个命令都加了/4参数, 它实际上是给命令解释程序command设置的一个环境变量, 并且是给dir这个内部命令设置的。
很多朋友会在自己的计算机上安装双系统,例如C盘安装Windows 98,D盘安装Windows XP。可是某些软件往往只在Windows 98系统中安装,Windows XP系统中是无法正常使用的,比较麻烦却有效的方法是再安装一遍。当我们了解了环境变量中的用途后就可以很好解决双系统的软件共用问题。 (注:修改环境变量的方法可行,但对于某些大型软件来说,需要修改的参数太多,还不如重新安装一边省事!)
环境变量设置方法
在windows操作系统中可以通过我的电脑-〉属性-〉高级,来设置系统的环境变量,然而在此设置的环境变量是否在注册表中具有对应的项呢?答案是肯定的。而在.net 中提供了一个类来获取系统的环境变量及其值。
环境变量分为两类:用户变量与系统变量,在注册表中都有对应的项。
其中用户变量所在位置:
HKEY_CURRENT_USER\Environment;
系统变量所在位置为:\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001
\Control\Session Manager\Environment。
另外也可以右击我的电脑——高级——环境变量——在系统变量里有path选项——双击打开——在原有变量的基础上添加英文状态下的分号——然后将路径名输入即可。(切记,不要删除原先的系统变量,只要用分号隔开,然后添加)
常见环境变量
%ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
%APPDATA% 局部 返回默认情况下应用程序存储数据的位置。
%CD% 局部 返回当前目录字符串。
%CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
%ERRORLEVEL% 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSEVER% 局部 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值: x86,IA64。
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_LEVEL% 系统 返回处理器的版本号。
%PROMPT% 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
%SYSTEMROOT% 系统 返回 Windows XP 根目录的位置。
%TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time。
%USERDOMAIN% 局部 返回包含用户帐户的域的名称。
%USERNAME% 局部 返回当前登录的用户的名称。
%UserPrefix% 局部 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。