?? test.c
字號(hào):
/*
*********************************************************************************************************
* 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)這里所有任務(wù)
堆棧的容量都設(shè)置成相同的值,但是UCOS允許為每個(gè)任務(wù)指定不同的的堆棧 */
#define TASK_START_ID 0 /* Application tasks IDs 為每個(gè)堆棧分配實(shí)際存儲(chǔ)空間*/
#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()函數(shù)
調(diào)用PC_ElapsedInit()函數(shù),初始化時(shí)間測量功能。這個(gè)功能用來計(jì)算OSTaskStkChk()函數(shù)運(yùn)行的時(shí)間,精確記錄PC_Elapsed
Start()和PC_ElapsedStop()函數(shù)的調(diào)用時(shí)刻。通過計(jì)算這兩個(gè)時(shí)刻的差值,可以很容易的得到這兩個(gè)時(shí)刻之間的執(zhí)行
代碼的運(yùn)行時(shí)間*/
ptos = &TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point*/
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskStkInit_FPE_x86(&ptos, &pbos, &size); /*這個(gè)例子中
TaskStart()任務(wù)調(diào)用浮點(diǎn)運(yùn)算仿真程序庫,而不是使用浮點(diǎn)處理器FPU,因?yàn)橹挥性?0486和更高級(jí)別的計(jì)算機(jī)中才有這一部分
。如果系統(tǒng)中沒有浮點(diǎn)處理器,Borland的編譯器將默認(rèn)使用其提供的浮點(diǎn)運(yùn)算仿真程序庫。換句話說,如果在一臺(tái)安裝了DOS
系統(tǒng)的80386EX(沒有安裝80387浮點(diǎn)處理器)的計(jì)算機(jī)上運(yùn)行例二的程序那么浮點(diǎn)運(yùn)算將由仿真實(shí)現(xiàn)。浮點(diǎn)運(yùn)算程序庫的程序都是
不可重入的,必須找到某些方法,以使更多個(gè)任務(wù)都能夠進(jìn)行浮點(diǎn)運(yùn)算。(重入函數(shù):主要用于多任務(wù)環(huán)境中,一個(gè)可重入的函數(shù)
簡單來說就是可以被中斷的函數(shù),也就是說,可以在這個(gè)函數(shù)執(zhí)行的任何時(shí)刻中斷它,轉(zhuǎn)入OS調(diào)度下去執(zhí)行另外一段代碼,而返回
控制時(shí)不會(huì)出現(xiàn)什么錯(cuò)誤;而不可重入的函數(shù)由于使用了一些系統(tǒng)資源,比如全局變量區(qū),中斷向量表等,所以它如果被中斷的話
,可能會(huì)出現(xiàn)問題,這類函數(shù)是不能運(yùn)行在多任務(wù)環(huán)境下的。)例子中通過對(duì)堆棧的修改,滿足了浮點(diǎn)運(yùn)算運(yùn)算仿真程序庫的要求。
這個(gè)修改是通過OSTaskStkInit_FPE_x86()函數(shù)來完成的。注意此時(shí)報(bào)告的任務(wù)堆棧容量是624B而不是建立時(shí)定義的1024B。這是
因?yàn)楹瘮?shù)OSTaskStkInit_FPE_x86()把一部分堆棧保留給浮點(diǎn)運(yùn)算仿真程序庫使用了*/
OSTaskCreateExt(TaskStart, /*這里沒有使用OSTaskCreate()函數(shù)來建立TaskStart(),而是使用了
OSTaskCreateExt(
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -