📄 test.c
字号:
//2005-6-19 16:03 全部整理后编译通过。
#include "includes.h"
#define TASK_STK_SIZE 512
#define N_TASKS 10
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE];
OS_STK TaskStartStk[TASK_STK_SIZE];
char TaskData[N_TASKS];
OS_EVENT *RandomSem;
void Task(void *data); /* Function prototypes of tasks */
void TaskStart(void *data); /* Function prototypes of Startup task */
static void TaskStartCreateTasks(void);
static void TaskStartDispInit(void);
static void TaskStartDisp(void);
static void TaskStartDispInit (void)
{
PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
PC_DispStr( 0, 1, " Jean J. Labrosse ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 2, " by Xu Dong 2005.6.20 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 3, " EXAMPLE #1 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 10, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 22, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
}
static void TaskStartDisp (void)
{
char s[80];
sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
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;
}
}
void main(void)
{
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); //清除屏幕显示
OSInit(); //必须调用的一个函数,该函数建立两个系统任务:空闲任务、CPU利用率统计任务
PC_DOSSaveReturn(); //保存当前DOS环境,使用户可以返回到没有运行uC/OS-II之前的DOS环境
PC_VectSet(uCOS,OSCtxSw); //指定任务切换处理函数
RandomSem = OSSemCreate(1); //建立一个信号量,保护随机数发生函数。
OSTaskCreate(TaskStart,(void *)0,&TaskStartStk[TASK_STK_SIZE - 1],0); //开始多任务前,必须至少建立一个任务。
//任务指针,任务初始化数据指针,任务堆栈栈顶,任务优先级 这里建立了一个TaskStart的任务
OSStart(); //启动uC/OS-II,控制权移交。 启动OSStart()之前至少要先建立一个任务,否则会崩溃。
}
void TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
char s[100];
INT16S key;
pdata = pdata; //防止编译器优化或报错
TaskStartDispInit(); //初始化屏幕
OS_ENTER_CRITICAL(); //关中断
PC_VectSet(0x08,OSTickISR); //时钟源处理
PC_SetTickRate(OS_TICKS_PER_SEC); //更改时钟频率到200Hz
OS_EXIT_CRITICAL(); //开中断
OSStatInit(); //测试CPU使用率
TaskStartCreateTasks(); //创建更多的任务
for(;;)
{
TaskStartDisp();
if(PC_GetKey(&key) == TRUE)
{
if(key == 0x1B) //如果按下ESC键
{
PC_DOSReturn();
}
}
OSCtxSwCtr = 0;
OSTimeDlyHMSM(0,0,1,0);
}
}
static void TaskStartCreateTasks(void)
{
INT8U i;
for(i = 0;i < N_TASKS;i++)
{
TaskData[i] = '0' + i; //初始化一个数组,内容包括0~9的ASCII字符
OSTaskCreate(Task, //循环建立了N_TASKS个完全相同的任务
(void *)&TaskData[i], //每一个任务接受一个指向字符数组的指针
&TaskStk[i][TASK_STK_SIZE - 1], //每个任务分配一个堆栈空间
i + 1); //分配优先级
}
}
void Task(void *pdata)
{
INT8U x;
INT8U y;
INT8U err;
for(;;)
{
OSSemPend(RandomSem,0,&err); //检查随机数函数
x = random(80); //产生x随机数,范围0~79
y = random(16); //产生y随机数,范围0~15
OSSemPost(RandomSem); //释放信号量
PC_DispChar(x,y + 5,*(char *)pdata,DISP_FGND_LIGHT_GREEN); //开始在屏幕上显示字符
// PC_DispChar(x,y + 5,*(char *)pdata,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDly(1); //延时、挂起该任务
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -