📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #2
*********************************************************************************************************
*/
#include "includes.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs)这里所有任务
堆栈的容量都设置成相同的值,但是UCOS允许为每个任务指定不同的的堆栈 */
#define TASK_START_ID 0 /* Application tasks IDs 为每个堆栈分配实际存储空间*/
#define TASK_CLK_ID 1
#define TASK_1_ID 2
#define TASK_2_ID 3
#define TASK_3_ID 4
#define TASK_4_ID 5
#define TASK_5_ID 6
#define TASK_START_PRIO 10 /* Application tasks priorities */
#define TASK_CLK_PRIO 11
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
#define TASK_3_PRIO 14
#define TASK_4_PRIO 15
#define TASK_5_PRIO 16
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStartStk[TASK_STK_SIZE]; /* Startup task stack */
OS_STK TaskClkStk[TASK_STK_SIZE]; /* Clock task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 task stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 task stack */
OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */
OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 task stack */
OS_STK Task5Stk[TASK_STK_SIZE]; /* Task #5 task stack */
OS_EVENT *AckMbox; /* Message mailboxes for Tasks #4 and #5 */
OS_EVENT *TxMbox;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TaskStart(void *data); /* Function prototypes of tasks */
static void TaskStartCreateTasks(void);
static void TaskStartDispInit(void);
static void TaskStartDisp(void);
void TaskClk(void *data);
void Task1(void *data);
void Task2(void *data);
void Task3(void *data);
void Task4(void *data);
void Task5(void *data);
/*$PAGE*/
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main (void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
PC_DispClrScr(DISP_FGND_WHITE); /* Clear the screen */
OSInit(); /* Initialize uC/OS-II */
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
PC_ElapsedInit(); /* Initialized elapsed time measurement;main()函数
调用PC_ElapsedInit()函数,初始化时间测量功能。这个功能用来计算OSTaskStkChk()函数运行的时间,精确记录PC_Elapsed
Start()和PC_ElapsedStop()函数的调用时刻。通过计算这两个时刻的差值,可以很容易的得到这两个时刻之间的执行
代码的运行时间*/
ptos = &TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point*/
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskStkInit_FPE_x86(&ptos, &pbos, &size); /*这个例子中
TaskStart()任务调用浮点运算仿真程序库,而不是使用浮点处理器FPU,因为只有在80486和更高级别的计算机中才有这一部分
。如果系统中没有浮点处理器,Borland的编译器将默认使用其提供的浮点运算仿真程序库。换句话说,如果在一台安装了DOS
系统的80386EX(没有安装80387浮点处理器)的计算机上运行例二的程序那么浮点运算将由仿真实现。浮点运算程序库的程序都是
不可重入的,必须找到某些方法,以使更多个任务都能够进行浮点运算。(重入函数:主要用于多任务环境中,一个可重入的函数
简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回
控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话
,可能会出现问题,这类函数是不能运行在多任务环境下的。)例子中通过对堆栈的修改,满足了浮点运算运算仿真程序库的要求。
这个修改是通过OSTaskStkInit_FPE_x86()函数来完成的。注意此时报告的任务堆栈容量是624B而不是建立时定义的1024B。这是
因为函数OSTaskStkInit_FPE_x86()把一部分堆栈保留给浮点运算仿真程序库使用了*/
OSTaskCreateExt(TaskStart, /*这里没有使用OSTaskCreate()函数来建立TaskStart(),而是使用了
OSTaskCreateExt(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -