摘自:《C和Cpp嵌入式系统编程》的第五章《接触硬件》
在拿起这块板子之前,你应该能回答如下两个基本问题:
1.这块板子主要目标是什么?
2.数据是如何在里面流动的?
尽管大多数系统的目的会很明显,可是数据流就可能不会是这样。我发现一
份数据流图可以帮助你快速理解。如果你幸运的话,硬件所带的文档重会有你
所需要的一整套方框图,而且你会发现它会帮助你创建你自己的数据流图。这
样,你就可以不去理会那些和系统数据流无关的硬件元器件了。
既然画好了方框图,就别急着把它揉一揉扔掉了,相反在整个项目进行中应
已知留着以备参考。我建议使用一个项目记录本或装订夹,并把这张数据流图
作为第一页。随着你使用这块硬件的工作的进展,把你了解到的所有东西都记
到记录本上,你也许还会希望保持有关软件设计和实现的记录。一个项目记录
本不仅在你开发软件时有用,而且在项目结束后也一样。当你需要对你的软件
做一些改动,或者在几个月或几年后做类似工作的时候,你就会很感谢自己当
年为保持一份记录而做的额外努力。
如果你在读完硬件文档后,对整体情况还有什么疑问的话,你可以去询问一
位硬件工程师来取得帮助。如果你还不认识这个硬件的设计人员的话,先花几
分钟把你自己介绍一下,要是有时间的话,可以请他吃午饭或在工作以后送给
他一只玩具熊(你可以不必讲这个项目!)。我发现很多软件工程师和硬件工程
师沟通起来有困难,反过来也一样。在嵌入式系统开发中,软件人员和硬件人
员的交流是特别重要的。
存储器映射
在你了解一块新的电路板的时候,可以创建一张表来显示在储空间里每个存
储设备和外设的名字和地址范围。组织一下这张表,让最低的地址位于底部,
最高的地址位于顶端。每次往存储器映射里添加一个设备的时候,按照它在内
存里的大概位置来放进表内并用十六进制标出起始和结束地址。在往存储器映
射图里插入所有的设备以后,记着用同样的方式把没利用的存储区域也标记出
来。
对于每一块新的电路板来说,你应该创建一个头文件来描述它的特性,这个
文件提供了硬件的一个抽象接口。在实际中,它使你可以通过名字而不是地址
来引用板子上的各种设备。这样做带来的一个额外的好处,是使你的应用软件
更加容易移植。如果存储器映射发生了变化——例如128KB 的RAM 被移走了
——你只需要改变面向电路板头文件中相关的几行,然而重新编译你的程序。
I/O空间映射
如果存在独立的I/O 空间的话,那就需要像完成存储器映射一样也要为电路
板创建一个I/O 映射。这个过程完全一样。简单地创建一张包含外设名字和地址
范围的表,并组织一下把低地址放在底端。典型地,I/O 空间里的大部分是未利
用的因为大多动外设只有几个寄存器。
中断映射
了解了系统的中断使用情况之后,列出中断表,这样你可以在面向电路板的头
文件里加人第三个部分——中断映射。
研究使用的处理器
如果你以前没用过你的电路板上的处理器的话,现在就应该花一些时间来熟
悉一下。如果你一直用C 或C++编程的话,这花不了很长时间。对高级语言的
使用者来说,大多数处理器看起来和用起来都差不多。不过,要是你做汇编语
言编程的话,你就需要熟悉一下处理器的结构和指令集。
关于处理器你想了解的每一样东西都可以在制造商提供的数据手册里找到。
如果你还没有用于你的处理器的数据手册或程序员指南的话,那就马上弄一本
来。如果你想成为一个成功的嵌入式系统程序员的话,你必须能读数据手册并
从中得到些什么。处理器数据手册通常写得很好(就像数据手册应该的那样),
所以它们会是一个理想的起点。一开始先翻翻数据手册,把和手边的工作最有
关系的章节记录下来,然后回头阅读处理器总述这一节。
在头文件中添加关于CPU中寄存器的宏定义。
其他你会想从处理器手册里了解的事情还包括:
1中断向量表应该放在哪里?它是否必须位于内存中一个特定的地址?如果
不是,处理器如问知道在哪里找到它?
2 中断向量表的格式是什么?它只是一个指向ISR 函数的指针的表吗?
3 处理器自己是否产生一些特殊的叫做陷阱的中断?也要为这些中断写ISR
吗?
4怎样开和禁止中断(全部或个别)?
5 怎样得知知或清除中断?
研究扩展的外围设备
现在,你已经研究了除了扩展的外围设备之外的每个部件。这些扩展的外设
是位于处理器外部并通过中断和I/O 或存储映射寄存器来和处理器通信的硬件
设备。首先来生成一张扩展设备的列表。根据你的应用的不同,这张表可能会
包含LCD 或键盘控制器、A/D 变换器、网络接口芯片或者一些定制的ASIC(专
用集成电路)。
你应该拿到列表上每个设备的用户于用或数据手册。在项目的前期,你阅读
这些文档的目的是要了解这些设备的基本功能。这些设备做些什么?哪些寄存
器被用来发命令和取得结果?这些寄存器里下同的位和字段的意义是什么?如
果这个设备会产生中断的话,什么时候产生?如何得知或清除一个设备的中
断?
当你设计嵌入式软件的时候,你应该是着按设备来分割程序。通常为扩展外
设结合一个叫做设备驱动程序的软件模块是个不错的主意。这个工作只是构建
一个控制外设执行的软件例程的集会从而把应用软件和具体的硬件设备隔离开
来。
初始化硬件
接触你的新硬件的最后一步是写一些初始化程序。这是你和硬件发展一种紧
密的工作关系的最好机会,特别是如果你希望用高级语言编写剩下的软件的活。
在硬件初始化的过程中不可避免地要用到汇编语言。不过,完成了这一步以后,
你就可以用C 或C++编写程序了。
硬件初始化应该在“启动代码”之前执行,那里描述的代码假定硬件已被初始化
从而只用来为高级语言程序创建一个合适的运行时环境。图5-4 提供了关于整
个初始化过程的一般的描述,从处理器复位到硬件初始化和C/C++启动代码一
直到main。
初始化过程的第一步是复位代码。这是处理器上电或复位时立刻执行的一小
段汇编语言(通常只有两到三十指令)。这段代码的唯一目的是把控制传给硬件
初始比例程。复位代码的第一个指令必须放在处理器数据手册里指定的在内存
里的特定位置,通常叫做复位地址。
大多数实际的硬件初始出发生在第二个阶段。在这个地方,我们需要告诉处
理器它自己所处的环境。这也是初始化中断控制器和其他重要外设的好地方。
不太重要的外设可以在启动相应设备驱动程序的时候再初始化,而这些工作经
常是在main 里面完成的。
第三个初始性阶段包含了启动代码,就是我们在第三章里看过的汇编语言代
码。提醒一下,它的任务是为用高级语言书写的代码做准备工作。重要的是只
有启动代码会调用main。从这以后,你所有的软件都可以用C 或C++来写了。
你已开始理解嵌人式软件是如何从处理器复位过渡到你的主程序了。必须承
认,第一次把所有这些组件(复位代码、硬件初始化、C/C++启动代码和应用程
序)综合在一起放到一个新板子上可能有些问题,所以要准备花一些时间来分
别进行调试。坦率地说,这是这个项目里最难的部分。你很快就会看到,如果
你已经有了一个可以工作的闪烁LED 程序作基础的话,工作将越来越容易,或
者至少是更像普通的计算机编程。
转自http://hi.baidu.com/chosin/blog/item/309cea7ef495533b0cd7dacc.html
文章评论(0条评论)
登录后参与讨论