📄 test.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 + -