实时操作系统课程实验报告
专业:通信1001 学号:3100601025 姓名:陈治州
完成时间:2013年6月11日
实验 简易电饭煲的模拟
一.实验目的:
掌握在基于嵌入式实时操作系统µC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。
二.实验要求:
1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择;
3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间;
4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式;
5.按“X”退出系统,时间区域不显示。
6.煮饭时长为30,煮粥时长为50,煮面时长为40.三.实验设计:
1.设计思路:
以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。
本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示:
Main()Taskstart()Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。 (2)按键查询与响应:
Main()Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能:
l计数“C”按键的次数M=l%3Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“ ”以“擦出”之前画下的“@”,注意l自增。
四.主要代码:
#include \"stdio.h\" #include \"includes.h\" #include \"time.h\" #include \"dos.h\" #include \"sys/types.h\" #include \"stdlib.h\" #define TASK_STK_SIZE
512
#define N_TASKS
OS_STK
TaskStk[N_TASKS][TASK_STK_SIZE];
OS_STK
TaskStartStk[TASK_STK_SIZE];
INT8U
TaskData[N_TASKS];
void Task0(void *pdata);
void TaskStart(void *pdata);
static void TaskStartDispInit(void);
void main (void) {
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
OSStart();
} void TaskStart (void *pdata) { #if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr; #endif
INT8U l,m;
INT16S key;
l=0;
pdata = pdata;
TaskStartDispInit();
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
for (;;) {
if (PC_GetKey(&key) == TRUE)
{
switch(key)
{
case 0x1B:
PC_DOSReturn();
break;
case 0x43:
{ m=(l%3);
switch(m)
{ case 0: {
PC_DispStr( 26,6, \"@\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 40,6, \" \", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 55,6, \" \", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); } break;
case 1: { PC_DispStr( 26,6, \" \", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 40,6, \"@\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 55,6, \" \", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); } break; case 2: { PC_DispStr( 26,6, \" \", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 40,6, \" \", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 55,6, \"@\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); }
break; }
l++; } break;
} } OSCtxSwCtr = 0;
OSTimeDlyHMSM(0, 0, 1, 0);
} } static void TaskStartDispInit (void) { PC_DispStr( 0, 0, \"
uC/OS-II, The Real-Time Kernel
\", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK); PC_DispStr( 0, 1, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 2, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 3, \"
dianfanbao shiyan
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 4, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 5, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 6, \"
kai shi.
zhu fan.
zhu zhou.
zhu mian.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 7, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 8, \"
bao wen.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 9, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 10, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 11, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 12, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 13, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 14, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 15, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 16, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 17, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 18, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 19, \" \'S\':kai ji.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK); PC_DispStr( 0, 20, \" \'C\':mo shi qie huan.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK); PC_DispStr( 0, 21, \" \'B\':kai shi zhi xin.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK); PC_DispStr( 0, 22, \" \'Q\':qu xiao dang qian gong zuo zhuang tai.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK); PC_DispStr( 0, 23, \" \'X\':tui chu xi tong.
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
PC_DispStr( 0, 24, \"
\", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK); }
五.运行界面:
(1)主界面:
(2)显示北京时间:
(3)模式切换:
(4)倒计时:
(5)保温执行时间:
六.总结:
本次实验主要以老师所给的实验事例为基础,并结合老师课堂讲的内容,理解编写程序。 做实验本实验前,先执行了一下事例程序,以此了解borlandc的一些基本操作;然后就是看懂每个实验的框架和主要部分;接着,将事例程序中的部分思想运用到本次实验中,其中以显示界面的思想运用的最多;除此以外,在模式切换上花了最大的精力,最终的解决方法是以变量l作为一个计数值,并运用switch语句在选择的模式上画上“@”,同时还得注意在未选择的模式上画上空格来“擦除”之前画上的@;在查询按键上,同样运用switch语句......这次实验收获不少,不仅对之前学的C语言有了更进一步的巩固,而且还强化了ucos里面的多任务的一些认识;同时,以前对DOS界面很陌生,但本次实验使用的正是DOS界面,通过几天的经历,对DOS中的编译、“help”等各个方面有了更深入的认识,不再害怕使用DOS了。
对本课程有很大的兴趣,在以后的课余时间里我会不断学习这些知识。
嵌入式实时操作系统(dynaLinux),及其开发平台(精)