UCOS-II学习记录

本文主要记录使用UCOS II的相关内容。包括如何完成第一个UCOS II应用程序,和如何创建任务,如何获取系统时间,和利用i3086 驱动完成时间获取,屏幕显示,按键驱动,信号量等内容。

UCOS-II 基本输入输出 任务创建

PART1 关于X86架构32位系统上UCOS的移植

本文使用的UCOS II系统为实时操作系统一书打包好的Win32环境下的UCOS II操作系统。

观察其提供的示例工程,可依照其配置搭建起基于Win32UCOS 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 cTASM安装到根目录下,并将本示例工程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中我们的Task0TASK1是利用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){
 
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值