您好,欢迎访问三七文档
南京工程学院自动化学院嵌入式系统课程设计报告课题:操作系统任务间信号量通信程序设计专业:自动化(数控技术)班级:数控卓越131学号:学生姓名:任课教师:年月日成绩一、课程设计要求硬件:x86架构PC机软件:X8架构的PC机和BorlandC编译器和链接器,μC/OS-II操作系统文件要求:1).撰写详细的程序功能说明;2).列出程序中调用的系统函数,并对函数功能加以说明;3).完成程序流程图,并对各个功能模块加以详细的阐述;4).提供程序的源代码文件,并详细阐述程序的调试过程;5).提供可执行文件,并演示执行结果;6).对课程设计进行总结,撰写课程设计报告二、程设计题目分析当事件控制块成员OSEventType的值被设置为OS_EVENT_TYPE_SEM时,这个控制块描述的就是一个信号量。在使用信号量之前,应用程序必须调用函数OSSemCreate()来创建一个信号量。函数OSSemCreate()的原型如下:OS_EVENT*OSSemCreate(INT16Ucnt//信号量计数器初值)任务调用函数OSSemPend()请求信号量。函数OSSemPend()的原型如下:voidOSSemPend(OS_EVENT*pevent,//信号量的指针INT16Utimeout,//等待时限INT8U*err//错误信息);任务获得信号量,并在访问共享资源后,必须释放信号量。释放信号量也叫做发送信号量,调用函数OSSemPost(),原型如下:INT8UOSSemPost(OS_EVENT*pevent//信号量的指针);因此在程序中调用了相关函数:在MyTask任务中请求信号量在HerTask任务中发送信号量,并建立一个循环让HerTask每运行三次发送一个信号量。关于MyTask调用的函数是这样的:以上就是信号量的部分,为了使程序实现更多的内容,便加入了消息邮箱的设计。定义事件控制块指针:创建消息邮箱;Times作为变量记录MyTask运行次数在YouTask请求消息邮箱三、课程程序设计:所设计的程序,该程序有MyTask、YouTask和HerTask三个任务,在任务MyTask中用一个变量Times记录任务MyTask的运行次数,并用消息邮箱发给YouTask并由YouTask显示,同时MyTask是有HerTask发信号量控制运行。信号量为1这MyTask运行,为0则不运行。程序如下:/************************Test*************************************/#includeincludes.h#defineTASK_STK_SIZE512//任务堆栈长度OS_STKStartTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKMyTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKYouTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKHerTaskStk[TASK_STK_SIZE];//定义任务堆栈区INT16Skey;char*s1=MyTask;char*s2=HerTask;//用于退出的键char*s;char*ss;INT8Uerr;INT8Uy=0;//字符显示位置INT8UYouTaskRun=0;INT8UHerTaskRun=0;OS_EVENT*Fun_Semp;INT32UTimes=0;OS_EVENT*Str_Box;voidFun(INT8Ux,INT8Uy);voidStartTask(void*data);//声明起始任务voidMyTask(void*data);//声明任务voidYouTask(void*data);//声明任务voidHerTask(void*data);//声明任务/************************主函数*********************************/voidmain(void){OSInit();//初始化uCOS_IIPC_DOSSaveReturn();//保存Dos环境PC_VectSet(uCOS,OSCtxSw);//安装uCOS_II中断Str_Box=OSMboxCreate((void*)0);//创建消息邮箱OSTaskCreate(StartTask,//创建任务StartTask(void*)0,//给任务传递参数&StartTaskStk[TASK_STK_SIZE-1],//设置任务堆栈栈顶0);//使任务的优先级别为0OSStart();//启动多任务管理}/***********************任务StartTask*******************************/voidStartTask(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//安装时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);//设置uCOS_II时钟频率OS_EXIT_CRITICAL();Fun_Semp=OSSemCreate(0);OSStatInit();//初始化统计任务OSTaskCreate(MyTask,//创建任务MyTask(void*)0,//给任务传递参数&MyTaskStk[TASK_STK_SIZE-1],//设置任务堆栈栈顶3);//使任务的优先级别为3OSTaskCreate(YouTask,//创建任务YouTask(void*)0,//给任务传递参数&YouTaskStk[TASK_STK_SIZE-1],//设置任务堆栈栈顶4);//使任务的优先级别为4OSTaskCreate(HerTask,//创建任务HerTask(void*)0,//给任务传递参数&HerTaskStk[TASK_STK_SIZE-1],//设置任务堆栈栈顶5);//使任务的优先级别为5for(;;){//如果按下Esc键则退出uCOS_IIif(PC_GetKey(&key)==TRUE){if(key==0x1B){PC_DOSReturn();}}OSTimeDlyHMSM(0,0,3,0);//等待3秒}}/************************任务MyTask*******************************/voidMyTask(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;;){OSSemPend(Fun_Semp,0,&err);//请求信号量PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);sprintf(s,%d,Times);OSMboxPost(Str_Box,s);//发送消息Times++;Fun(7,y);OSTimeDlyHMSM(0,0,1,0);//等待1秒}}/************************任务YouTask******************************/voidYouTask(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;;){if(YouTaskRun==3){ss=OSMboxPend(Str_Box,10,&err);PC_DispStr(20,y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);YouTaskRun=0;}YouTaskRun++;OSTimeDlyHMSM(0,0,1,0);//等待1秒}}/************************任务HerTask******************************/voidHerTask(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;;){if(HerTaskRun==3){OSSemPost(Fun_Semp);//发送信号量HerTaskRun=0;}HerTaskRun++;PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);OSTimeDlyHMSM(0,0,1,0);//等待1秒;}}/************************Fun()************************************/voidFun(INT8Ux,INT8Uy){PC_DispStr(x,y,invokedFun()!,DISP_BGND_BLACK+DISP_FGND_WHITE);}/************************End**************************************/四、程序编译结果:因为MyTask需要HerTask发信号量才能运行,所以即使MyTask优先级高也不能运行。而YouTask由于检测不到消息邮箱也不运行,只有HerTask运行。HerTask不断运行,每三次发送一次信号量,YouTask不断检测消息邮箱,一旦MyTask运行,则变量加一,并显示。并且MyTask调用函数Fun显示。五、课程设计总结:这次课程设计,让我通过学习,写出了结合信号量与消息邮箱的程序,让我对嵌入式μC/CSll有了初步了解,当然如果想要有更深的了解,我还需要进一步的学习。
本文标题:嵌入式课程设计
链接地址:https://www.777doc.com/doc-6016856 .html