Getting to Know the Hardware
hardware n. The part of a computer system that can be kicked.
As an embedded software engineer, you#39;ll have the opportunity to work with many different pieces of hardware in your career. In this chapter, I will teach you a simple procedure that I use to familiarize myself with any new board. In the process, I#39;ll guide you through the creation of a header file that describes the board#39;s most important features and a piece of software that initializes the hardware to a known state.
5.1 Understand the Big Picture
Before writing software for an embedded system, you must first be familiar with the hardware on which it will run. At first, you just need to understand the general operation of the system. You do not need to understand every little detail of the hardware; that kind of knowledge will not be needed right away and will come with time.
Whenever you receive a new board, you should take some time to read whatever documents have been provided with it. If the board is an off-the-shelf product, it might arrive with a 'User#39;s Guide' or 'Programmer#39;s Manual' that has been written with the software developer in mind. However, if the board was custom designed for your project, the documentation might be more cryptic or written mainly for the reference of the hardware designers. Either way, this is the single best place for you to start.
While you are reading the documentation, set the board itself aside. This will help you to focus on the big picture. There will be plenty of time to examine the actual board more closely when you have finished reading. Before picking up the board, you should be able to answer two basic questions about it:
- What is the overall purpose of the board?
- How does data flow through it?
For example, imagine that you are a member of a modem design team. You are a software developer who has just received an early prototype board from the hardware designers. Because you are already familiar with modems, the overall purpose of the board and the data-flow through it should be fairly obvious to you. The purpose of the board is to send and receive digital data over an analog telephone line. The hardware reads digital data from one set of electrical connections and writes an analog version of the data to an attached telephone line. Data also flows in the opposite direction, when analog data is read from the telephone line jack and output digitally.
Though the purpose of most systems is fairly obvious, the flow of the data might not be. I often find that a data-flow diagram is helpful in achieving rapid comprehension. If you are lucky, the documentation provided with your hardware will contain a superset of the block diagram you need. However, you might still find it useful to create your own data-flow diagram. That way, you can leave out those hardware components that are unrelated to the basic flow of data through the system.
In the case of the Arcom board, the hardware was not designed with a particular application in mind. So for the remainder of this chapter, we#39;ll have to imagine that it does have a purpose. We shall assume the board was designed for use as a printer-sharing device. A printer-sharing device allows two computers to share a single printer. The user of the device connects one computer to each serial port and a printer to the parallel port. Both computers can then send documents to the printer, though only one of them can do so at a given time.
In order to illustrate the flow of data through the printer-sharing device, I#39;ve drawn the diagram in Figure 5-1. (Only those hardware devices that are involved in this application of the Arcom board are shown.) By looking at the block diagram, you should be able to quickly visualize the flow of the data through the system. Data to be printed is accepted from either serial port, held in RAM until the printer is ready for more data, and delivered to the printer via the parallel port. The software that makes all of this happen is stored in ROM.
Figure 5-1. Data-flow diagram for the printer-sharing device
Once you#39;ve created a block diagram, don#39;t just crumple it up and throw it away. You should instead put it where you can refer to it throughout the project. I recommend creating a project notebook or binder, with this data-flow diagram on the first page. As you continue working with this piece of hardware, write down everything you learn about it in your notebook. You might also want to keep notes about the software design and implementation. A project notebook is valuable not only while you are developing the software, but also once the project is complete. You will appreciate the extra effort you put into keeping a notebook when you need to make changes to your software, or work with similar hardware, months or years later.
If you still have any big-picture questions after reading the hardware documents, ask a hardware engineer for some help. If you don#39;t already know the hardware#39;s designer, take a few minutes to introduce yourself. If you have some time, take him out to lunch or buy him a beer after work. (You don#39;t even have to talk about the project the whole time!) I have found that many software engineers have difficulty communicating with hardware engineers, and vice versa. In embedded systems development, it is especially important that the hardware and software teams be able to communicate with one another.
5.2 Examine the Landscape
It is often useful to put yourself in the processor#39;s shoes for a while. After all, the processor is only going to do what you ultimately instruct it to do with your software. Imagine what it
全文共36596字,剩余内容已隐藏,支付完成后下载完整资料
了解硬件。
硬件n。可以被踢出的计算机系统的一部分。
作为一个嵌入式软件工程师,您将有机会在您的职业生涯中使用许多不同的硬件。在这一章中,我将教你一个简单的程序,让我熟悉任何新的电路板。在这个过程中,我将指导您创建一个描述电路板最重要特性的头文件和一个将硬件初始化为已知状态的软件。
5.1了解大图
在为嵌入式系统编写软件之前,您必须先熟悉它将运行的硬件。起初,你只需要了解系统的一般操作。您不需要了解硬件的每个细节;这种知识不会马上需要,而是会随着时间而来。
无论何时你收到新的电路板,你都应该花一些时间阅读提供给它的任何文件。如果电路板是现成的产品,则可能会附带一份由软件开发人员编写的“用户指南”或“程序员手册”。但是,如果电路板是为您的项目定制设计的,那么文档可能会更加模糊或主要是为了硬件设计人员的参考。无论哪种方式,这是您开始的最佳选择。
在阅读文档时,将板子放在一边。这将帮助您专注于全局。完成阅读后,将有足够的时间更仔细地检查实际的电路板。在拿起电路板之前,您应该能够回答有关它的两个基本问题:
·电路板的总体目标是什么?
·数据如何流经它?
例如,假设你是一个现代设计团队的成员。您是刚刚从硬件设计人员那里获得早期原型板的软件开发人员。由于您已经熟悉调制解调器,因此电路板的总体用途和通过它的数据流应该对您来说相当明显。该电路板的目的是通过模拟电话线发送和接收数字数据。硬件从一组电气连接中读取数字数据,并将模拟版本的数据写入附加的电话线。当从电话线插孔读取模拟数据并以数字方式输出时,数据也以相反的方向流动。
虽然大多数系统的目的是相当明显的,但数据流可能不是。我经常发现数据流图有助于快速理解。如果幸运的话,硬件提供的文档将包含您需要的程序框图的扩展集。但是,您仍可能发现创建自己的数据流图非常有用。这样,您可以省去那些与通过系统的基本数据流无关的硬件组件。
在Arcom电路板的情况下,硬件的设计并没有考虑到特定的应用。因此,在本章的其余部分中,我们必须设想它确实有一个目的。我们将假定该板被设计为用作打印机共享设备。打印机共享设备允许两台计算机共享一台打印机。设备的用户将一台计算机连接到每个串行端口,将一台打印机连接到并行端口。两台计算机都可以将文件发送给打印机,但是只有其中一台可以在给定时间进行打印。
为了说明通过打印机共享设备的数据流,我绘制了图5-1中的图。 (只显示Arcom开发板应用程序中涉及的硬件设备。)通过查看程序框图,您应该能够快速查看通过系统的数据流。要从哪个串行端口接收要打印的数据,保存在RAM中,直到打印机准备好更多数据,并通过并行端口传送到打印机。使这一切发生的软件都存储在ROM中。
图5-1。打印机共享设备的数据流图
一旦你创建了一个程序框图,不要把它弄皱并扔掉。你应该把它放在你可以在整个项目中引用它的地方。我建议创建一个项目笔记本或活页夹,并在第一页显示此数据流图。在您继续使用这款硬件时,请记下您在笔记本上了解的所有内容。您可能还想记录有关软件设计和实现的注意事项。项目笔记本不仅在您开发软件时有价值,而且在项目完成后也很有价值。当您需要对软件进行更改或在几个月或几年后使用类似硬件时,您将会非常感激您为保留笔记本电脑而付出的额外努力。
如果您在阅读了硬件文档之后仍然有任何大的问题,请向硬件工程师寻求帮助。如果你还不知道硬件的设计者,那就花几分钟介绍一下自己。(你甚至不必一直谈论这个项目!)我发现很多软件工程师很难与硬件工程师沟通,反之亦然。在嵌入式系统开发中,硬件和软件团队能够相互沟通尤其重要。
5.2检查美化
暂时把自己放在处理器的位置上是很有用的。毕竟,处理器只会做你最终指示它处理你的软件的事情。想象一下处理器是什么样子:处理器的世界是什么样的?如果你从这个角度思考,你会很快意识到处理器有很多同胞。这些是板上的其他硬件,处理器可以直接通信。在本节中,您将学习识别它们的名称和地址。
首先要注意的是,有两种基本类型:内存和外围设备。显然,内存是用于数据和代码存储和检索的。但你可能想知道外围设备是什么。这些是专门的硬件设备,它们可以与外部世界(I/O)进行协调,或者执行特定的硬件功能。例如,嵌入式系统中最常见的两个外围设备是串行端口和计时器。前者是I/O设备,后者基本上只是一个计数器。
Intel的80x86和其他一些处理器家族的成员有两个不同的地址空间,他们可以通过这些空间与这些内存和外围设备进行通信。第一个地址空间称为内存空间,主要用于内存设备;第二种是专门为外围设备预留的,称为I/O空间。但是,外围设备也可以位于内存空间中,由硬件设计人员自行决定。当这种情况发生时,我们说这些外围设备是内存映射的。
从处理器的角度来看,内存映射的外围设备看起来和行为非常像内存设备。然而,外设的功能与记忆的功能明显不同。与其简单地将提供给它的数据存储起来,外设还不如将其解释为一个命令或以某种方式处理的数据。如果外围设备位于内存空间中,我们说系统有内存映射I/O。
嵌入式硬件的设计者通常更喜欢使用内存映射I/O,因为它对硬件和软件开发人员都有好处。它对硬件开发人员很有吸引力,因为他可以完全消除I/O空间和一些相关的连接。这可能不会显著降低电路板的生产成本,但它可能会降低硬件设计的复杂性。内存映射的外围设备对程序员来说也更好,他们能够使用指针、数据结构和结合,从而更容易和有效地与外围设备进行交互。[1]
5.2.1内存映射
所有的处理器都将程序和数据存储在内存中。在某些情况下,这种内存与处理器的芯片是相同的,但更常见的是它位于外部内存芯片中。这些芯片位于处理器的内存空间中,处理器通过两套称为地址总线和数据总线的电线与它们通信。要在内存中读取或写入特定位置,处理器首先在地址总线上写入所需的地址。然后将数据传输到数据总线上。
当您正在阅读一个新的公告板时,创建一个表,它显示内存空间中每个内存设备和外围设备的名称和地址范围。组织表格,使最低的地址在底部,最高的地址在顶部。每次向内存映射中添加一个设备时,将它放在内存中的近似位置,并在十六进制中标记开始和结束地址。在将所有设备插入到内存映射之后,请确保将所有未使用的内存区域标记为这样。
如果您回头看看图5-1中Arcom board的框图,您会看到地址和数据总线上附加了三个设备。这些设备是RAM和ROM,还有一个神秘的设备,标着“Zilog 85230串行控制器”。Arcom提供的文档说明,RAM位于内存的底部,并向上扩展到内存空间的第一个128 KB。ROM位于内存的顶部,向下延伸256kb。但是这个内存区域实际上包含两个rom——一个EPROM和一个闪存设备,每个大小为128 KB。第三个设备,Zilog 85230串行通信控制器,是一个内存映射的外围设备,它的寄存器可以在地址70000h和72000h之间访问。
图5-2中的内存映射显示了这些设备对处理器的外观。在某种意义上,这是处理器的“地址簿”。就像你在你的个人生活中维护一个名字和地址的列表一样,你必须为处理器维护一个类似的列表。内存映射包含了从处理器的内存空间中可以访问的每个内存和外围设备的一个条目。这个图表可以说是关于系统的最重要的信息,应该保持最新,并且作为与项目相关的永久记录的一部分。
图5 - 2。Arcom板的内存映射。
对于每个新板,您应该创建一个头文件来描述其最重要的特性。该文件为硬件提供了一个抽象接口。实际上,它允许您以名称(而不是地址)来引用电路板上的各种设备。这增加了使您的应用程序软件更便于移植的好处。如果内存映射发生了变化——例如,如果RAM的128kb是移动的——您只需要更改特定于面板的头文件的受影响的行,并重新编译应用程序。
随着这一章的进展,我将向您展示如何为Arcom板创建一个头文件。该文件的第一部分如下所示。头文件的部分描述了内存映射。在头文件中的内存映射和图5-2中最显著的区别是地址的格式。指针和地址解释了原因。
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*内存映射
*
*基本地址尺寸描述。
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 0000:0000h 128 k SRAM
* 2000:0000h未使用
* 7000:0000h Zilog SCC寄存器。
* 7000:1000h Zilog SCC中断确认。
* 7000:2000h未使用
* C000:0000h 128 k闪光
* E000:0000h 128 k EPROM
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
#define SRAM_BASE (void *) 0x00000000
#define SCC_BASE (void *) 0x70000000
#define SCC_INTACK (void *) 0x70001000
#define FLASH_BASE (void *) 0xC0000000
#define EPROM_BASE (void *) 0xE0000000
指针与地址
在C和C 中,指针的值都是一个地址。所以当我们说我们有一个指向某些数据的指针时,我们确实意味着我们有第几个数据存储地址。但程序员通常不会直接设置或检查这些地址。此规则的例外是操作系统,设备驱动程序和嵌入式软件的开发人员,他们有时需要在代码中明确地设置指针的值。
不幸的是,地址的确切表示可能会因处理器而异,甚至可能依赖于编译器。这意味着像12345h这样的物理地址可能不会以这种形式存储,或者甚至可能被不同的编译器以不同的方式存储。[2]然后出现的问题是程序员如何明确地设置指针的值,以便指向存储器映射中所需的位置。
大多数用于80x86处理器的C / C 编译器使用32位指针。但是,较旧的处理器没有简单的线性32位地址空间。例如,英特尔的80188EB处理器只有20位地址空间。此外,它的内部寄存器都不能超过16位。所以在这个处理器上,两个16位寄存器(一个段寄存器和一个偏移寄存器)被组合起来,以创建20位物理地址。 (物理地址计算包括将段寄存器的内容左移4位,并将偏移寄存器的内容添加到结果中,忽略到第21位的任何溢出。)
为了声明和初始化一个指向位于物理地址12345h的寄存器的指针,我们写下:
int * pRegister =(int *)0x10002345;
最左边的16位包含段值,最右边的16位包含偏移值。
为了方便起见,80x86程序员有时把地址写为段:偏移对。使用这个符号,物理地址12345h将写成0x1000:2345。这正是我们用来初始化指针的值- sans colon。然而,对于每个可能的物理地址,有4096个不同的段:指向给定物理地址的偏移对。例如,对0x1200:0345和0x1234:0005(和4093其他)也引用物理地址12345h。
5.2.2 I / O映射
如果存在单独的I / O空间,则有必要重复执行内存映射练习,以便为该板创建I / O映射。这个过程是完全一样的。只需创建一个外围名称和地址范围表,按照最低地址位于最底部的方式组织。通常情况下,很大一部分I / O空间将不被使用,因为大多数位于那里的外设只有少数寄存器。
Arcom开发板的I / O映射如图5-3所示。它包括三个器件:外设控制模块(PCB),并行端口和调试器端口。 PCB是80188EB内用来控制片上外设的一组寄存器。控制并行端口和调试器端口的芯片位于处理器之外。这些端口分别用于与打印机和基于主机的调试器进行通信。
图5-3。 Arcom主板的I / O映射
创建主板的头文件时,I / O映射也很有用。 I / O空间的每个区域直接映射到一个常量,称为基地址。上面的I / O映射到一组常量可以在下面的列表中找到:
/ ******************* *********************
*
* I / O地图
*
*基地址描述
* --------------- ---------------------------------- ----
* 0000h未使用
* FC00h SourceVIEW调试器端口(SVIEW)
* FD00h并行I / O端口(PIO)
* FE00h未使用
* FF00h外设控制块(PCB)
************************************************** ***** /
#define SVIEW_BASE 0xFC00
#define PIO_BASE 0xFD00
#define PCB_BASE 0xFF00
5.3学习如何沟通
现在您知道处理器附带的内存和外设的名称和地址,现在该学习如何与后者通信了。有两种基本的通信技术:轮询和中断。无论哪种情况,处理器通常都会向设备发出某种命令(通过内存或I / O空间),然后等待设备完成分配的任务。例如,处理器可能会要求定时器从1000到0进行倒数。一旦倒计时开始,处理器只关心一件事情:定时器是否完成计数?lt;
全文共12424字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[15209],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。