嵌入式课程设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京工程学院

自动化学院

嵌入式系统课程设计报告

课题:操作系统任务间信号量通信程序设计专业:自动化(数控技术)

班级:数控卓越131 学号:

学生姓名:

任课教师:

年月日

一、课程设计要求

硬件:x86架构PC机

软件:X8架构的PC机和Borland C编译器和链接器,μC/OS-II操作系统文件要求:1). 撰写详细的程序功能说明;

2). 列出程序中调用的系统函数,并对函数功能加以说明;

3). 完成程序流程图,并对各个功能模块加以详细的阐述;

4). 提供程序的源代码文件,并详细阐述程序的调试过程;

5). 提供可执行文件,并演示执行结果;

6). 对课程设计进行总结,撰写课程设计报告

二、程设计题目分析

当事件控制块成员OSEventType的值被设置为OS_EVENT_TYPE_SEM时,这个控制块描述的就是一个信号量。在使用信号量之前,应用程序必须调用函数 OSSemCreate ()来创建一个信号量。函数 OSSemCreate()的原型如下:

OS_EVENT *OSSemCreate(

INT16U cnt //信号量计数器初值

任务调用函数OSSemPend()请求信号量。函数OSSemPend()的原型如下:void OSSemPend(OS_EVENT * pevent, //信号量的指针

INT16U timeout, //等待时限

INT8U *err //错误信息

);

任务获得信号量,并在访问共享资源后,必须释放信号量。释放信号量也叫做发送信号量,调用函数OSSemPost(),原型如下:

INT8U OSSemPost(

OS_EVENT *pevent //信号量的指针

);

因此在程序中调用了相关函数:

在MyTask任务中请求信号量

在HerTask任务中发送信号量,并建立一个循环让HerTask每运行三次发送一个信号量。

关于MyTask调用的函数是这样的:

以上就是信号量的部分,为了使程序实现更多的内容,便加入了消息邮箱的设计。

定义事件控制块指针:

创建消息邮箱;

Times作为变量记录MyTask运行次数

在YouTask请求消息邮箱

三、课程程序设计:

所设计的程序,该程序有MyTask、YouTask和HerTask三个任务,在任务MyTask 中用一个变量Times记录任务MyTask的运行次数,并用消息邮箱发给YouTask并由YouTask显示,同时MyTask是有HerTask发信号量控制运行。信号量为1这MyTask运行,为0则不运行。

程序如下:

/************************Test*************************************/

#include ""

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

OS_STK StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区

OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区

OS_STK YouTaskStk[TASK_STK_SIZE]; //定义任务堆栈区

OS_STK HerTaskStk[TASK_STK_SIZE]; //定义任务堆栈区

INT16S key;

char *s1="MyTask";

char *s2="HerTask"; //用于退出的键

char *s;

char *ss;

INT8U err;

INT8U y=0; //字符显示位置

INT8U YouTaskRun=0;

INT8U HerTaskRun=0;

OS_EVENT *Fun_Semp;

INT32U Times=0;

OS_EVENT *Str_Box;

void Fun(INT8U x,INT8U y);

void StartTask(void *data); //声明起始任务

void MyTask(void *data); //声明任务

void YouTask(void *data); //声明任务

void HerTask(void *data); //声明任务

/************************主函数*********************************/

void main (void)

{

OSInit( ); //初始化uCOS_II

PC_DOSSaveReturn( ); //保存Dos环境

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

Str_Box = OSMboxCreate((void*)0); //创建消息邮箱

OSTaskCreate(StartTask, //创建任务StartTask (void*)0, //给任务传递参数

&StartTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶

0); //使任务的优先级别为0

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

}

/***********************任务StartTask*******************************/ void StartTask (void *pdata)

{

#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;

#endif

pdata = pdata;

相关文档
最新文档