ucos消息队列通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式实时操作系统实验报告《实验三消息队列与任务间通信》
班级嵌入式11002班
姓名朱杰
学号1004681224
指导教师谢治平
一实验要求
本次通过设计两个实验任务,了解嵌入式实时操作系统µC/OS-II中消息队列机制的基本原理和使用方法。
二实验目的
掌握嵌入式实时操作系统µC/OS-II中消息队列机制的基本原理和使用方法。
三操作系统配置
#define OS_MAX_TASKS 3
/*最多可以创建3个任务*/
#define OS_LOWEST_PRIO 16
/*任务优先级不可以大于14*/
#define OS_TASK_CREATE_EN 1
/*允许使用OSTaskCreate()*/
#define OS_TASK_SUSPEND_EN 1
/*允许使用OSTaskSuspend() and OSTaskResume()*/
四.µC/OS-II相关函数
OSTaskCreate():建立一个新任务
OSQCreate():建立一个消息队列
OSQPend():等待消息
OSQPostFront() :向消息队列发送消息
OSQPost():向消息队列发送消息
五相关系统调用
·OSTaskCreate():建立一个新任务
·OSTaskSuspend():无条件挂起一个任务
·OSTaskResume():唤醒一个挂起的任务
·OSTimeDly():将一个任务延时若干个时钟节拍
六应用任务
实验设计I
(1)设计I要求
●通过消息队列在任务间传递数据:
任务TA1以随机(或固定)时间间隔依次将数据1、2、3、...发送至消息队列q1,每次发送一个数据。
TA2以随机(或固定)时间间隔将随机数据发送至q1。
TA3从消息队列q1中每次接收一个数据:
如果数据来自TA1,则计算出所有已接收的来自TA1的数据之和,然后延时;
如果数据来自TA2,则将数据输出到屏幕,然后延时(模拟处理数据所需的时间);
●调整发送数据和处理数据的速度,观察发送速度大于处理速度的结果
(2)实验代码
#include "../ucos-ii/includes.h" /* uC/OS interface */
#include "string.h"
//#include "includes.h"
#define TASK_STK_SIZE 512
#define N_MESSAGES 128
OS_STK TaskStartStk[TASK_STK_SIZE]; /* TaskStart任务堆栈*/ OS_STK TA1Stk[TASK_STK_SIZE];
OS_STK TA2Stk[TASK_STK_SIZE];
OS_STK TA3Stk[TASK_STK_SIZE];
OS_EVENT *Str_Q;
void TaskStart(void *data);
void TA1(void *pdata);
void TA2(void *pdata);
void TA3(void *pdata);
INT8U err;
INT8U total=0;
charbuf[128];
void * ql[N_MESSAGES] ;
typedefstruct{
int list;
intnum;
}Mess;
void Main(void)
{
//Target_Init();
ARMTargetInit();
OSInit();
Str_Q=OSQCreate(&ql[0],N_MESSAGES);
OSTaskCreate(TaskStart,(void*)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
ARMTargetStart();
OSStart();
while(1);
}
voidTaskStart(void *pdata){
OSTaskCreate(TA1,(void*)0, &TA1Stk[TASK_STK_SIZE - 1],1); /* 创建任务TA1 */ OSTaskCreate(TA2,(void*)0, &TA2Stk[TASK_STK_SIZE - 1],2); /* 创建任务TA2 */ OSTaskCreate(TA3,(void*)0, &TA3Stk[TASK_STK_SIZE - 1],3); /* 创建任务TA3 */
while(1)
OSTimeDly(1000);
}
void TA1(void *pdata){
INT8U err;
for(;;){
INT32U t;
INT32U r;
Mess mess;
t = OSTime;
r = srand(t);
mess.list=1;
mess.num=3;
OSQPostFront(Str_Q,&mess);
sprintf(buf, "TA1 post\n");
armulPrintf(buf);
OSTimeDlyHMSM(0,0,2,0);
}
}
void TA2(void *pdata){
for(;;){
INT32U t;
INT32U r;
Mess mess;
t = OSTime;
r = srand( t );
mess.list=2;
mess.num=2;