1 导言
uCOS-II是一个矮小而功用强壮的实时嵌入式操作体系。在Jean J.Labrosse先生所着。由邵贝贝教授翻译的Micro/uCOS-II THE REAL-TIME KERNEL(Second Edition)一书中对这一操作体系作出了精彩的解说,该书是一部关于uCOS-II操作体系的经典教材,一起在书中供给了关于uCOS-II在windows环境下的移植的4个典范。本文对其第一个典范作一个在redhat linux9.0上的移植版别。移植的作业首要会集在三个方面,下文将分为三章,结合代码具体介绍。文章的最终将介绍我的实验渠道并演示我的实验成果。
2 字符串的显现
字符串显现函数PC-DispStr在文件pc.c中,这个文件自身不是uCOS-II的一部分。它的首要作业是树立一系列的功用函数来发挥PC机的强壮功用,并被测验代码所调用。
2.1 设置前风光和后风光
咱们运用相似于prinf(33[30m)的句子来设置色彩。转义序列便是一个让shell履行一个特别过程的控制指令。转义序列一般都是以ESC最初(这也是它的命名原因)。在shell里表明为^[.这种表明法需求一点时刻去习惯, 也能够用33完结相同的工怍(ESC的ASCII码用十进制表明便是27,=用八进制表明的33)。33声明晰转义序列的开端,然后是[开端界说色彩。下面咱们要挑选前风光(这儿是32,代表绿色)。背风光的40表明黑色。要是不想让提示符后边的文字也变成绿色,咱们用33[0m封闭转义序列,33[0m是shell的默许色彩。前风光和背风光都有8种可用的挑选。可选色彩:赤色、绿色、黄色、蓝色、洋红、青色和白色。他们对应的色彩代码是:30(黑色)、31(赤色)、32(绿色)、33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)。用相同色办法设置背风光,不过要把第一个数字3替换成4,例如40、41、42、43、44、45、46、47.尽管在这儿能够依照上面介绍的对应联系界说修改在pc.h中界说的前风光和后风光的宏,使对应联系愈加清晰。(留意:他的后边一位表明前风光,前面一位表明后风光),可是咱们在这儿的规划思路是尽量不对原书中的代码作改动,所以在函数的完成中直接运用switch句子,对相应的前风光和后风光 .(linux的shell只支撑以上几种色彩)
switch (color0xF0) /*检查前风光*/
{ case DISP_FGND_BLACK: printf(33[30m);break;
……
}
switch(color0x0F) /*检查后风光*/
{ case DISP_BGND_BLACK: prinf (33[40m);
break;
……
}
2.2盯梢光标的方位
我运用printf(33[%u;%uH,y+1,x+1)来盯梢光标的方位。33是声明晰转义序列的开端,上文现已介绍,不再累叙,[y;xH是设置光标方位的格局。x和y别离表明横轴和纵轴。
3 键盘输入
键盘输入函数PC_GetKey在windows环境下,因为有库函数kbhit回来最近所敲的按键。就很简略完成。而在linux环境下咱们需求结构自己的kbhit,在
3.1 控制台的初始化
首要,这儿运用了全局变量inited,它是一个初始化与否的符号。因为函数kbhit将被屡次调用,而初始化只需求做一次。这样。当发现inited置1今后,就不会去做重复性的初始化作业了。假如inited为0,就需求对控制台(键盘)做初始化作业,这儿界说了内核结构体termios类型的变量newKbdMode,咱们需求对这个结构体的两个成员c_lflag和c_cc进行初始化,代码中对c_lflag的设置表明终端为不回显的非规范形式。c_cc[VTIME]=0,c_cc[VMIN]=1表明读函数会等候。直到呈现1个键盘输入停止。(关于这个结构体的具体分析,可参看
3.2 检测键盘的输入
在这儿咱们运用宏FD_ZERO把内核的结构体readFd清0.用宏FD_SET把规范输入的文件描述符STDIN_FILENO和readFd相关,然后用select函数来监测输入。他只重视一个描述符,所以第一个参数为1,第二个参数为上面的readFd,后边的两个参数表明是否重视规范输出和犯错的文件描述符,咱们不要,所以置0.最终一个参数表明超时时刻,咱们不需求,所以置0.经过以上的处理后,假如有输入时。宏FD_ISSET就会回来非0值。咱们就知道键盘上有输入。
3.3 体系退出
在windows环境下运用了成对的函数PC_DOSSaveReturn()和PC_DOSReturn.前一个保存DOS的状况,后一个在退出时前调用。康复保存的DOS状况。而在linux下,外表看来我仅运用函数exit()直接退出,而没有进行相似的保存一康复处理。但实际上在linux下咱们调用了函数atexit(function)来设置程序正常完毕前调用的函数,当程序经过调用exit()回来时,参数function所指定的函数会先被调用。然后才真实由exit()完毕程序。function将指定函数rekbd(函数的完成见下面的代码),这个函数便是清屏和清场一切前文的特点设置,33声明晰转义序列的开端,然后是[2J,表明清屏。[0m表明封闭一切特点。
void rekbd(void){
prinf(33[0m);
prinf(33[2J);
}
4 MAKEFILE 文件的编写
在Jean J.Labrosse先生的原书中是运用boland c的编译器。而咱们在linux下运用GCC的编译器,因为编译器的改动。所以makefile就需求重写。为了简化makefile的编写,我供给一种最简略的办法,那便是把一切uCOS-II 的源码(SOFTWAREuCOS-IISOURCE)。 以及装备头文件和测验函数(SOFTWAREuCOS-IIEX1_x86LBC45SOURCE)。还有按上文编写的pc.c和pc.h文件,悉数放在linux的根目录下。假设为/test78,则makefile可简写为如下方法:
UCOS_SRC=/test78
UCOS_PORT=/test78
UCOS_PC=/test78
all:
gcc-I$(UCOS_SRC) -I$(UCOS_PORT) -I$(UCOS_PC) test.c $(UCOS_SRC)/uCOS_II.C $(UCOS_PC)/
pc.c $(UCOS_PORT)/os_cpu_c.c -o test
all是一个伪方针,伪方针 并不是一个文件,仅仅一个标签,它的特性是,总是被履行的。这样的意图是让编译器每次都发生新的方针。-o test指定输出文件为test.’-I’选项指定查找的目录。