本文主要记录使用UCOS II
的相关内容。包括如何完成第一个UCOS II
应用程序,和如何创建任务,如何获取系统时间,和利用i3086 驱动
完成时间获取,屏幕显示,按键驱动,信号量等内容。
UCOS-II 基本输入输出 任务创建
PART1 关于X86架构32位系统上UCOS的移植
本文使用的UCOS II
系统为实时操作系统一书打包好的Win32
环境下的UCOS II
操作系统。
观察其提供的示例工程,可依照其配置搭建起基于Win32
的UCOS II
运行环境。
示例工程中的Makefile
文件中使用了如下工具及工作目录:
######################################################################
# TOOLS
######################################################################
BORLAND=C:\BC45
CC=$(BORLAND)\BIN\BCC
ASM=$(BORLAND)\BIN\TASM
LINK=$(BORLAND)\BIN\TLINK
TOUCH=$(BORLAND)\BIN\TOUCH
######################################################################
# DIRECTORIES
######################################################################
LST=..\LST
OBJ=..\OBJ
SOURCE=..\SOURCE
TARGET=..\TEST
WORK=..\WORK
OS=\SOFTWARE\uCOS-II\SOURCE
PC=\SOFTWARE\BLOCKS\PC\BC45
PORT=\SOFTWARE\uCOS-II\Ix86L\BC45
即将Borland c
与TASM
安装到根目录下,并将本示例工程SOFTWARE
文件夹放置到根目录下即可。
该书提供的Win32
控制台驱动放置在SOFTWARE/BLOCKS/PC
目录下,UCOS II
源码放置在SOFTWARE/uCOS-II/SOURCE
目录下。
在对应示例工程下Test
目录运行make
文件即可生成可执行文件。
PART2 关于CONFIG文件
每一个UCOS II
工程中,要包含一个Config
文件,用来联合UCOS II
中的条件编译语句,做到定制化操作系统的功能。
该文所涉及到的内容包含Config
文件中的如下部分
#define OS_MAX_TASKS 11 /* 任务最大数量 */
#define OS_LOWEST_PRIO 12 /* 最低优先级 */
PART3 实现显示功能
Jean J. Labrosse先生提供的示例程序均在Win 32
控制台上输出了一片区域用于模拟实际嵌入式操作环境中的显示器,该函数为TaskStartDispInit
,其中利用了PC_DispStr
在屏幕上显示字符串。
具体Win 32
控制台显示驱动函数可以前往上文所提到的PC.h
文件中查看。
PART4 UCOS II
任务的组成
UCOS II
的任务组成如下:
void Task(void *pdata){
//Init Data In Task
while(1){
//Do whatever You Want In task
OSTimeDly(100);
//让出CPU让其他任务执行
}
}
示例提供的TaskStart
的主要工作包括初始化操作系统,利用上诉显示函数初始化显示屏,调用TaskStartCreateTasks
初始化用户操作程序,以及在运行时更新显示屏显示内容,并判断用户是否按下esc
键退出模拟环境会到Win32
控制台。
PART5 任务的创建
TASK_START
为示例代码利用的OSTaskCreate
创建的。
而在TASK_START
中我们的Task0
与TASK1
是利用OSTaskCreateExt
来创建的
OSTaskCreate
的参数为
OSTaskCreate (void (*task)(void *pd), /* 函数指针,void *pd为函数的参数*/
void *pdata, /* 建立任务时,传递的参数*/
OS_STK *ptos, /* 指向堆栈任务栈顶的指针*/
INT8U prio) /* 任务优先级 */
OSTaskCreateExt
的参数为
INT8U OSTaskCreateExt (void (*task)(void *pd),
void *pdata,
OS_STK *ptos,
INT8U prio,
INT16U id, /* 任务ID,2.52版本,无实际作用,保留作为扩展用*/
OS_STK *pbos, /* 指向堆栈底部的指针,用于OSTaskStkChk()函数*/
INT32U stk_size, /* 指定任务堆栈的大小,由OS_STK类型决定 */
void *pext, /* 定义数据结构的指针,作为TCB的扩展*/
INT16U opt) /* 存放于任务操作相关的信息*/
{
PART6 方向键驱动
Jean J. Labrosse先生提供的驱动为PC下的BOOLEAN PC_GetKey(INT16S *c)
,而我们方向键为两个字节的消息。若只用一个字节来读取的话,会导致如Up Arrow
其与H
混淆。
于是在PC
驱动程序中加入专门读取方向键的驱动
BOOLEAN PC_GetArrowKey (INT16S *key_1,INT16S *key_2){
if (kbhit()) {
*key_1 = (INT16S)getch();
*key_2 = (INT16S)getch();
return (TRUE);
} else {
*key_1 = 0x00;
*key_2 = 0x00;
return (FALSE);
}
}
并利用Task0
读取键盘动作(其中OSTaskStkChk
用来检查栈)
void Task0 (void *pdata){