ucos-ii操作系统习题(嵌入式方向) 联系客服

发布时间 : 星期日 文章ucos-ii操作系统习题(嵌入式方向)更新完毕开始阅读0e7692827fd5360cbb1adbcf

PC_DispChar(x, y, *(char*)pdata, DISP_BGND_BLACK+DISP_FGND_WHITE );//打印字符”H”

PC_DispStr(5, 6, s, DISP_BGND_BLACK+DISP_FGND_WHITE );//并打印字符串(s已在程序开头定义) x+=1; }

InterKey=FALSE; //重新将InterKey标志的值置为假

OSTimeDlyHMSM(0,0,1,0); // 此处的值根据题目要求更改,没有要求的话可以就使用这个 } }

//--下面的内容和上面的不在同一个文件中,钩子函数几乎都是在OS_CPU_C.c文件中定义的---------------------------------

extern BOOLEAN InterKey; //声明InterKey这个变量是在该文件外部定义的 INT16U InterCtr = 0; //用了记录时钟节拍数,即该钩子函数被调用的次数 void OSTimeTickHook (void) {

if(InterCtr == 10000) //当时钟tick总数等于10000(这个值按题目中的要求进行设置)时 InterKey = TRUE; //将InterKey标志的值置为真 InterCtr++; }

三、设计一个应用程序,该程序有MyTask何YouTask两个任务,在任务MyTask中用一个变量记录MyTask的运行次数,并将其作为消息用邮箱Str_Box发给任务YouTask并有任务YouTask显示出来。

(这个题是书上的原题[page156,例5-8],考试估计也是原题,我只是将一些没有用的代码删掉了)

#include \

#define TASK_STK_SIZE 512 //任务堆栈长度

OS_STK StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK YouTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 char*s; char*ss;

INT8U err; //用来存放错误代号 INT8U y=0; //字符显示位置

INT32U Times=0; //用来记录MyTask任务的运行次数 OS_EVENT *Str_Box; //定义消息邮箱的指针 void StartTask(void *data); //声明起始任务 void MyTask(void *data); //声明任务 void YouTask(void *data); //声明任务 void main (void) {

OSInit( ); //初始化uCOS_II

21

PC_DOSSaveReturn( ); //保存Dos环境

PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断

Str_Box = OSMboxCreate ((void*)0); //创建互斥型信号量

OSTaskCreate(StartTask, (void*)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //注意优先级,要符合题目要求

OSStart( ); //启动多任务管理 }

void StartTask (void *pdata) {

#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif

pdata = pdata;

OS_ENTER_CRITICAL( );

PC_VectSet(0x08, OSTickISR); //安装时钟中断向量

PC_SetTickRate(OS_TICKS_PER_SEC); //设置uCOS_II时钟频率 OS_EXIT_CRITICAL( );

OSStatInit( ); //初始化统计任务

OSTaskCreate(MyTask, (void*)0, &MyTaskStk[TASK_STK_SIZE - 1], 3); //注意优先级,要符合题目要求

OSTaskCreate(YouTask, (void*)0, &YouTaskStk[TASK_STK_SIZE - 1], 4); //注意优先级,要符合题目要求

// 这两个任务创建函数的第2个参数都是”(void*)0”,是因为在这个程序中并没有用到这个参数去给对应的函数传递参数 for (;;) {

OSTimeDlyHMSM(0, 0, 3, 0); //等待3秒,按照题目的要求进行更改,没有要求的话可以就使用这个 } }

void MyTask (void *pdata) {

#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif

pdata = pdata; for (;;) {

sprintf(s,\//将MyTask的运行次数Times以十进制的格式转换成字符串,并存放到s所指向的位置

OSMboxPost(Str_Box,s); //发送消息 Times++;

OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒,按照题目的要求进行更改,没有要求的话可以

22

就使用这个 } }

void YouTask (void *pdata) {

#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata; for (;;) {

ss=OSMboxPend(Str_Box,10,&err); //读取消息邮箱中数据缓冲区的首地址并赋给ss指针

PC_DispStr(10, ++y, ss, DISP_BGND_BLACK+DISP_FGND_WHITE); //打印出所收到的消息的内容

OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒,按照题目的要求进行更改,没有要求的话可以就使用这个 } }

23