嵌入式实时操作系统
实验报告
化学实验报告单总流体力学实验报告观察种子结构实验报告观察种子结构实验报告单观察种子的结构实验报告单
《实验三消息队列与任务间通信》
班级嵌入式11002班
姓名朱杰
学号 1004681224
指导教师 谢治平
一实验要求
本次通过
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
两个实验任务,了解嵌入式实时操作系统μ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;
OSQPostFront(Str_Q,&mess);
sprintf(buf, "TA2 post\n");
armulPrintf(buf);
OSTimeDlyHMSM(0,0,3,0);
}
}
void TA3(void *pdata){
for(;;){
Mess* receive;
receive=OSQPend(Str_Q,0,&err);
if(receive->list==1)
{
total+=receive->num;
sprintf(buf,"TA1 Post %d...,total=%d \n", receive->num,total);
armulPrintf(buf);
}
else
{
sprintf(buf, "TA2 Post %d... \n", receive->num);
armulPrintf(buf);
}
OSTimeDlyHMSM(0,0,1,0);
}
}
(3) 实验运行效果
实验设计二
(1)实验要求
◆ 在设计I的基础上,要求保证在任何情况下,在任一时刻消息队列q1中来自任务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 *sem1;
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();
sem1 = OSSemCreate(1);
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);
OSSemPend(sem1,0,&err);
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;
OSQPostFront(Str_Q,&mess);
sprintf(buf, "TA2 post\n");
armulPrintf(buf);
OSTimeDlyHMSM(0,0,3,0);
}
}
void TA3(void *pdata){
for(;;){
Mess* receive;
receive=OSQPend(Str_Q,0,&err);
if(receive->list==1)
{
total+=receive->num;
sprintf(buf,"TA1 Post %d...,total=%d TA1读出\n", receive->num,total);
armulPrintf(buf);
OSSemPost(sem1);
}
else
{
sprintf(buf, "TA2 Post %d...TA2读出 \n", receive->num);
armulPrintf(buf);
}
OSTimeDlyHMSM(0,0,1,0);
}
}
(3) 实验运行效果