嵌入式实验报告.docx
- 文档编号:6614723
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:13
- 大小:43.91KB
嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
目录
1.实验目的1
2.实验系统简介2
2.1µC/OS-II概述2
2.2µC/OS-II的特点2
2.3µC/OS-II主要源代码文件介绍3
3.代码4
3.1Pc.c4
3.2TEST.C主程序8
4.实验效果12
5.实验总结13
1.实验目的
通过此实验系统,读者可以了解嵌入式实时操作系统µC_OS-II的内核机制和运行原理。
本实验系统展示了µCOS-II各方面的管理功能,包括信号量、队列、内存、时钟等。
在各个实验中具体介绍了µCOS-II的相关函数。
在做实验的同时能够结合理论知识加以分析,了解各个函数的作用和嵌入式应用程序的设计方法,最终对整个µCos和嵌入式操作系统的应用有较为清楚的认识。
2.实验系统简介
2.1µC/OS-II概述
µC/OS-II是一个抢占式实时多任务内核。
µC/OS-II是用ANSI的C语言编写的,包含一小部分汇编语言代码,使之可以提供给不同架构的微处理器使用。
至今,从8位到64位,µC/OS-II已经在40多种不同架构的微处理器上使用。
世界上已经有数千人在各个领域中使用µC/OS,这些领域包括:
照相机行业、航空业、医疗器械、网络设备、自动提款机以及工业机器人等。
µC/OS-II全部以源代码的方式提供给读者,大约有5500行。
CPU相关的部分使用的是针对Intel80x86微处理器的代码。
虽然µC/OS-II可以在PC机上开发和测试,但是可以很容易地移植到不同架构的嵌入式微处理器上。
2.2µC/OS-II的特点
1、源代码:
µC/OS-II全部以源代码的方式提供给使用者(约5500行)。
该源码清晰易读,结构协调,且注解详尽,组织有序;
2、可移植(portable):
µC/OS-II的源代码绝大部分是用移植性很强的ANSIC写的,与微处理器硬件相关的部分是用汇编语言写的。
µC/OS-II可以移植到许许多多不同的微处理器上,条件是:
该微处理器具有堆栈指针,具有CPU内部寄存器入栈、出栈指令,使用的C编译器必须支持内嵌汇编,或者该C语言可扩展和可链接汇编模块,使得关中断和开中断能在C语言程序中实现;
3、可固化(ROMable):
µC/OS-II是为嵌入式应用而设计的,意味着只要具备合适的系列软件工具(C编译、汇编、链接以及下载/固化)就可以将µC/OS-II嵌入到产品中作为产品的一部分;
4、可裁减(scalable):
可以只使用µC/OS-II中应用程序需要的系统服务。
可裁减性是靠条件编译实现的,只需要在用户的应用程序中定义那些µC/OS-II中的功能应用程序需要的部分就可以了;
5、可抢占性(preemptive):
µC/OS-II是完全可抢占型的实时内核,即µC/OS-II总是运行就绪条件下优先级最高的任务;
6、多任务:
µC/OS-II可以管理64个任务。
赋予每个任务的优先级必须是不相同的,这就是说µC/OS-II不支持时间片轮转调度法(该调度法适用于调度优先级平等的任务);
7、可确定性:
绝大多数µC/OS-II的函数调用和服务的执行时间具有可确定性。
也就是说用户能知道µC/OS-II的函数调用与服务执行了多长时间。
进而可以说,除了函数OSTimeTick()和某些事件标志服务,µC/OS-II系统服务的执行时间不依赖于用户应用程序任务数目的多少;
8、任务栈:
每个任务都有自己单独的栈。
µC/OS-II允许每个任务有不同的栈空间,以便降低应用程序对RAM的需求;
9、系统服务:
µC/OS-II提供许多系统服务,比如信号量、互斥信号量、事件标志、消息邮箱、消息队列、时间管理等等;
10、中断管理:
中断可以使正在执行的任务暂时挂起。
如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可以达255层;
11、稳定性和可靠性:
µC/OS-II的每一种功能、每一个函数以及每一行代码都经过了考验和测试,具有足够的安全性与稳定性,能用于与人性命攸关、安全性条件极为苛刻的系统中。
2.3µC/OS-II主要源代码文件介绍
µC/OS-II的源代码具体包括以下的文件:
PC.C:
源文件PC.H包含了对函数和环境的一些定义。
OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CµCOS-II.CµCOS-II.H:
这些文件是µC/OS-II中所有与处理器类型无关部分的源代码。
OS_CPU_A.SOS_CPU_C.COS_CPU.H:
这些文件是与处理器类型相关部分的源代码,在本实验系统中是面向80x86处理器的。
INCLUDES.H
给整个内核库提供了总体的include文件。
OS_CFG..H:
µC/OS-II的配置文件,定义使用µC/OS-II中的哪些功能。
3.代码
3.1Pc.c
#define_CRT_SECURE_NO_WARNINGS
#include"includes.h"
BOOLEANlock=FALSE;
HANDLEhStdOut=NULL;
externvoid(*interruptTable[])();
BOOLEANPC_GetKey(INT16S*c)
{
if(PC_CHECK_RECURSIVE_CALLS&&lock)//检查并避免递归调用{MessageBox(NULL,"RecursivecallinPC_GetKey","ucos-II",MB_OK);
exit(-1);
}elseif(lock)
{returnFALSE;
}else
{lock=TRUE;
}
if(_kbhit())//检查是否按下按键
{*c=_getch();//如果按下
lock=FALSE;
return(TRUE);
}else
{*c=0x00;//没有按下
lock=FALSE;
return(FALSE);
}
}
voidPC_DispStr(INT8Ux,INT8Uy,INT8U*s,INT8Ucolor)
{COORDpos;
#ifdefDEBUG_PC
printf("PC_DispStr:
%s\n",s);
return;
#endif
if(PC_CHECK_RECURSIVE_CALLS&&lock)//检查并避免递归调用{MessageBox(NULL,"RecursivecallinPC_DispStr","ucos-II",MB_OK);
exit(-1);
}elseif(lock)
{return;
}else
{lock=TRUE;
}
if(hStdOut==NULL)//获取标准输出的句柄
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
if((x>79)||(y>24))//检查有效的光标位置
MessageBox(NULL,"InvalidscreenpositioninPC_DispStr()","ucos-II",MB_OK);
pos.X=x;//设置光标位置
pos.Y=y;
SetConsoleCursorPosition(hStdOut,pos);
SetConsoleTextAttribute(hStdOut,color);//设置文本颜色
puts(s);//显示文本字符串
lock=FALSE;
}
voidPC_DispChar(INT8Ux,INT8Uy,INT8Uc,INT8Ucolor)
{COORDpos;
#ifdefDEBUG_PC
printf("PC_DispChar:
%c\n",c);
return;
#endif
if(PC_CHECK_RECURSIVE_CALLS&&lock)//检查并避免递归调用{MessageBox(NULL,"RecursivecallinPC_DispChar","ucos-II",MB_OK);
exit(-1);
}elseif(lock)
{return;
}else
{lock=TRUE;
}
if(hStdOut==NULL)//获取标准输出的句柄
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
if((x>79)||(y>24))//检查有效的光标位置
MessageBox(NULL,"InvalidscreenpositioninPC_DispChar()","ucos-II",MB_OK);
pos.X=x;//设置光标位置
pos.Y=y;
SetConsoleCursorPosition(hStdOut,pos);
SetConsoleTextAttribute(hStdOut,color);//设置文本颜色
putchar(c);//显示字符
lock=FALSE;
}
voidPC_DispClrScr(INT8Ucolor)
{COORDpos;
#ifdefDEBUG_PC
printf("PC_DispClrScr\n");
return;
#endif
if(PC_CHECK_RECURSIVE_CALLS&&lock)//检查并避免递归调用{MessageBox(NULL,"RecursivecallinPC_DispClrScr","ucos-II",MB_OK);
exit(-1);
}elseif(lock)
{return;
}else
{lock=TRUE;
}
if(hStdOut==NULL)//获取标准输出的句柄
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
pos.X=0;
pos.Y=0;
SetConsoleCursorPosition(hStdOut,pos);//将光标位置设置为窗口顶部
SetConsoleTextAttribute(hStdOut,color);//设置文本颜色
system("cls");//清屏
lock=FALSE;
}
#defineNTIMERS16
staticINT16UPC_ElapsedOverhead=0;
staticLARGE_INTEGERPC_startTime[NTIMERS],PC_stopTime[NTIMERS],PC_frequency;
voidPC_ElapsedInit(void)
{staticBOOLEANinitDone=FALSE;
if(initDone)
return;
QueryPerformanceFrequency(&PC_frequency);//获得CPU频率
PC_ElapsedOverhead=0;//在PC_Elapsed开始时测量头部文件PC_ElapsedStart(0);//和PC_Elapsed结束时
PC_ElapsedOverhead=(INT16U)PC_ElapsedStop(0);
initDone=TRUE;
}
voidPC_ElapsedStart(INT8Un)
{if(n>=NTIMERS)
return;
QueryPerformanceCounter(&PC_startTime[n]);//读取CPU内存取的信息
}
INT32UPC_ElapsedStop(INT8Un)
{LARGE_INTEGERPC_diffTime;
if(n>=NTIMERS)
return0;
QueryPerformanceCounter(&PC_stopTime[n]);//读取CPU内存取的信息
PC_diffTime.QuadPart=PC_stopTime[n].QuadPart-PC_startTime[n].QuadPart;
//计算差值并将其转换为微秒。
return(INT32U)(PC_diffTime.QuadPart*(__int64)1000000/PC_frequency.QuadPart-PC_ElapsedOverhead);
}
voidPC_GetDateTime(char*s)
{SYSTEMTIMEnow;
GetLocalTime(&now);//获取本地日期和时间
sprintf(s,"%04d-%02d-%02d%02d:
%02d:
%02d",//转换成字符串
now.wYear,
now.wMonth,
now.wDay,
now.wHour,
now.wMinute,
now.wSecond);
}
voidPC_IntVectSet(INT8Uirq,void(*isr)(void))
{if((irq>0)&&(irq<8))
interruptTable[irq]=isr;
}
void*PC_IntVectGet(INT8Uirq)
{if(irq<8)
returninterruptTable[irq];
else
returnNULL;
}
3.2TEST.C主程序
intmain(void)
{
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
//清屏
OSInit();/*初始化uC/OS-II*/
RandomSem=OSSemCreate
(1);
/*随机数字信号*/
OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);
OSStart();/*开始多任务处理*/
return0;
}
voidTaskStart(void*pdata)
{
INT16Skey;
pdata=pdata;/*防止编译警告*/
TaskStartDispInit();/*初始化显示*/
TaskStartCreateTasks();/*创建所有应用程序任务*/
OSStatInit();/*初始化uC/OS-II的统计*/
for(;;){
TaskStartDisp();/*更新显示*/
if(PC_GetKey(&key)==TRUE){/*查看按键是否已按下*/
if(key==0x1B){/*如果是,检查这是不是退出地址*/
exit(0);/*结束程序*/
}
}
OSCtxSwCtr=0;/*清除上下文切换计数器*/
OSTimeDlyHMSM(0,0,1,0);/*等待一秒钟*/
}
}
staticvoidTaskStartDispInit(void)
{
PC_DispStr(0,0,"uC/OS-II,TheReal-TimeKernel",DISP_FGND_WHITE+DISP_BGND_RED);
#ifdef__WIN32__
PC_DispStr(0,1,"OriginalversionbyJeanJ.Labrosse,80x86-WIN32portbyWernerZimmermann",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);
#endif
#ifdef__LINUX__
PC_DispStr(0,1,"OriginalversionbyJeanJ.Labrosse,80x86-LINUXportbyWernerZimmermann",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);
#endif
PC_DispStr(0,2,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,3,"EXAMPLE#1",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,4,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,5,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,6,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,7,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,8,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,9,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,10,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,11,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,12,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,13,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,14,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,15,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,16,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,17,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,18,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,19,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,20,"",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,21,"#Tasks:
CPUUsage:
%",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,22,"#Taskswitch/sec:
",DISP_FGND_BLACK+DISP_BGND_WHITE);
PC_DispStr(0,23,"<-PRESS'ESC'TOQUIT->",DISP_FGND_BLACK+DISP_BGND_WHITE);
/*
staticvoidTaskStartDisp(void)
{
chars[80];
sprintf(s,"%5d",OSTaskCtr);/*显示#任务的运行*/
PC_DispStr(18,21,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
#ifOS_TASK_STAT_EN>0
sprintf(s,"%3d",OSCPUUsage/*OSIdleCtr/(OSIdleCtrMax/100)*/);
/*显示CPU使用频率*/
PC_DispStr(36,21,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
#endif
PC_GetDateTime(s);
PC_DispStr(58,21,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
sprintf(s,"%5d",OSCtxSwCtr);
/*显示每秒上下文切换*/
PC_DispStr(18,22,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
#ifdef__WIN32__
sprintf(s,"uCOS-IIV%1d.%02dWIN32V%1d.%02d",OSVersion()/100,OSVersion()%100,OSPortVersion()/100,OSPortVersion()%100);
/*显示uC/OS-II的版本号*/
#endif
#ifdef__LINUX__
sprintf(s,"uCOS-IIV%1d.%02dLINUXV%1d.%02d",OSVersion()/100,OSVersion()%100,OSPortVersion()/100,OSPortVersion()%100);
/*显示uC/OS-II的版本号*/
#endif
PC_DispStr(52,22,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
}
staticvoidTaskStartCreateTasks(void)
{
INT8Ui;
for(i=0;i TaskData[i]='0'+i;/*每个任务均显示自己的字母代号*/ OSTaskCreate(Task,(void*)&TaskData[i],&TaskStk[i][TASK_STK_SIZE-1],(INT8U)(i+1)); } } voidTask(void*pdata) { INT8Ux; INT8Uy; INT8Uerr; #ifdef__WIN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)