嵌入式课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;