⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 详细注解UCOS2.52, 这些注释的内容主要来自邵贝贝教授翻译的那本《嵌入式实时操作系统UCOSII》, 转帖.
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                           (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
*                                               EXAMPLE #1
*********************************************************************************************************
*/

#include "includes.h"
/*这里只有一句简单的#include语句,这是因为所有相关的头文件都放在了一个主控头文件includes.h中。
每个文件通常都包含这个主控头文件,这样就无须考虑每个文件应该包含哪些相应的头文件,这些文件通过includes.h包含进来了。
可以使用文本编译软件查看includes.h文件的内容,这个文件也在SOURCE目录下。
{#include    <stdio.h>
#include    <string.h>
#include    <ctype.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <dos.h>
#include    <setjmp.h>

#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"
}*/

/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE                 512       /* Size of each task's stacks (# of WORDs) 每个任务的堆栈的个数*/
#define  N_TASKS                        10       /* Number of identical tasks (identical同一的 同样的)*/

/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/

OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        /* Tasks stacks                                  */
OS_STK        TaskStartStk[TASK_STK_SIZE];            /*如果移植在x86上的话 因为x86上OS_STK为16位变量所以堆栈的
                                                      大小为512*16%8B  1024B  */
char          TaskData[N_TASKS];                      /* Parameters(参数, 参量, <口>起限定作用的因素) to
                                                                       pass to each task               */
OS_EVENT     *RandomSem;

/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/

        void  Task(void *data);                       /* Function prototypes(原型) of tasks之所以返回参数类型设置
        成为void,是因为当任务开始执行时,会有一个参数传递给用户任务代码。这个参数是一个指向void的指针,以允许
        用户应用程序向该任务传递任何类型的参数。这个指针实际上是一个万能的车子,用于装载传递给任务的参数,这个参数
        可以是一个变量的地址,一个数据结构,后者,如果有必要,甚至可以是一个函数的入口地址。也可以建立许多相同的任务
        ,所有任务都是用同一个函数或者说是同一个任务程序代码*/
        void  TaskStart(void *data);                  /* Function prototypes of Startup task           */
static  void  TaskStartCreateTasks(void);
static  void  TaskStartDispInit(void);
static  void  TaskStartDisp(void);

/*$PAGE*/
/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/

void  main (void)
{
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen从清屏开始,位的是保证屏幕
     生不留下以前的DOS下的显示。PC_DispClrScr()函数可以在PC.C文件中找到,在\SOFTWARE\BLOCKS\PC\BC45下。*/

    OSInit();                                              /* Initialize(初始化) uC/OS-II在使用UCOS提供
    的任何功能之前必须调用OSInit() 该函数建立了两个任务 一个是空闲任务 在其他任务为就绪时运行;另一个统计
    任务 计算CPU的利用率。*/

    PC_DOSSaveReturn();                                    /* Save environment to return to DOS调用该函数
    保存当前的DOS环境。这使得用户可以返回到没有运行UCOS之前的DOS环境*/
    PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector(向
    量)指定UCOS中的任务切换处理函数。任务级的任务切换通过80x86的INT指令引发中断,通过向量地址调用指定的处
    理函数这里使用了0x80的向量(128),因为DOS和BIOS都没有使用这个向量 */

    RandomSem   = OSSemCreate(1);                          /* Random(随意, 任意) number semaphore(旗语)
    建立一个信号量,用以保护BORLANDC\C++库中产生随机数的函数。信号量是UCOS提供的一种机制,用于防止多个任务
    同时访问同一个资源(本例中资源为产生随机数的函数)。之所以使用信号量,是因为假设产生随机数的函数不具备
    可重入性(这是一种安全的做发)信号量的初值设置为1,通知UCOS在某一时刻只有一个任务可一调用随机数产生的函
    数OSSemCreate(1)建立了该信号量,并指点了信号量的初始值,该函数返回一个指向信号量的指针
    OS_EVENT  *RandomSem 接下来对该信号量的操作都通过这个指针来实现*/

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
                                                /* Start multitasking(多(重)任务处理)在开始多
    任务之前必须至少建立一个任务。在这个范例中,建立了一个叫做TaskStart()的任务,这个任务有四个参数:第一
    个参数是指向该任务运行代码的指针,在这个范例中不需要任何初始化数据,所以传递了一个空NULL在范例四中会讨论
    这个任务初始化的用法;第三个参数是任务的堆栈栈顶TOS(TOP-OF-STACK),对UCOS和绝大多数可剥夺型内核来说,
    每个任务都有各自的堆栈空间,在UCOS中每个任务的堆栈容量可以单独指定,在这个范例中,为了简化起见,都定义成
    了相同的容量  在80x86处理器上,堆栈是从高地址向低地址递减的,所以必须把堆栈的高地址TOS传递给OSTaskCreate()
    函数。在这个范例中,堆栈空间被定义为TaskStarStk[],并在编译时确定。堆栈必须定义为OS_STK变量类型 如果移植
    在x86上的话 因为x86上OS_STK为16位变量所以堆栈的大小为512*16%8B  1024B 最后的参数指定了建立的任务的优先级。
    这个参数值越小,任务的优先级越高(这一点非常重要哦)前文提到UCOS允许建立多达63个用户任务。必须给这些任务
    分配 不同的优先级。0是最高的优先级。
    睡眠态:task dormant指的是任务驻留在程序空间ROM或者RAM。还没有由UCOS来管理。把任务交给UCOS,是通过调用下述两个
    函数之一OSTaskCreate或OSTaskCreateExt实现的。这些调用只是用于告诉UCOS,任务的其实地址在哪里;任务建立时,用
    户给任务赋予的优先级是多少;任务要使用多少栈空间等等*/
    OSStart();/* 调用OSStart(),将控制权交给UCOS内核,开始运行多任务。在启动多任务OSStart()之前,至少要先建立一
    个任务。否则应用程序就会崩溃。实际上,如果希望计算CPU的利用率时,也须先建立一个任务这个函数的作用是最重要的

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -