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