单片机 英文翻译.docx
《单片机 英文翻译.docx》由会员分享,可在线阅读,更多相关《单片机 英文翻译.docx(49页珍藏版)》请在冰豆网上搜索。
单片机英文翻译
南京邮电大学
毕业设计(论文)外文资料翻译
学院
自动化学院
专 业
自动化
学生姓名
周戎
班级学号
B11050320
外文出处
PontMJ,MwelwaC.Developingreliableembeddedsystemsusing8051andARMprocessors:
Towardsanewpatternlanguage[J].VikingPLoP,2003,3:
1-18.
附件:
1.外文资料翻译译文;2.外文原文
指导教师评价:
1.翻译内容与课题的结合度:
□优□良□中□差
2.翻译内容的准确、流畅:
□优□良□中□差
3.专业词汇翻译的准确性:
□优□良□中□差
4.翻译字符数是否符合规定要求:
□符合□不符合
指导教师签名:
年 月 日
附件1:
外文资料翻译译文
基于ARM和51单片机系统的可靠的嵌入式处理器的开发:
一个新的模式语言
MichaelJ.PontandChisangaMwelwaLeicester大学,机械系,嵌入式系统实验室
介绍:
我们曾经将一个包括了80种模式的语言叫做PRE集合。
这种语言被设计出来促进那些使用很少内存的微型控制器的发展,包括比如那些平均拥有数百字节内存的8051系列。
这些模式的第一批的应用大概在三年前,并且它们被应用于工厂的系统,大量的大学研究项目和大学课程中的本科和研究生教育。
我们也开始准备去开发一个工具去帮助使用这些模式的嵌入式系统的发展(Mwelwa和Pont,2003)。
当我们对这些集成的经验不断增加,我们开始加入一些新的模式和修改一些现存的一些模式(例如seePont和Ong,2003;Pont,2003;Key,2003)。
必然的是,从定义上来说,一个语言应该包括一系列有着内部关联的模式:
因此,不太可能出现缩小或延长这样的一个系统而不出现副作用的情况的。
但是,因为我们使用过这个集成,我们感觉到我们可以搭建一个整体的架构来降低未来的影响。
这篇文章简略的介绍了一些我们对于重构原始模式集成所作的改变。
接着说明了由这个处理器产生的新模式之一。
两个处理器系列
在我们看到这个集成的第一印象中,最重要的局限之一就是我们使用一个单一的硬件平台(8051)来阐述这些模式的使用。
这个导致暴露了一个事实是:
在绝大多数情况下,这些系统适用于一个广泛的不同的处理器与系统的范围。
在这些修改过的模式里,我们举了包括8051微处理器系列和ARM系列器件的例子(图1)。
这些器件都是这些嵌入式设计的一般选择,但是8051(8位处理器)更趋向于适用于“低端”的情况,而ARM系列(16/32位处理器)更趋向于被应用于需要更大存储空间或者更好的CPU性能的情况。
这两个系列的覆盖应用帮助我们集中于这些被修改后的模式的“核心”特征,并且我们提出了这些“例子”部分被贯彻的特殊细节。
图1:
被用于修改模式集成的两个嵌入式处理器的外观
PhilipsLPC932(左)是流行的8051系列设备中的一个8位设备。
PhilipsLPC2106(右)是基于16/32位ARM7TDMI处理器核心的设备。
个人电脑上的原型
除了之前部分里说到的8051和ARM处理器,修订后的设备也包括对在台式电脑上使用的一个创新的原型的讨论。
我们可以看到这些例子将会对那些想要使用个人电脑平台来作为一个复杂的嵌入式系统原型,而不是采用一个微处理器的开发者来说极其重要。
它们也将对那些想要找到一个高效的培训嵌入式系统的软件编程方式的公司,大学来说,也很重要。
最后
它们将被那些想要从使用低成本硬件的嵌入式系统获取经验的业余开发者使用。
一些陈旧的,一些崭新的……
我们在本文中提到了两个模块,第一个是PORTWRAPPER(一个新的模块);第二个是第一次在2001年出现在我们原始模块中的PORTHEADER。
请注意到PORTHEADER(基于PORTWRAPPER的模块)仅仅被用于参考,这是为了阐明我们在修改集成时做了什么样的改变(模块结构和内容上的)。
使用的工具
为了开发我们此文中提到的微处理器核心,我们使用了KeilC51和Keil/GNUARM工具。
这些编译工具的评估版本从中获得
为了开发个人电脑核心,我们使用了“OpenWatcom”编译器。
这个编译器(免费下载)可以在http:
//www.openwatcom.org/获得
鸣谢
我们非常感谢为我们这篇文章的草案提供了很多细节上建议的VikingPLoP的Shepherd。
我们也非常感谢为参与了我们在VikingPLoP工作室并提供了很多有用建议的NeilHarrison,KlausMarquardt,BemhardGrone和PeterTabeling。
除此之外,会议结束后,NeilHarrison还非常慷慨的审核了我们的修改稿。
我们还将感谢为本文中提到的工作做出卓越贡献的ChrisHills(Keil,UK)和TrevorMartin(Hiter,UK)。
最后也是最重要的是,我们将感谢为这个大工程提供了长久的信任的SimonPlumtree(Addison-Wesley,UK)。
版权
版权©2003MichaelJ.Pont和ChisangaMwelwa。
允许针对VikingPLoP2003的复印。
其他权利将予以保留。
PORTWRAPPER
内容
你将开发一个使用8051,ARM或者相似处理器的嵌入式系统。
稳定性将是一个重要的设计考虑。
你的系统将会被很多人开发,移植,维护。
这意味这个系统建设将牵涉一个开发团队。
或者,这个可能意味着你的系统是被“一个人的团队”开发的,并且将被其他人经常维护和移植。
你要保持开发成本(现在的和将来的工程)尽可能的便宜。
因此,你需要将移植你现在的代码的一部分去一个新的工程或者移植一部分甚至所有你的系统去一个硬件平台这个行为很容易。
你要将内存以及处理器的要求降到最低,为了能够被允许使用更便宜的硬件平台,并因此将整个系统的成本降到最低。
你将用C语言编程。
问题
你怎么完成在这个工程中引脚的分配和初始化?
设计约束
在一个典型的嵌入式工程里,你将使用一个LCD,一个键盘,和一个乃至多个LED灯作为用户借口。
也需要有一系列的线(比如,RS-485和CAN)连接到另一个微处理器板。
这里可能需要一个或者更多的被你控制的元件。
典型的是,这个工程将用C语言搭建,LCD接口,键盘以及其他的元件都使用独立的文件。
每一个文件都要求与微处理器的一些引脚相联系,然后代码就像图2所示
File:
”LCD.C”File:
”KEYpad.C”File:
“LED.C”
SbitPin_A=P3^2;#definePort_B=P0;sbitPin_C=P2^7
………
图2:
一个在简单的嵌入式工程中控制引脚的非正式方法。
这些工程中的文件直接链接着处理器中不同的引脚。
因为文中讨论的原因这个途径不被推荐。
当使用这种编程代码,你将遇到下面的设计约束:
你需要确定没有“引脚冲突”,比如你不希望出现人们在写LCD代码的时候使用人们写开关或者三相电动机时的引脚口是相同的。
这可能是很危险的,如果你的系统涉及了高电的载入并且检查不充分的话。
这个可能会导致代码的重新设计,和昂贵的PCB改变,如果没有在工程流程中较早的检测出来的话。
你得确定所有的引脚都初始化的正确,如果没有这样做,这个系统可能不会像要求的那样工作。
假设你正确的在你的微处理器上配置了“X引脚”来“输入”,为了在紧急情况下切断开关。
如果,在工程中反应迟了,一个新的部件被不经意间设置X引脚为“输出”,系统的使用者将没有方法来停止紧急情况下的系统。
解决方法
创建一个合适的PortWrapper可以帮助你成功在一个大工程中分配端口,并且从而满足前面部分标亮的设计缺陷。
一个PortWarpper是由以下部分组成:
一个端口头文件,最少包括你的工程中包括的所有端口。
一个端口初始化器,这是一个配置你系统包括输入输出等所有引脚的机制。
很多需要做的措施是很必要的:
下面就是我们要讨论的一般方法。
实施
基础实施
在解决方法中提到的两个两个部件是容易被实施的,经常被使用的一对文件是“H端口”和“C端口”。
H端口
H端口可以简单的包含你工程中的所有的端口许可,并且连着它们和相对应的文件,比如,这有可能看上去像这样:
/*port.h/
/*File:
lcd.c
Thisusespins0.0to0.4,asfollows…*/
/*File:
keypad.c
Thisusespins…*/
必然的是,这样的文件可以“合拍”并且对于所有的多发的原因—代码是“个人文件”是被广泛需求的。
可以使用#define和相类似的机制来确定头文件
一些完整的H端口文件被在下面给出
C端口
C端口经常包含一个功能就是要按照要求的配置来配置端口引脚,比如,考虑下面的例子:
/*port.c*/
VoidPORT_Init(void)
{
/*PrepareforIcd(seelcd.c)*/
…
/*Prepareforkeypad(seekeypad.c)*/
…
}
一些完整的C端口在下表被列出来。
有多少wrapper?
如果你的开发是被一个团队做出来的,那么你将遇到困难,如果很多的团队想要做出改变来分享C端口文件和H文件。
最简单的解决方法是工作,最初的是,每一个部分都有不同的一对文件。
比如,LCD端口有它自己的C端口和H端口文件,当这个工程阶段一体化的时候,所有的端口文件都要合在一起。
这是一个简单的解决方法,并且避免了一体化后工程中不同部分中的WRAPPER文件的参考量的改变。
一个替代的方法是为每一个部分创建一个不同的WRAPPER文件(比如,LCD.H端口)。
当工程一体化时它们可以作为不同的的文件存在。
这个方法有一个好处是这些WRAPPER文件不需要随着系统一体化而改变(也就是说,这个最终工程的每一部分都有相对应的不同的一对WRAPPER文件)。
这样可以使得移植和维护更加的直接。
注意到在这两个案例中,我们要求一个规范来确保开发者使用的每一个引脚被其他开发者所知道。
可依靠性和安全含义:
我们确定一些重要的在这个部分里联系了端口的可靠性和安全性。
引脚复位值
不管你在使用哪一个处理器,你需要对引脚复位值多加以关注。
试想,比如,你连接了一个电动装置在端口处,并且这个装置是被“逻辑1”输出使能的。
如果,出现了错误,你的微处理器将引脚的复位值设置为“1”。
那么电动装置将会启动。
即时在一开始你将你的程序的引脚输出设为0,这个装置仍将产生一个短暂的的脉冲。
在一些系统里这个可以导致系统使用者或者旁人的受伤甚至死亡。
确定你的硬件和软件设计与复位值相适应是很重要的。
最好试着或者确定你的微处理器引脚的复位值为“0”和你的外部设备被引脚值“1”使能驱动。
引脚冲突
除了它的简便,PORTWRAPPER可以提升系统的可依靠性,因为它避免了端口引脚的潜在冲突,特别是当开发者维护(他可能没有参加原始代码的编写)时可能造成的代码的改变。
硬件要求
使用PORTWRAPPER有着最低的硬件要求。
成本含义
任意以文档为基础的技术都有一个最初的成本,因为任何形式的标志或注明都需要时间来完成。
但是任何初始成本都会因为维护或移植的工作变得简单而得到偿还。
维护
PORTWRAPPER是一个基于代码约定的大型的手动资料技术。
它需要整支团队对软件开发的在规定途径下的正确操作。
有的时候,特别是最终期限催的比较紧的时候,文档会超前于系统。
如果你需要使用PORTWRAPPER来维护系统,在做任何改变之前检查信息记录是否正确是一个好主意。
可移植性
使用PORTWRAPPER可以帮助提升可移植性,从一个地方移植到所有允许移植的端口。
请注意到,正如在“维护”中讨论中的一样。
在开始移植之前,检查WRAPPER文件与系统硬件是否匹配是一个很好的注意。
请注意到,如果你想移植应用程序的一部分(说的是RS-485端口),使用多重WRAPPER方法将会使其更容易。
相关的模式和替代解决方案
硬件问题
这种模式不涉及硬件设计,seePont,2001,A部分和C部分解决了这些问题。
代码库
在桌面的设计,“显而易见”的解决方案,是通过端口包装解决创建一个类或函数库,完全封装的端口引脚控制和初始化的问题。
这样的库可以用来解决许多问题与端口的初始化或端口冲突。
不幸的是,因为系统收到资源严重约束,库的使用经常需要避免,因为会产生超额费用。
如果,你选择开发和使用这个数据库,您可能会限制你的代码架构的可移植性。
整体的优势和劣势
PORTWRAPPER可以在两个乃至更多的系统模块中帮助降低引脚冲突的可能性(使用相同的引脚,为了不同的目的)。
PORTWRAPPER可以帮助你的引脚正确初始化。
PORTWRAPPER只需要少量的CPU和内存需求。
PORTWRAPPER是一个基于代码约定的大型的手动技术,它依赖于一个有规则的软件开发方法来进行正确的操作。
PORTWRAPPER里面说到得技术在大型嵌入式工程中并不十分实用。
这样的工程在这个模块中提到的资源限制的处理器中很少见,但是,如果你需要要开发这样的一个工程,你会发现这个更适合使用数据库。
例子:
在LPC900系列上闪烁LED灯
我们通过举一个简单的例子来说明如何在LPC900系列上如何创建一个PORTWRAPPER文件。
#IfndefPORT_H
#definePORT_H1
//Prototypeforinitfunction
VoidPort_Init(void);
//-------LED_Flas.C--------------------------------------------------------------------------
//ConnectLEDfrom+5Vtothispin,viaappropriateresistor
SbitLED_pin=P2^0;
#endif
表一:
一个在LPC900上的PORTwrapper例子(h端口)
VoidPORT_Init(void)
{
//AssumingPort2,Pin0usedforLED
//Setthispintopush-pulloutput
//[RelevantSFRsarenotbitaddressable]
P2M1=0xFE;
P2M2=0x01;
}
表二:
一个在LPC900上的PORTwrapper例子(C端口)
Intmain(void)
{
//Initialisetheportpinsarerequired
Port_Init();
//PreparetoflashLED
LED_FLASH_Init();
While
(1)
{
//ChangetheLEDstate(OFFtoON,orviceversa)
LED_FLASH_Change_State();
//Delayfor*approx*1000ms
LOOP_DELAY_Wait(1000);
}
Return1;//Shouldneverreachhere…
}
}
表三:
一个在LPC900上的PORTwrapper例子(C主函数)
例子:
用LPC2100系列来控制LED灯
我们通过举一个简单的例子来说明如何在LPC2100系列上如何创建一个PORTWRAPPER文件。
#ifndefPORT_H
#definePORT_H1
//Prototypeforinitfunction
VoidPORT_Init(void)
//---------LED_Flas.C--------------------------------------
//ConnectLEDfromgroundtothispin,viaappropriateresistor
//LEDpinisGPIOpin0.0
#defineLED_pin0x00000001
#endif
表四:
一个在LPC2100上的PORTwrapper例子(h端口)
#include”main.h”
#include”port.h”
/*……………………………………………………………………*/
VoidPORT_Init(void)
{
//1.SetupLEDpinasGPIO
//2.Settooutputmode
//1.
//Justpin0.0asGPIO
PINSELO&=0Xfffffffe
//2.
IODIR=LED_pin;
}
表五:
一个在LPC2100上的PORTwrapper例子(c端口)
#include”main.h”
#include”port.h”
#include”led_flas.h”
#include”loop_del.h”
/*………………………………………………………………………………………………………….*/
Intmain(void)
{
//Initialisetheportpinsasrequired
PORT_Init();
//PreparetoflashLED
LED_FLASH_Init();
While
(1)
{
//ChangetheLEDstate(OFFtoON,orviceversa)
LED_FLASH_Change_State();
//Delayfor*approx*1000ms
LOOP_DELAY_Wait(1000);
}
Return1;//Shouldneverreachhere…
}
表六:
一个在LPC2100上的PORTwrapper例子(c主程序)
例子:
在电脑平行端口上闪烁LED
我们通过举一个简单的例子来说明如何在PC上如何创建一个PORTWRAPPER文件。
图三:
连接LED到平行端口
//SettingforLPT1
//Seepaperfordetails
#defineLPT1_DATA0x0378
#defineLPT1_STATUS0x0379
#defineLPT1_CONTROL0x037A
//--------------------Publicfunctionprototypes-------------------------
VoidPORT_Init(void);
VoidPORT_Write_Bit(consttwordPORT,consttWordPIN,consttwordVALUE);
例子七:
一个在PC上的PORTwrapper例子(h端口)
#include“Main.h”
#include”Port.h”
#include
#include
/*…………………………………………………………………………………………..*/
VoidPORT_Init(void)
{
/*
InthePC,theportsdefaultto“output”mode.
Noinitializationisthereforerequiredinthissimpleexample.
WesimplyrecordthatPin0onthedataport(Pin2ontheparallelport)isusedtocontroltheLED.
*/
}
/*------------------------------------------------------------------------------------------------------------------*/
VoidPORT_Write_Bit(consttwordPORT,consttWordPIN,consttWordVALUE)
{
tWordp=0x01;
twordold,New;
p<<=PIN;
//Readcurrentportvalue
Old=inp(PORT);
//Ifwerequirea1atthepin
If(VALUE==1)
{
New=Old;
}
Else
{
P=~p;//Complement
New&=p;
}
//Writethenewvalue
Outp(PORT,NEW);
}
例子八:
一个在PC上的PORTwrapper例子(c端口)。
#include“main.h”
#include”port.h”
#include”led_flas.h”
#include“loop_del.h”
/*…………………………………………………………………………………………*/
Intmain(void)
{
//Initialisetheportpinsasrequired
PORT_Init();
//PreparetoflashLED
LED_FLASH_Init();
While
(1)
{
//ChangetheLEDstste(OFFtoON,orviceversa)
LED_FLASH_Change_State();
//Delayfor*apprpx*1000ms
LOOP_DELAY_Wait(1000);
}
Return1;//Shouldneverreachhere…
}
例子九:
一个在PC上的PORTwrapper例子(c主程序)
背景材料,并进一步阅读
端口接头
内容
你使用一个或更多的8051系列的微处理器来开发一个嵌入式系统。
问题
你怎么在一个较大的项目中管理分配端口的访问?
背景
在一个典型的嵌入式项目,你可能必须使用LCD,键盘以及一个或一个或多个单个的LED来创建一个用户接口。
也许会有一系列的连接线到另一个微处理器。
有可能是你的应用程序来控制一个或多个大功率器件。
每个应用程序中的这些部件需要独占访问的一个或多个端口引脚。
这个工程可能包括10-20不同的源文件。
你怎么确定一个部分端口许可的改变不会影响另一个?
你怎么确定在一个不同的引脚必须得被使用的环境,我们能够容易的应用端口。
这些问题通过简单的端口接头的设计模式可以解决
解决方法
端口接头封装了一个简单而有效的设计指导,可以帮助你应付在一个较大的项目很多不同的组件将每个需要的端口访问的事实:
具体而言,使用端口头,你会为整个项目的不同的端口访问功能集中到一个文件中。
使用这个技术可以容易的开发,维护,移植工程。
端口