计算器.docx
- 文档编号:4550978
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:13
- 大小:37.88KB
计算器.docx
《计算器.docx》由会员分享,可在线阅读,更多相关《计算器.docx(13页珍藏版)》请在冰豆网上搜索。
计算器
课程设计(论文)任务书
信息工程 学 院 计算机科学与技术专 业
(2) 班
一、课程设计(论文)题目
二、课程设计(论文)工作自2010年12月20日起至2010年12月26日止。
三、课程设计(论文)地点:
5-402嵌入式系统实验室
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)使学生基本掌握一个嵌入式应用项目开发的过程;
(2)了解嵌入式软件开发与pc平台软件开发的不同;
(3)学会使用远程仿真调试技术(JTAG调试)进行程序逻辑排错;
(3)培养学生分析、解决问题的能力;
(4)提高学生的科技论文写作能力。
2.课程设计的任务及要求
1)基本要求:
(1)提出系统的设计方案;
(2)画出程序的处理流程;
(3)要有对界面的说明(输入输出的界面描述);
(4)要有软件故障调试与排错的说明;
(5)要有系统的操作说明书。
2)创新要求:
给出进一步改进方案和应用的建议,如优化算法,有较好的人机交互界面等。
3)课程设计论文编写要求
(1)要按照书稿的规格打印誊写课程设计论文;
(2)论文包括目录、绪论、正文、小结、参考文献、谢辞、附录等;
(3)课程设计论文装订按学校的统一要求完成。
4)答辩与评分标准:
(1)完成原理分析:
20分;
(2)完成设计过程:
40分;
(3)完成调试:
20分;
(4)回答问题(答辩):
20分。
5)参考文献:
[1]罗蕾.嵌入式实时操作系统及应用开发[M].北京航空航天大学出版社
[2]JeanJ.Labrosse.嵌入式实时操作系统uC/OS-II[M].北京航空航天大学出版
[3]社王田苗.嵌入式设计与开发实例[M].北京航空航天大学出版社北京博创科技公司.
[4]嵌入式系统实验指导书
[5]宋凯.嵌入式试验设计.华东交通大学
6)课程设计进度安排
内容天数 地点
构思及收集资料3 图书馆
上级调试4 实验室
撰写论文2 图书馆、实验室
学生签名:
2010年12月20日
课程设计(论文)评审意见
(1)完成原理分析(20分):
优( )、良( )、中( )、一般( )、差( );
(2)设计分析 (40分):
优( )、良( )、中( )、一般( )、差( );
(3)完成调试 (20分):
优( )、良( )、中( )、一般( )、差( );
(4)回答问题(答辩)(20分):
优( )、良( )、中( )、一般( )、差( );
(5)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
周洁 职称:
讲师
2010年12月27日
1、
功能描述
(1)设计并实现μc/os-Ⅱ的shell模型。
(2)实现简单的Shell命令
hostname命令在屏幕上打印一句话,即自定义的本机名称。
hello命令可以带多个参数,如helloabcd,回车后会显示:
hello,IamGenie
yourargvis:
a
b
c
d
(3)实现在串口和LCD的同步显示,即所有的命令操作过程都要显示在串口和LCD上。
(4)设计几条新的命令,比如输入time即可显示时间,输入data即可显示日期或者可以通过命令设置时间和日期等。
2、基本原理
uCOS-II只提供了操作系统内核,用户要自己添加文件处理、人机界面、网络接口等重要部分。
其中Shell(人机界面)提供了人与机器交互的界面,是机器服务于人的体现,是系统必不可少的重要组成部分。
现代的很多OS如UNIX、DOS、VxWorks都提供了友好的命令行界面。
Windows更是提供了GUI。
大部分人认识OS都是从这里开始的。
由于Skyeye下的仿真串口USART已经实现了中断方式的接收(实际是从键盘接收输入),而且串口输出(实际上是输出到终端屏幕)也已经实现,所以实现一个类似DOS或Bash的简化版Shell并不困难。
其本质思想就是:
Shell作为一个μC/OS-II下的任务,接收用户输入的字符,存储到缓冲区,并回显在屏幕上,以回车键为用户输入的结束信号,随后解析用户输入的命令名称、参数,调用相应的命令函数。
一直到这个命令函数运行返回,才继续Shell的人机交互界面。
Shell作为一个任务工作于内核之外,占用一个任务号。
其流程图如下:
我们目前在μC/OS-II下实现的Shell起名为GenieShell,非常简单,只实现了最基本的命令输入、解析参数、调用命令函数功能,以及两条示例性的命令。
这个Shell的特色是采用了一些面向对象的思路来实现Shell的各种命令。
3、系统总体设计
2.1GenieShell的实现基础(串口通讯函数)
Genieshell与硬件相关的部份有三个函数:
CommRxIntEn(UART0);初始化串口硬件
CommGetChar(UART0,0,&err);从串口接收一个字符,这个串口最好是中断方式的,否则用轮询方式Genieshell就会占用全部cpu。
参数0表示永远等待,没有timeout的情况。
printf函数向串口打印字符,注意虽然在Skyeye中是打印在屏幕上的,但实际上是向串口发送字符,只是Skyeye的串口仿真输出就是到终端屏幕。
以上三个函数由用户根据自己的嵌入式微处理上的串口去实现。
在Skyeye中我们已经实现了,参见ucosii\samples目录下的例子。
2.2shelltask部份:
(shelltask.[ch])
A.voidshelltask(void)这是应该由用户在μcos-II中用OSTaskCreate建立的任务(task)。
首先做以下初始化工作:
CommRxIntEn(UART0);//初始化串口
InitCommands();//初始化命令对象数组
CommandBuf[0]='\0';
然后进入无限循环(for(;;))中,用CommGetChar函数接收输入字符。
对不同的输入字符分别做不同的处理:
退格键
光标回退,删除显示的字符,光标再回退
回车键:
命令输入结束,调用CommandAnalys函数分析命令格式和参数,CommandAnalys会返回命令号,然后根据命令号从ShellComms对象数组中找到相应的命令对象,然后执行这个命令对象的方法(也就是命令函数),命令参数也会传递过去。
普通合法字符:
先显示(printf),再放入CommandBuf中等待分析
非法字符:
不接收输入。
此外还做了一些简化,如不接收连续两个空格,不接收行首的空格。
嵌入式系统处理相对简单一些。
B.INT8UCommandAnalys(char*Buf);
对用户输入的字符串做分析,根据字符串的内容,分析出命令名称,命令参数。
分析过程本文不详细描述了。
2.3Command命令部份(command.[ch])
GenieShell把每个命令看成一个对象,对象的属性是命令名,而对象的方法就是命令的执行函数本身。
用户输入命令及参数后,将参数传递给对象的方法并执行。
在shell中增加一条命令,就是增加一个对象,并实现这个对象的方法。
在c语言中实际是一个带函数指针的结构体:
typedefstruct{
intnum;//命令序号
char*name;//命令名称(目前的设定是小于20个字符)
INT8U(*CommandFunc)(INT8Uargc,char**argv);//命令函数
}command;
每条命令对应一个command对象,所有的命令对象都存放在command数组ShellComms[MAX_COMMAND_NUM]中。
MAX_COMMAND_NUM是总的命令个数,用户应该根据自己shell的命令个数设置,注意MAX_COMMAND_NUM应该正好等于总的命令个数,不能多也不能少。
用户增加自己的命令时,首先把在commands.h中把MAX_COMMAND_NUM加1;然后在commands.c中InitCommands()函数里增加如下语句:
ShellComms[i].num=0;
ShellComms[i].name="hello";
ShellComms[i].CommandFunc=HelloFunc;
其中的i和具体值由用户根据情况决定。
最后实现命令函数,并把函数名称赋给ShellComms[i].CommandFunc就可以了。
4、硬件设计
硬件系统:
ARM嵌入式开发板、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上
软件系统:
PC机操作系统WinXP、ARMSDT2.51集成开发环境、仿真器驱动程序、超级终端通讯程序
1.在ARMSDT2.51中,打开创建好的模板。
2.打开Main.c文件。
3.重点分析编写的Main函数中的代码。
4.编译并调试程序。
5.运行Windows系统下的超级终端应用程序,并设置。
6.打开开发板,接好电源、USB接口等,按住开发板上的任意键,使开发板进入BIOS设置状态,.按PC键盘的U建,使超级终端处于活动状态,这时我的电脑中多了个可移动磁盘,在把生成的system.bin文件复制到可移动磁盘里(嵌入式开发板中),复位系统,并检查输出结果
5、软件设计
Main.c里的程序:
#include"..\ucos-ii\includes.h"#include"..\ucos-ii\add\osaddition.h"#include"..\inc\drv.h"#include
#defineERRORCOMMAND255
#defineMaxLenComBuf100
OS_STKMain_Stack[STACKSIZE*8]={0,};
voidMain_Task(void*Id);
#defineMain_Task_Prio12
OS_EVENT*Nand_Rw_Sem;
OS_EVENT*Uart_Rw_Sem;
ExterncommandShellComms[MAX_COMMAND_NUM];
char*argv[10];
INT8Uargc;
INT8UCommandAnalys(char*Buf);
voidinitOSGUI(){
initOSMessage();
initOSList();initOSDC();
initOSCtrl();initOSFile();}
intMain(intargc,char**argv)
{ARMTargetInit();
OSInit();
uHALr_ResetMMU();
LCD_Init();
LoadFont();
LoadConfigSys();
OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);
OSAddTask_Init();
InitRtc();
Nand_Rw_Sem=OSSemCreate
(1);
OSStart();
return0;}
voidMain_Task(void*Id){
INT8Ui=0,num,err;
charch;charc1[1];INT8U(*Func)(INT8Uargc,char**argv);
charCommandBuf[MaxLenComBuf+1];
InitCommands();CommandBuf[0]='\0';
LCD_ChangeMode(DspTxtMode);
LCD_Cls();
Uart_Printf("\n\r***********************************************\n");
Uart_Printf("\n\r*Welcomtogenieshell*\n");
Uart_Printf("\n\r*Author:
QuanQiuyu2008-12-22*\n");
Uart_Printf("\n\r***********************************\n\n");LCD_printf("*****************************************\n");LCD_printf("Welcomtogenieshell*\n");
LCD_printf("Author:
QuanQiuyu2008-12-22*\n");
LCD_printf("*************************************\n\n");
Uart_Printf("\nBEGINUCOSSHELL,pressanytocontinue.....");
LCD_printf("BEGINUCOSSHELL,pressanytocontinue.....\n");
Uart_Getch(c1,0,0);
Uart_Printf("\n\rc:
\\sk>");
LCD_printf("\n");
LCD_printf("c:
\\sk>");
for(;;){do{
err=Uart_Getch(c1,0,0);
ch=c1[0];
}while(!
((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch=='.')||(ch=='')||(ch=='-')||(ch=='/')||(ch=='\r')||(ch=='\b')||(ch==',')));
switch(ch){
case'\r':
if(i==0){
Uart_Printf("\n\rc:
\\sk>");
LCD_printf("\n");
LCD_printf("c:
\\sk>");}
else{
if(CommandBuf[i-1]=='')
i--;
CommandBuf[i]='\0';
num=CommandAnalys(CommandBuf)
if(num==ERRORCOMMAND){
i=0;
CommandBuf[i]='\0';
Uart_Printf("\n\rBadcommandorfilename.");
Uart_Printf("\n\rc:
\\sk>");
LCD_printf("\n");
LCD_printf("Badcommandorfilename.");
LCD_printf("\n");
LCD_printf("c:
\\sk>");}
else{
Func=ShellComms[num].CommandFunc;
Func(argc,argv);
i=0;
CommandBuf[i]='\0';
Uart_Printf("\n\rc:
\\sk>");
LCD_printf("\n");
LCD_printf("c:
\\sk>");}
}break;
case'\b':
if(i==0){}
else{i--;
Uart_SendByte(0,'\b');
Uart_SendByte(0,'');
Uart_SendByte(0,'\b');
LCD_printf("%c",'\b');
LCD_printf("%c",'');
LCD_printf("%c",'\b');
}break;
case'':
if((CommandBuf[i-1]=='')||(i==0)||(i>MaxLenComBuf)){}
else{CommandBuf[i]=ch;
i++;
Uart_SendByte(0,ch);
LCD_printf("%c",ch);
}break;
default:
if(i>MaxLenComBuf){}
else{CommandBuf[i]=ch;
i++;
Uart_SendByte(0,ch);
LCD_printf("%c",ch);
}break;
}OSTimeDly(200);}}
INT8UCommandAnalys(char*Buf){INT8Ui;
INT8Upointer;
INT8Unum;
charname[20];
argc=0;
pointer=0;
num=0;
Uart_Printf("\n\r");
LCD_printf("\n");
while((Buf[pointer]!
='')&&(Buf[pointer]!
='\0')&&pointer<20){name[pointer]=Buf[pointer];
pointer++;}
name[pointer]='\0';
for(i=0;i if(! strcmp(name,ShellComms[i].name)){num=i; break;}} if(i==MAX_COMMAND_NUM)returnERRORCOMMAND; while(Buf[pointer]! ='\0'){ if(Buf[pointer]==''){ if(argc>0){Buf[pointer]='\0';} pointer++; argv[argc]=&Buf[pointer]; argc++;} else{pointer++;}} 在commands.c增加的程序内容: INT8UInitCommands() {ShellComms[2].num=2; ShellComms[2].name="ipconfig"; ShellComms[2].CommandFunc=IpFunc; ShellComms[3].num=3; ShellComms[3].name="time"; ShellComms[3].CommandFunc=TimeFunc; return0; } INT8UIpFunc(INT8Uargc,char**argv) { Uart_Printf("\n\rIPis192.168.0.1! "); LCD_printf("\n"); LCD_printf("IPis192.168.0.1! "); return0; } INT8UTimeFunc(INT8Uargc,char**argv) { structTimeclock; Get_Rtc(&clock); Uart_Printf("\n\r%d: %d: %d",clock.hour,clock.minute,clock.second) LCD_printf("\n"); LCD_printf("%d: %d: %d",clock.hour,clock.minute,clock.second); Return0; } 在commands.h增加更改的语句: #defineMAX_COMMAND_NUM4 INT8UIpFunc(INT8Uargc,char**argv); INT8UTimeFunc(INT8Uargc,char**argv); returnnum;} 1、系统测试 ARM-超级终端窗口显示和LCD显示结果: *********************************************** *Welcomtogenieshell* *Author: QuanQiuyu2008-12-22* *********************************************** BEGINUCOSSHELL,pressanytocontinue..... 输入-c: \\sk>hello 输出-hello,IamGenie yourargvis: a b c d 输入-c: \\sk>hostname 输出-Hostnameisgenies 输入-c: \\sk>ipconfig 输出-IPis192.168.0.1! 输入-c: \\sk>time 输出-10: 10: 50 2、小结 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,ARM嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。 因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。 回顾起此次ARM课程设计,我仍感慨颇多,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故 参考文献 [1]罗蕾.嵌入式实时操作系统及应用开发[M].北京航空航天大学出版社 [2]JeanJ.Labrosse.嵌入式实时操作系统uC/OS-II[M].北京航空航天大学出版社 [3]王田苗.嵌入式设计与开发实例[M].北京航空航天大学出版社 [4]北京博创科技公司.嵌入式系统实验指导书 [5]宋凯.嵌入式试验设计.华东交通大学
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器