ucosII实验报告
更新时间:2024-02-29 14:57:01 阅读量: 综合文库 文档下载
- ucosii实验报告总结推荐度:
- 相关推荐
实验1《任务的创建、删除、挂起、恢复》
实验学时: 2 实验地点: 二综x203 实验日期: 2013/12/13
一、实验目的
1.实验环境的建立 2.任务的接口函数的应用 二、实验内容
1.设计一个只有一个任务Task1,当程序运行后任务的工作就是每秒在显示器上显示一个字符“M”。
2. 在任务Task1中在创建一个任务Task2 。当程序运行后,任务Task1的工作在显示器上显示一个字符“M”;Task2 则是在显示器上显示字符 “Y”。
3. 要求任务Task2运行20次后,挂起任务Task1;任务Task2运行40次后,恢复任务Task1。
4. 当任务Task1运行5次时,用函数OSSchedLock()对调度器进行加锁;而当任务Task1运行到第10次时,再用函数OSSchedUnlock()对调度器进行解锁,并运行该程序。
5. 使任务Task1能删除任务Task2。 三、实验方法
包括实验方法、原理、技术、方案等。 四、实验步骤
1.将BC45文件夹拷贝到C分区根目录下。 2.将software文件夹拷贝到任意分区根目录下。 3. 分别完成实验1、2、3、4、5 五、实验结果
1. DOS窗口每秒显示一个字符“M”。每行显示10个“M”字符,行与行的间隔是一行。按ESC键程序退出
2. DOS窗口交替显示字符\和“Y”,每隔一秒显示一次。每行显示10个字符,行与行之间的间隔是一行。 按ESC键程序退出
3.DOS窗口开始交替显示字符\和“Y”,显示20次以后,Task1挂起,只显示“Y”,当Task2运行40次以后,Task1恢复,然后开始Task1,Task2交替运行。
4.DOS窗口开始交题显示字符\和“Y”,显示5次以后,Task1将任务调度器上锁,此时只有“M”打印,当Task1运行10次后,Task1,Task2开始交替运行。
5.DOS窗口开始交替显示字符“M”和“Y”,显示10次后,只显示“Y” 六、实验结论
对实验数据和结果进行分析描述,给出实验取得的成果和结论。
1.
程序:/******** * Exercise 2 - 1 * author: csu chenan * time: 2013 - 12 - 12 ********/
#include \
#define TASK_STK_SIZE 256
OS_STK MyTaskStk[TASK_STK_SIZE]; INT16S key; INT8U x = 0, y = 0;
void MyTask(void *pdata){ #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
OS_ENTER_CRITICAL(); PC_VectSet(0X08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit(); for(;;){ if(x > 10){ x = 0; y = y + 2;
}
PC_DispChar(x, y,
*(char*)pdata,,DISP_BGND_BLACK
DISP_FGND_WHITE);
x = x + 1;
if(PC_GetKey(&key) == 1){
+
}
}
}
if(key == 0x1B){ }
PC_DOSReturn();
OSTimeDlyHMSM(0,0,1,0);
void main(void){ } 2.
OSStart();
OSTaskCreate(MyTask, ch, &MyTaskStk[TASK_STK_SIZE-1], 0); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); char * ch = \
程序源代码: /******** * Exercise 2 - 2 * author: csu chenan
* time: 2013 - 12 - 13 ********/
#include \
#define My_TASK1_STK_SIZE 256 #define My_TASK2_STK_SIZE 256
OS_STK MyTask1Stk[My_TASK1_STK_SIZE]; OS_STK MyTask2Stk[My_TASK2_STK_SIZE];
INT16S key; INT8U x = 0, y = 0;
void MyTask2(void *pdata){ #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
OS_ENTER_CRITICAL(); PC_VectSet(0x80, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); for(;;){ if(x > 10){ x = 0; y = y + 2;
}
PC_DispChar(x, y,
*(char*)pdata,
DISP_FGND_WHITE);
x = x + 1;
if(PC_GetKey(&key) == 1){ if(key == 0x1B){ PC_DOSReturn();
}
DISP_BGND_BLACK
+
}
OSTimeDlyHMSM(0,0,1,0);
}
}
void MyTask1(void *pdata){ #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
char *ch = \ pdata = pdata;
OS_ENTER_CRITICAL(); PC_VectSet(0X08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask2, ch, &MyTask2Stk[My_TASK2_STK_SIZE - 1], 1); for(;;){ if(x > 10){ x = 0; y = y + 2;
}
PC_DispChar(x, y,
*(char*)pdata,
DISP_BGND_BLACK
DISP_FGND_WHITE);
x = x + 1;
if(PC_GetKey(&key) == 1){ if(key == 0x1B){ PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
+
2.
3.
4.
5.
六、实验结论
对实验数据和结果进行分析描述,给出实验取得的成果和结论。 1. OS_CPU_C.c
#if OS_CPU_HOOKS_EN > 0
INT16U d=0; INT16U d1=0;
void OSTimeTickHook (void) {
char* s0 = \ char* s1 = \
char* s2 = \ char s[8];
if(d == 500) {
PC_DispStr(14,4,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr(18,4,s0,DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr(22,4,s2,DISP_BGND_BLACK+DISP_FGND_WHITE); sprintf(s,\
PC_DispStr(31,d1+5,s,DISP_BGND_BLACK+DISP_FGND_WHITE); d = 0; d1 += 1;
} d += 1; } #endif
#include \
#define TASK_STK_SIZE 512 OS_STK MyTaskStk[TASK_STK_SIZE]; INT16S key; INT8U x=0,y=0; void main (void) {
char* s_M=\*/
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSTaskCreate(MyTask,s_M, &MyTaskStk[TASK_STK_SIZE - 1], 0); */ }
void MyTask(void *pdata) {
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif
void MyTask(void *data);
OSInit(); /* Initialize uC/OS-II
OSStart(); /* Start multitasking
pdata = pdata; /* Prevent compiler warning */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL();
OSStatInit(); for (;;) { } }
2.程序:OS_COPU_C.c #if OS_CPU_HOOKS_EN > 0
extern BOOLEAN InterKey; INT16U InterCtr = 0;
void OSTimeTickHook (void)
if(x>10) { }
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE); x+=1;
if(PC_GetKey(&key) == 1) { }
OSTimeDlyHMSM(0,0,1,0);
if(key == 0x1B) { }
PC_DOSReturn(); x=0; y+=2;
{
if(InterCtr == 10000) { }
InterCtr++; } #endif Test.c
#include \
#define TASK_STK_SIZE 512
//任务堆栈长度
//定义任务堆栈区 //定义任务堆栈区 //定义任务堆栈区
OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; OS_STK InterTaskStk[TASK_STK_SIZE]; INT16S key;
INT8U x=0,y=0;
InterKey = 1;
//用于退出uCOS_II的键 //字符显示位置 //声明任务 //声明任务 //声明任务
BOOLEAN InterKey=FALSE; void MyTask(void *data); void YouTask(void *data); void InterTask(void *data); void main (void) {
char* s_M=\ OSInit( );
//定义要显示的字符 //保存Dos环境
//安装uCOS_II中断
//初始化uCOS_II
PC_DOSSaveReturn( );
PC_VectSet(uCOS, OSCtxSw); OSTaskCreate( }
void MyTask (void *pdata)
MyTask, s_M, 0 );
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
//创建任务MyTask //给任务传递参数
//设置任务堆栈栈顶指针
&MyTaskStk[TASK_STK_SIZE - 1],
//任务的优先级别为0
//启动多任务管理
OSStart( );
OSTimeDly(300); } }
void YouTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
for (;;) { if (x>50)
{ x=0; y+=2; }
//显示字符的位置 //延时100个时钟节拍
PC_DispChar(x, y,
*(char*)pdata,
DISP_BGND_BLACK+DISP_FGND_WHITE );
x += 1;
//延时500个时钟节拍
} } 4.
OSTimeDly(500);
#include \
#define TASK_STK_SIZE 512 INT16S key; INT32U stime; INT8U x=0; void main (void) {
OSInit();
//初始化uCOS_II
//声明一个任务
//用于退出uCOS_II的键
//任务堆栈长度
//定义任务堆栈区
OS_STK TaskStartStk[TASK_STK_SIZE];
void MyTask(void *data);
PC_DOSSaveReturn();
//保存Dos环境
//安装uCOS_II中断
PC_VectSet(uCOS, OSCtxSw); OSTaskCreate(MyTask, }
void MyTask (void *pdata) { char s[5];
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
OS_ENTER_CRITICAL();
(void*)0, 0);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
//创建任务MyTask
//给任务传递参数
//使任务MyTask的优先级别为0
//启动uCOS_II的多任务管理
&TaskStartStk[TASK_STK_SIZE - 1],//设置任务堆栈栈顶指针
OSStart();
PC_VectSet(0x08, OSTickISR); //安装uCOS_II时钟中断向量 PC_SetTickRate(OS_TICKS_PER_SEC); //设置uCOS_II时钟频率 OS_EXIT_CRITICAL(); OSStatInit(); for (;;) {
if (x==10)
{
OSTimeSet(10); }
stime=OSTimeGet(); sprintf(s,\ PC_DispStr(5, 2,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE );
x += 1;
//在x,y位置显示s中的字符
//初始化uCOS_II的统计任务
//如果按下Esc键则退出uCOS_II if (PC_GetKey(&key) == TRUE) {
if (key == 0x1B)
{
PC_DOSReturn(); } }
OSTimeDlyHMSM(0, 0, 1, 0); } } 5.
#include \#include \
#define MAXSTKSIZE 512
void TASK1(void *ppdata); void TASK2(void *ppdata); void TASK3(void *ppdata);
OS_STK TASK1STK[MAXSTKSIZE]; OS_STK TASK2STK[MAXSTKSIZE]; OS_STK TASK3STK[MAXSTKSIZE];
INT8U times=1;
void main(void) {
InitTimer0();
OSStart();
InitSerial();
//创建三个任务
OSTaskCreate(TASK1,(void *)0,&TASK1STK[0],1); OSTaskCreate(TASK2,(void *)0,&TASK2STK[0],2); OSTaskCreate(TASK3,(void *)0,&TASK3STK[0],3);
OSInit();
//运行次数
//等待
}
void TASK1(void *ppdata) { }
void TASK2(void *ppdata) { }
void TASK3(void *ppdata) {
ppdata = ppdata; for(;;) {
Uart0_print(\
//Uart0_printR(\OSIdleCtr=OSIdleCtr; OSTimeDlyHMSM(0,0,1,0);
ppdata=ppdata; for(;;) { }
Uart0_print(\
//Uart0_printR(\OSIdleCtr=OSIdleCtr; OSTimeDlyHMSM(0,0,1,0);
for(;;) { }
Uart0_print(\ OSIdleCtr=OSIdleCtr; OSTimeDlyHMSM(0,0,1,0); ppdata=ppdata; ET0=1;
}
}
七、实验小结
本次实验对中断的处理过程等有了更深一步的了解,对与uc/OS的中断机制有了比较详细的了解。实验中通过对uc/os时钟中断的使用,对uc/OS的时钟等有了比较深入的了解同时在做实验的过程中,对于UC/OS的工作原理有了很深的了解。对UC/OS的程序编写也更熟悉了。
实验3《信号量应用》
实验学时: 2 实验地点: 综二实验室x201 实验日期: 2013/12/16
一、实验目的
1.实验环境的建立
2.任务的通信机制之信号量应用及解决优先级反转 二、实验内容
1.设计应用程序中有2个用户任务:MyTask和YouTask。这两个任务都要访问同一个共享资源s,但YouTask访问s需要的时间长一些(本例中使用了一个循环来模拟访问的时间),而MyTask访问s的时间要短一些,这样就不可避免的出现了在任务YouTask访问s期间,任务MyTask也来访问s,从而出现了干扰,观察干扰现象,解释原因。
2.3.
访问共享资源s,以解决实验1中的冲突问题。 果。(不做) 三、实验方法
包括实验方法、原理、技术、方案等。 四、实验步骤
1.将BC45文件夹拷贝到C分区根目录下。 2.将software文件夹拷贝到任意分区根目录下。 3. 分别完成实验1、2、3。 五、实验结果
1.实验运行结果如下:
在应用程序中定义一个全局变量ac_key来作为信号量,并根据该信号量的状态来 在实验2中,把使用的信号量改为互斥型信号量,然后运行该程序并观察其运行结
2.实验运行结果如下:
3.实验运行结果如下:
六、实验结论
对实验数据和结果进行分析描述,给出实验取得的成果和结论。 1.核心代码如下:
/************************Test************************************/ #include \
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK YouTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 INT16S key; INT8U char *s=\;
//用于退出uCOS_II的键 //字符显示位置
y1=0,y2=0;
//任务堆栈长度
//定义要显示的字符
void MyTask(void *data);
//声明任务 //声明任务
void YouTask(void *data); void main (void) {
OSInit( );
/************************主函数**********************************/
//初始化uCOS_II
PC_DOSSaveReturn( ); //保存Dos环境 //安装uCOS_II中断 //创建任务MyTask
//给任务传递参数
PC_VectSet(uCOS, OSCtxSw); OSTaskCreate(MyTask, }
(void*)0, 0);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
//使任务的优先级别为0 //启动多任务管理
OSStart( );
/***********************任务MyTask********************************/
void MyTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
INT8U err;
pdata = pdata; OS_ENTER_CRITICAL( );
PC_VectSet(0x08, OSTickISR); OS_EXIT_CRITICAL( ); OSStatInit( );
(void*)0, 2);
//初始化统计任务 //创建任务YouTask //给任务传递参数
OSTaskCreate(YouTask,
//安装时钟中断向量 //设置uCOS_II时钟频率
PC_SetTickRate(OS_TICKS_PER_SEC);
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
//使任务的优先级别为2
for (;;) {
s=\;
PC_DispStr(5, ++y1,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE);
//显示字符串
//如果按下Esc键则退出uCOS_II
if (PC_GetKey(&key) == TRUE) {
if (key == 0x1B)
{
PC_DOSReturn( ); } } } }
/************************任务YouTask******************************/ void YouTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
INT8U err; pdata = pdata; for (;;)
{
s=\;
PC_DispStr(28, ++y2,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE );
//置OSTime为0
//显示字符串
//等待200个时钟节拍
OSTimeDly(200);
OSTimeSet(0); { }
while(OSTime<500)
PC_DispStr(55, y2,
s,
DISP_BGND_BLACK+DISP_FGND_YELLOW );
//等待10个时钟节拍
//显示字符串
OSTimeDly(10); } }
/************************End**************************************/
2.实验核心代码如下:
/************************Test**************************************/ #include \
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK YouTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 INT16S key; INT8U
//用于退出uCOS_II的键 //字符显示位置
y1=0,y2=0;
//任务堆栈长度
BOOLEAN ac_key; //定义信号量
char* s=\原始数据\;
//定义要显示的字符
//声明任务 //声明任务
void MyTask(void *data);
void YouTask(void *data); void main (void) {
OSInit( ); ac_key=1;
/************************主函数*********************************/
//初始化uCOS_II
//设置信号量初值 //保存Dos环境 //安装uCOS_II中断 //创建任务MyTask
//给任务传递参数
PC_DOSSaveReturn( );
PC_VectSet(uCOS, OSCtxSw); OSTaskCreate(MyTask,
OSStart( ); }
(void*)0, 0);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
//使任务的优先级别为0 //启动uCOS_II的多任务管理
/***********************任务MyTask********************************/
void MyTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif INT8U err;
pdata = pdata; OS_ENTER_CRITICAL( );
PC_VectSet(0x08, OSTickISR); OS_EXIT_CRITICAL( ); OSStatInit( );
(void*)0, 2);
//初始化uCOS_II的统计任务 //创建任务MyTask //给任务传递参数
OSTaskCreate(YouTask,
//安装uCOS_II时钟中断向量 //设置uCOS_II时钟频率
PC_SetTickRate(OS_TICKS_PER_SEC);
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
//使任务的优先级别为2
for (;;) {
if(ac_key)
{
ac_key=FALSE;
//使信号量无效 //显示字符的位置
s=\;
PC_DispStr(5, ++y1,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE); ac_key=TRUE;
//发信号
}
if (PC_GetKey(&key) == TRUE) {
//如果按下Esc键则退出uCOS_II
if (key == 0x1B)
{
PC_DOSReturn( ); } } } }
/************************任务YouTask****************************/ void YouTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
INT8U err; pdata = pdata; for (;;) {
if(ac_key)
{ }
//等待10个时钟节拍
ac_key=FALSE;
//使信号量为无信号 //显示字符串
//等待20个时钟节拍
OSTimeDly(20);
s=\;
PC_DispStr(28, ++y2,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE );
//置OSTime为0
OSTimeSet(0); { }
while(OSTime<500)
PC_DispStr(55, y2,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE );
//发信号
//显示字符串
ac_key=TRUE;
OSTimeDly(10); } }
/************************End**************************************/
3.实验核心代码如下:
/************************Test*************************************/ #include \ #define TASK_STK_SIZE 512
//任务堆栈长度
//定义任务堆栈区 //定义任务堆栈区 //定义任务堆栈区 //定义任务堆栈区
OS_STK StartTaskStk[TASK_STK_SIZE]; OS_STK Task1Stk[TASK_STK_SIZE]; OS_STK Task2Stk[TASK_STK_SIZE]; OS_STK Task3Stk[TASK_STK_SIZE]; INT16S key;
char*s1=\; char*s2=\; char*s3=\; char*ss=\; INT8U err; INT8U y=0;
//字符显示位置
//定义事件控制块
//声明起始任务 //声明任务 //声明任务 //声明任务
//用于退出的键
INT32U Times=0; OS_EVENT *Mutexp;
void StartTask(void *data); void Task1(void *data); void Task2(void *data); void Task3(void *data); void main (void) {
OSInit( );
/************************主函数*********************************/
//初始化uCOS_II //保存Dos环境
//安装uCOS_II中断
//定义信号量
PC_DOSSaveReturn( );
PC_VectSet(uCOS, OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); Mutexp = OSMutexCreate (1,&err); OSTaskCreate(StartTask, }
/***********************任务StartTask*******************************/ void StartTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
(void*)0, 0);
//创建任务StartTask
//设置任务堆栈栈顶
//给任务传递参数
&StartTaskStk[TASK_STK_SIZE - 1],
//使任务的优先级别为0
//启动多任务管理
OSStart( );
pdata = pdata; OS_ENTER_CRITICAL( );
PC_VectSet(0x08, OSTickISR); OS_EXIT_CRITICAL( );
OSStatInit( );
(void*)0, 3);
//初始化统计任务
//创建任务Task1
//设置任务堆栈栈顶
OSTaskCreate(Task1,
//安装时钟中断向量
//设置uCOS_II时钟频率
PC_SetTickRate(OS_TICKS_PER_SEC);
//给任务传递参数
&Task1Stk[TASK_STK_SIZE - 1],
//使任务的优先级别为3
//创建任务Task2
//设置任务堆栈栈顶
//给任务传递参数
OSTaskCreate(Task2,
(void*)0, 4);
&Task2Stk[TASK_STK_SIZE - 1],
//使任务的优先级别为4
//创建任务Task3
//设置任务堆栈栈顶
//给任务传递参数
OSTaskCreate(Task3,
(void*)0, 5);
&Task3Stk[TASK_STK_SIZE - 1],
//使任务的优先级别为5
for (;;) {
//如果按下Esc键则退出uCOS_II
if (PC_GetKey(&key) == TRUE) {
if (key == 0x1B)
{
PC_DOSReturn( ); } }
OSTimeDlyHMSM(0, 0, 3, 0); } }
/************************任务Task1*******************************/ void Task1 (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
for (;;) {
OSTimeDlyHMSM(0, 0, 0, 300); {
//等待300毫秒 //等待3秒
PC_DispStr(10,++y,
ss,
DISP_BGND_BLACK+DISP_FGND_YELLOW );
//请求信号量
OSMutexPend(Mutexp,0,&err);
PC_DispStr(10,++y,
s1,
DISP_BGND_BLACK+DISP_FGND_RED );
OSMutexPost(Mutexp); //发送信号量
//等待200毫秒
}
OSTimeDlyHMSM(0, 0, 0, 200); } }
/************************任务Task2******************************/ void Task2 (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
for (;;)
{ PC_DispStr(10,++y,
s2,
DISP_BGND_BLACK+DISP_FGND_WHITE );
//等待100毫秒
OSTimeDlyHMSM(0, 0, 0, 100); } }
/************************任务Task3******************************/ void Task3 (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
for (;;)
{
OSMutexPend(Mutexp,0,&err); //请求信号量 PC_DispStr(10,++y,
s3,
DISP_BGND_BLACK+DISP_FGND_WHITE );
for(Times;Times<20000000;Times++)
{ } Times=0;
OSMutexPost(Mutexp);
//发送信号量
OS_Sched();
OSTimeDlyHMSM(0, 0, 0, 100); //等待100毫秒 } }
/************************End**************************************/
七、实验小结
本次实验是对任务之间的共享资源访问的限制方法。三个实验,循序渐进,第一个实验是导出共享资源会导致的问题,数据不稳定,第二个实验用一个全局变量来解决了这个问题,第三个实验用互斥信号量解决问题。以前在操作系统的课上学习过信号量的相关知识,但是没有这么具体,经过这三个实验,从发现问题到解决问题对以前的知识了解的更加具体,透彻了。通过实验对信号量的机制有了很深的理解,对信号量的操作也比较熟悉了
实验4《消息邮箱应用》
实验学时: 2 实验地点: 201 实验日期: 2013/12/13
一、实验目的
1.实验环境的建立
2.任务的通信机制之消息邮箱应用 二、实验内容
1.设计一个利用消息邮箱进行通信的例子:有两个任务MyTask和YouTask。由于任务YouTask要向任务MyTask发送消息,因此定义了一个全局的指针变量msg_p作为邮箱来传递消息的指针。
2.
设计一个应用程序,该程序有两个任务MyTask和YouTask。在任务MyTask中用一
个变量Times记录任务MyTask的运行次数,并将其作为消息用邮箱Str_Box发给任务YouTask,且由任务YouTask显示出来。 三、实验方法
按照步骤进行运行 四、实验步骤
1.将BC45文件夹拷贝到C分区根目录下。 2.将software文件夹拷贝到任意分区根目录下。 3. 分别完成实验1、2 五、实验结果
1.实验运行结果如下:
2.实验运行结果如下:
六、实验结论 1.实验核心代码如下:
/************************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]; INT16S key; INT8U void *msg_p;
y1=0,y2=0;
//消息邮箱 //声明起始任务
//声明任务 //声明任务
void StartTask(void *data); void MyTask(void *data); void YouTask(void *data); void main (void) {
OSInit( );
/************************主函数*********************************/
//初始化uCOS_II //安装uCOS_II中断 //创建任务MyTask //给任务传递参数
PC_DOSSaveReturn( ); //保存Dos环境
PC_VectSet(uCOS, OSCtxSw); OSTaskCreate(StartTask,
(void*)0,
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
&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; OS_ENTER_CRITICAL( );
PC_VectSet(0x08, OSTickISR); OS_EXIT_CRITICAL( );
OSStatInit( );
//初始化统计任务 //给任务传递参数 //使任务的优先级别为1 //创建任务YouTask //给任务传递参数 //使任务的优先级别为2
OSTaskCreate(MyTask,
(void*)0, 1);
//创建任务MyTask
//安装时钟中断向量
//设置uCOS_II时钟频率
PC_SetTickRate(OS_TICKS_PER_SEC);
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
OSTaskCreate(YouTask,
(void*)0, 2);
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
for (;;) {
//如果按下Esc键则退出uCOS_II
if (PC_GetKey(&key) == TRUE) {
if (key == 0x1B)
{
PC_DOSReturn( ); } }
OSTimeDlyHMSM(0, 0, 3, 0); } }
/************************任务MyTask*******************************/ void MyTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
//等待3秒
for (;;)
//显示字符串
{ PC_DispStr(5, ++y1,
if(msg_p!=(void*) 0) { }
//等待1秒
PC_DispStr(15,y1,
msg_p,
//显示收到的消息
DISP_BGND_BLACK+DISP_FGND_RED );
//使消息邮箱为空
//请求消息
\,
DISP_BGND_BLACK+DISP_FGND_WHITE );
msg_p=(void*) 0;
OSTimeDlyHMSM(0, 0, 1, 0); } }
/************************任务YouTask******************************/ void YouTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
char*s=\; pdata = pdata; for (;;) {
PC_DispStr(40, ++y2,
if(OSTimeGet( )>500 && msg_p==(void*) 0)
{
msg_p=s;
//发送消息
PC_DispStr(50,y2,
\, DISP_BGND_BLACK+DISP_FGND_RED );
//等待1秒
\,
DISP_BGND_BLACK+DISP_FGND_WHITE );
//显示字符串
//定义消息
}
OSTimeDlyHMSM(0, 0, 2, 0); } }
/************************End**************************************/
2.核心代码如下:
/************************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]; INT16S key; char*s; char*ss; INT8U err; INT8U y=0;
//字符显示位置
//声明起始任务 //声明任务 //声明任务
//用于退出的键
INT32U Times=0; OS_EVENT *Str_Box;
void StartTask(void *data); void MyTask(void *data);
void YouTask(void *data); void main (void) {
OSInit( );
/************************主函数*********************************/
//初始化uCOS_II //保存Dos环境
//安装uCOS_II中断
//创建互斥型信号量
PC_DOSSaveReturn( );
PC_VectSet(uCOS, OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); Str_Box = OSMboxCreate ((void*)0); OSTaskCreate(StartTask, }
/***********************任务StartTask*******************************/ void StartTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata; OS_ENTER_CRITICAL( );
PC_VectSet(0x08, OSTickISR); OS_EXIT_CRITICAL( );
OSStatInit( );
(void*)0,
//初始化统计任务 //创建任务MyTask
OSTaskCreate(MyTask,
//安装时钟中断向量
//设置uCOS_II时钟频率
PC_SetTickRate(OS_TICKS_PER_SEC);
(void*)0, 0);
//创建任务StartTask
//设置任务堆栈栈顶
//给任务传递参数
&StartTaskStk[TASK_STK_SIZE - 1],
//使任务的优先级别为0
//启动多任务管理
OSStart( );
//给任务传递参数
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶 3);
//使任务的优先级别为3
//创建任务YouTask
//给任务传递参数
OSTaskCreate(YouTask,
(void*)0, 4);
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
//使任务的优先级别为4
for (;;) {
//如果按下Esc键则退出uCOS_II if (PC_GetKey(&key) == TRUE) { {
if (key == 0x1B) PC_DOSReturn(); } }
OSTimeDlyHMSM(0, 0, 3, 0); } }
/************************任务MyTask*******************************/ void MyTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
for (;;) {
sprintf(s,\ ,Times); OSMboxPost(Str_Box,s);
Str_Box->OSEventPtr,//s,
DISP_BGND_BLACK+DISP_FGND_WHITE );*/
//等待1秒 //发送消息
//等待3秒
/*PC_DispStr(10,++y,
Times++;
OSTimeDlyHMSM(0, 0, 1, 0); } }
/************************任务YouTask******************************/ void YouTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr; #endif
pdata = pdata;
for (;;) {
ss=OSMboxPend(Str_Box,10,&err);
ss,
DISP_BGND_BLACK+DISP_FGND_WHITE );
//等待1秒
PC_DispStr(10,++y,
OSTimeDlyHMSM(0, 0, 1, 0); } }
/************************End**************************************/
七、实验小结
本次实验二个题目,对消息邮箱的应用,和信号量不同的是传递的是一个全局的指针变量,指针指向要传递的消息。其余没有太多不同。消息邮箱的操作和信号量的操作类似,用于任务间消息传递。
实验5《消息队列应用》
实验学时: 2 实验地点: 201 实验日期: 2013/12/15
一、实验目的
1.实验环境的建立
2.任务的通信机制之消息队列应用 二、实验内容
1.设计一个应用消息队列进行通信的应用程序,运行该程序并观察其运行结果。 2. 在KEIL开发环境下,用多任务及某种事件机制实现按下键盘时可以控制对应的LED亮灭: 按下P3.2键盘时P1.0、P1.1对应的LED点亮,按下P3.3键盘时P1.2、P1.3对应的LED点亮,按下P3.4键盘时P1.4、P1.5对应的LED点亮,按下P3.5键盘时P1.6、P1.7对应的LED点亮,没有键盘按下时,LED全灭。 三、实验方法
按照步骤进行运行 四、实验步骤
1.将BC45文件夹拷贝到C分区根目录下。 2.将software文件夹拷贝到任意分区根目录下。 3. 安装KEIL2集成开发环境及其插件。 4. 分别完成实验1、2 五、实验结果
1.实验运行结果如下:
2.实验运行结果如下:
六、实验结论 1.核心代码如下:
/************************Test*************************************/ #include \
#define TASK_STK_SIZE 512 #define N_MESSAGES 128
//任务堆栈长度 //定义消息队列长度
//定义任务堆栈区 //定义任务堆栈区 //定义任务堆栈区
OS_STK StartTaskStk[TASK_STK_SIZE]; OS_STK MyTaskStk[TASK_STK_SIZE]; INT16S key; char*ss; char*s; INT8U flag=1;
void *MsgGrp[N_MESSAGES]; INT8U err; INT8U y=0;
INT8U times=0;
OS_STK YouTaskStk[TASK_STK_SIZE];
//用于退出的键
//定义消息指针数组
//字符显示位置 //定义事件控制块
//声明起始任务 //声明任务 //声明任务
OS_EVENT *Str_Q;
void StartTask(void *data); void MyTask(void *data); void YouTask(void *data); void main (void) {
OSInit( );
/************************主函数*********************************/
//初始化uCOS_II
//保存Dos环境
//安装uCOS_II中断
PC_DOSSaveReturn( );
PC_VectSet(uCOS, OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
Str_Q = OSQCreate (&MsgGrp[0],N_MESSAGES); OSTaskCreate(StartTask, }
(void*)0, 0);
//给任务传递参数
//创建消息队列
//创建任务StartTask
//设置任务堆栈栈顶
&StartTaskStk[TASK_STK_SIZE - 1],
//使任务的优先级别为0
//启动多任务管理
OSStart( );
/***********************任务StartTask*******************************/ void StartTask (void *pdata) {
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
pdata = pdata;
OS_ENTER_CRITICAL( ); PC_VectSet(0x08, OSTickISR); OS_EXIT_CRITICAL( );
//OSStatInit( );
(void*)0, 3);
//初始化统计任务
//创建任务MyTask
OSTaskCreate(MyTask,
//安装时钟中断向量
//设置uCOS_II时钟频率
PC_SetTickRate(OS_TICKS_PER_SEC);
//给任务传递参数 //使任务的优先级别为3
//创建任务YouTask
//设置任务堆栈栈顶
//给任务传递参数 //使任务的优先级别为4
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
OSTaskCreate(YouTask,
(void*)0, 4);
&YouTaskStk[TASK_STK_SIZE - 1],
OSQFlush(Str_Q); for (;;) { if(flag)
{
s=\;
OSQPostFront(Str_Q,s); //向消息队列插入一个消息 s=\;
OSQPostFront(Str_Q,s); //向消息队列插入一个消息 s=\;
OSQPostFront(Str_Q,s); //向消息队列插入一个消息 s=\;
OSQPostFront(Str_Q,s); //向消息队列插入一个消息 s=\;
正在阅读:
ucosII实验报告02-29
谜语:轻骑飞跃(打《三国演义》人名)的相关文章推荐02-07
大学生村官02-07
PJ32型铺轨机技术条件 - 图文12-23
初中毕业生感言(优秀5篇)04-02
电气自动化技术专业求职信范文01-03
物理教材引入科学史的新观点_胡扬洋06-09
《畜禽生产》养牛测试题(多选题)10-21
穴位注射加隔药纱灸治疗慢性咽炎40例07-01
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 报告
- ucosII
- 国内外生态农业研究现状
- C语言程序设计课程形成性考核册(保留版)
- 备考四级考试—词汇活记活用(三)
- 老年糖尿病夜间低血糖的预防和护理
- 高等土力学模拟考题3及答案
- 友谊学校创建“平安先行学校”工作方案
- 关于切实做好联网核查公民身份信息有关工作的通知
- 浅谈建筑施工企业财务管理的信息化网络化
- 土壤组成对葡萄影响
- PIT-W2009中文操作手册(最新)精简版
- 公开选拔副科级领导干部公共科目试题1
- 正己烷-正庚烷分离过程筛板精馏塔课程设计- 副本 - 图文
- 气功修炼十奥妙
- 关于东方航空估值介绍 - 图文
- 尔雅通识课程 大学生心理健康教育习题库
- 2018届毕业典礼暨学位授予仪式讲话稿:与时代同行向未来致敬
- Protel总结报告
- 公路工程试验检测人员考试题 - --公路(试题)
- 苏教版初中二年级语文下册《送东阳马生序》教学设计
- C++程序设计上机题