📄 test.c
字号:
PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
#if OS_TASK_STAT_EN > 0
sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
#endif
sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number */
PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
switch (_8087) { /* Display whether FPU present */
case 0:
PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
case 1:
PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
case 2:
PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
case 3:
PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #1
*********************************************************************************************************
*/
void Task1 (void *pdata)
{
char *msg;
INT8U err;
pdata = pdata;
for (;;) {
msg = (char *)OSQPend(MsgQueue, 0, &err); /*消息队列无限期的等待消息队列的消息*/
PC_DispStr(70, 13, msg, DISP_FGND_YELLOW + DISP_BGND_BLUE);/*接收到一条消息,在屏幕上显示*/
OSTimeDlyHMSM(0, 0, 0, 100); /*延时100ms,以便能看到消息已经接到*/
}
}
/*
*********************************************************************************************************
* TASK #2
*********************************************************************************************************
*/
void Task2 (void *pdata)
{
char msg[20];
pdata = pdata;
strcpy(&msg[0], "Task 2"); /**/
for (;;) {
OSQPost(MsgQueue, (void *)&msg[0]); /*Task2()发送一个指向字符串'Task2'的指针*/
OSTimeDlyHMSM(0, 0, 0, 500); /*Task2()将延时0.5S再次发送消息*/
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #3
*********************************************************************************************************
*/
void Task3 (void *pdata)
{
char msg[20];
pdata = pdata;
strcpy(&msg[0], "Task 3");
for (;;) {
OSQPost(MsgQueue, (void *)&msg[0]);
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
/*
*********************************************************************************************************
* TASK #4
*********************************************************************************************************
*/
void Task4 (void *pdata)
{
char msg[20];
pdata = pdata;
strcpy(&msg[0], "Task 4");
for (;;) {
OSQPost(MsgQueue, (void *)&msg[0]);
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #5
*********************************************************************************************************
*/
void Task5 (void *pdata)
{
pdata = pdata;
for (;;) {
OSTimeDlyHMSM(0, 0, 0, 100); /*这个任务只是简单的让自己延时100MS如果一个任务里没有这样的步骤
,那么所有比这个任务优先级低的任务将不可能运行*/
}
}
/*
*********************************************************************************************************
* CLOCK TASK
*********************************************************************************************************
*/
void TaskClk (void *pdata) /*调用这个函数显示当前的日期和时间*/
{
char s[40];
pdata = pdata;
for (;;) {
PC_GetDateTime(s);
PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* DISPLAY TASK RELATED STATISTICS
*********************************************************************************************************
*/
void DispTaskStat (INT8U id)
{
char s[80];
sprintf(s, "%-18s %05u %5u %10ld",
TaskUserData[id].TaskName,
TaskUserData[id].TaskCtr,
TaskUserData[id].TaskExecTime,
TaskUserData[id].TaskTotExecTime);
PC_DispStr(0, id + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
/*
*********************************************************************************************************
* OS INITIALIZATION HOOK
* (BEGINNING)
程序运行时,产生的时间很难通过阅读每个任务的代码来确定。UCOS是提供源代码的,这样很容易通过UCOS
提供的接口函数HOOK函数添加新的功能代码。在UCOS中,共有9个这样的接口函数。这些接口函数的函数原型在
OS_CPU_C.C文件中通常是由为处理器一直UCOS的人完成的;但是,如果将配置长数OS_CPU_HOOKS_EN定义为0,
就可以在另一个文件里重新申明这些接口函数。OS_CPU_HOOKS_EN是在OS_CFG.H文件中提供的众多的配置常数之一
。每个使用UCOS的项目,起要求各不相同,其OS_CSG.H文件也不相同。本书中的每个范例都在SOURCE目录下提供了
该范例的OS_CSG.H文件
*********************************************************************************************************
*/
void OSInitHookBegin (void)
{
}
/*
*********************************************************************************************************
* OS INITIALIZATION HOOK
* (END)
*********************************************************************************************************
*/
void OSInitHookEnd (void)
{
}
/*
*********************************************************************************************************
* TASK CREATION HOOK
*********************************************************************************************************
*/
void OSTaskCreateHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
/*
*********************************************************************************************************
* TASK DELETION HOOK
*********************************************************************************************************
*/
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
/*
*********************************************************************************************************
* IDLE TASK HOOK
*********************************************************************************************************
*/
void OSTaskIdleHook (void)
{
}
/*
*********************************************************************************************************
* STATISTIC TASK HOOK统计任务借口函数
当允许使用统计任务时(OS_CFG.H文件中的OS_TASK_STAT_EN配置长数设置为1) ,统计任务将首先调用定义的OSTaskStatHook()
接口函数,范例三中的该接口函数的代码如下 统计任务每秒运行一次,该借口函数也是每秒运行一次
*********************************************************************************************************
*/
void OSTaskStatHook (void)
{
char s[80];
INT8U i;
INT32U total;
INT8U pct;
total = 0L; /* Totalize TOT. EXEC. TIME for each task */
for (i = 0; i < 7; i++) {
total += TaskUserData[i].TaskTotExecTime; /*计算所有任务的运行时间(处空闲任务和统计任务)*/
DispTaskStat(i); /* Display task data调用了这个函数在合适的位置显示每个任务
的累计运行时间,同时给每个任务定义的名字也显示出来*/
} /**/
if (total > 0) {
for (i = 0; i < 7; i++) { /* Derive percentage of each task */
pct = 100 * TaskUserData[i].TaskTotExecTime / total;
sprintf(s, "%3d %%", pct);
PC_DispStr(62, i + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);/*显示以百分比表示的每个任务的相对CPU占有率*/
}
}
if (total > 1000000000L) { /* Reset total time counters at 1 billion */
for (i = 0; i < 7; i++) {
TaskUserData[i].TaskTotExecTime = 0L;
}
}
}
/*
*********************************************************************************************************
* TASK SWITCH HOOK
*********************************************************************************************************
*/
void OSTaskSwHook (void)
{
INT16U time;
TASK_USER_DATA *puser;
time = PC_ElapsedStop(); /* This task is done通过调用 time = PC_ElapsedStop()
函数,得到当前被切换的任务运行的时间*/
PC_ElapsedStart(); /* Start for next task;当下一个任务被切换到运行态之前调
用PC_ElapsedStart(),记录当时的时刻。第一次任务切换时得到的值是不正确的,但是这并不是什么要紧的错误。
void OSTaskSwHook (void)接口函数允许计算机每个任务的运行时间,记录每个任务的总的运行时间和运行次数。
每当UCOS从一个低优先级的任务切换到一个高优先级的任务是,调用该接口函数。*/
puser = OSTCBCur->OSTCBExtPtr; /* Point to used data当OSTaskSwHook 被调用时,全局变量OSTCBCur指向
当前任务的TCB任务控制块,而OSTCBHighRdy指向即将被调度运行的任务的TCB任务控制块。在范例三中,OSTCBHighRdy并没有用到
。OSTaskSwHook ()通过OSTCBCur得到当前任务在建立时指定的TASK_USER_DATA数据结构的指针*/
if (puser != (TASK_USER_DATA *)0) { /*检查该任务是否正确定义了一个TASK_USER_DATA数据结构。此情况
有可能发生,实际上空闲任务和统计任务就没有定义TASK_USER_DATA数据结构。*/
puser->TaskCtr++; /* Increment task counter任务运行次数加一。这个记录可以用来判断
这个任务是否曾经运行过。*/
puser->TaskExecTime = time; /* Update the task's execution time任务的本次运行时间记录
在TASK_USER_DATA数据结构中*/
puser->TaskTotExecTime += time; /* Update the task's total execution time任务的总的运行时间也记录
在TASK_USER_DATA数据结构中,这个记录可以用来判断几个任务之间的相对CPU占有率*/
}
}
/*
*********************************************************************************************************
* OSTCBInit() HOOK
*********************************************************************************************************
*/
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent Compiler warning */
}
/*
*********************************************************************************************************
* TICK HOOK
*********************************************************************************************************
*/
void OSTimeTickHook (void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -