计算器Word文件下载.docx

上传人:b****5 文档编号:17485933 上传时间:2022-12-06 格式:DOCX 页数:13 大小:37.88KB
下载 相关 举报
计算器Word文件下载.docx_第1页
第1页 / 共13页
计算器Word文件下载.docx_第2页
第2页 / 共13页
计算器Word文件下载.docx_第3页
第3页 / 共13页
计算器Word文件下载.docx_第4页
第4页 / 共13页
计算器Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

计算器Word文件下载.docx

《计算器Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算器Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

计算器Word文件下载.docx

[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)。

首先做以下初始化工作:

//初始化串口

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"

..\ucos-ii\add\osaddition.h"

..\inc\drv.h"

#include<

string.h>

#include"

commands.h"

#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];

LCD_ChangeMode(DspTxtMode);

LCD_Cls();

Uart_Printf("

\n\r***********************************************\n"

);

\n\r*Welcomtogenieshell*\n"

\n\r*Author:

QuanQiuyu2008-12-22*\n"

\n\r***********************************\n\n"

LCD_printf("

*****************************************\n"

LCD_printf("

Welcomtogenieshell*\n"

Author:

QuanQiuyu2008-12-22*\n"

*************************************\n\n"

\nBEGINUCOSSHELL,pressanytocontinue....."

BEGINUCOSSHELL,pressanytocontinue.....\n"

Uart_Getch(c1,0,0);

\n\rc:

\\sk>

"

\n"

c:

for(;

){do{

err=Uart_Getch(c1,0,0);

ch=c1[0];

}while(!

((ch>

='

0'

&

ch<

9'

)||(ch>

a'

z'

A'

Z'

)||(ch=='

.'

'

-'

/'

\r'

\b'

'

)));

switch(ch){

case'

:

if(i==0){

}

else{

if(CommandBuf[i-1]=='

i--;

CommandBuf[i]='

num=CommandAnalys(CommandBuf)

if(num==ERRORCOMMAND){

i=0;

\n\rBadcommandorfilename."

Badcommandorfilename."

Func=ShellComms[num].CommandFunc;

Func(argc,argv);

}break;

case'

if(i==0){}

else{i--;

Uart_SendByte(0,'

%c"

}break;

if((CommandBuf[i-1]=='

'

)||(i==0)||(i>

MaxLenComBuf)){}

else{CommandBuf[i]=ch;

i++;

Uart_SendByte(0,ch);

ch);

default:

if(i>

MaxLenComBuf){}

}OSTimeDly(200);

}}

INT8UCommandAnalys(char*Buf){INT8Ui;

INT8Upointer;

INT8Unum;

charname[20];

argc=0;

pointer=0;

num=0;

\n\r"

while((Buf[pointer]!

)&

(Buf[pointer]!

pointer<

20){name[pointer]=Buf[pointer];

pointer++;

name[pointer]='

for(i=0;

i<

MAX_COMMAND_NUM;

i++){

if(!

strcmp(name,ShellComms[i].name)){num=i;

break;

}}

if(i==MAX_COMMAND_NUM)returnERRORCOMMAND;

while(Buf[pointer]!

){

if(Buf[pointer]=='

if(argc>

0){Buf[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!

IPis192.168.0.1!

INT8UTimeFunc(INT8Uargc,char**argv)

structTimeclock;

Get_Rtc(&

clock);

\n\r%d:

%d:

%d"

clock.hour,clock.minute,clock.second)

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:

hello

输出-hello,IamGenie

hostname

输出-Hostnameisgenies

ipconfig

输出-IPis192.168.0.1!

time

输出-10:

10:

50

2、小结

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,ARM嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。

回顾起此次ARM课程设计,我仍感慨颇多,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故

参考文献

[1]罗蕾.嵌入式实时操作系统及应用开发[M].北京航空航天大学出版社

[2]JeanJ.Labrosse.嵌入式实时操作系统uC/OS-II[M].北京航空航天大学出版社

[3]王田苗.嵌入式设计与开发实例[M].北京航空航天大学出版社

[4]北京博创科技公司.嵌入式系统实验指导书

[5]宋凯.嵌入式试验设计.华东交通大学

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1