学习知识|如何学习嵌入式开发(12)


ARM Linux
ARM linux是由Russell King和其他开发者开发移植的用于ARM 处理器的linux操作系统 。 ARM Linux系统在GNU GPL下发布 。
υCLinux
υClinux 是适用于没有MMU 的嵌入式处理的LinuxOS 版本 。 υ Clinux 同样在GNU GPL发布 。
嵌入式系统开发过程中的常见问题和解决方法
Bootloader如何写入Flash ?
初学者一般都会遇到如何将程序写入处理器的问题 。 对于不同的处理器 , 可以采用不同的方法 。 例如Intel的Xscale处理器可以使用Intel公司提供的JFlash工具烧写 。 对于具有JTAG调试工具软件的处理器 , 可以使用如下思路:编写一段程序 , 这段程序能将位于SDRAM/SRAM 固定地址中的数据写入Flash中 。 烧写时 , 首先 , 将这段软件下载到SDRAM 中 , 然后通过调试软件将要写入Flash的数据下载到SDRAM/SRAM的某个固定地址开始的缓冲区 , 然后通过调试器开始执行程序 , 将数据写入Flash 。 除此以外 , 网络上还提供了很多专用的写Flash的工具 , 开发者可以根据自己的需要选用 。 (现在明白了我在学的那个BF533为什么先下个flashProgramer.dxe先了)
什么是arm-elf-gcc?
arm-elf-gcc是一个交叉C语言编译器 。 我们在PC平台下编译程序 , 编译器运行的处理器同生成的代码将要运行的处理器相同 。 但是 , 在PC
机上编译ARM程序时 , 编译器运行的处理器同生成的代码运行的处理器不同 , 这种编译器叫做交叉编译器 。 其中的elf是指编译器生成的目标文件格式 。 (其实我们平时用的单片机编译器如GCC—AVR等已是交叉编译器了 , 我到现在才弄清楚什么是交叉编译器)
走了哪条编译路径?
系统程序和驱动程序往往包含很多的编译选项 , 很多选项都是在编译时通过命令行定义的 , 如果想知道编译的是那一段程序可以使用如下的方法:
#ifdef PLAT_AAA
#error Code for Platform AAA
#else
#error Code NOT for Platform AAA
#endif
这样在编译的时候就知道 , 编译的是哪一条路经了 。 对于支持#pragma message( “I am here”)的编译器也可使用#pragma message预编译指令 。
我怎么知道那段代码在那个文件中?
系统编程中经常需要使用在多个文件中搜索字符串 , 在windows平台下可以使用平台提供的多文件字符串搜索工具 。 在linux平台下 , 可以使用grep来搜索字符串 。 Grep的搜索功能十分强大 , 支持正则表达式搜索 , 熟练使用grep对于阅读系统和驱动程序代码是很有帮助的 。
系统是从那个文件开始运行的?
对于Windows CE系统 , 一般从WINCE420\PLATFORM\YourPlatform\KERNEL\HAL目录的某个汇编文件中 。 对于Linux系统版本不同会存在一定差异 , 以arm处理器为例 , 一般会在linux2.4.x\arch\arm\kernel的head-armv.S中 。
程序执行到了那里?
可以在程序中插入如下代码来实现
printf( “I am here %s, %d\n”,__FILE__,__LINE__);
代码将打出printf语句所在的文件名和行号 。
推荐书目
Jean J.Labrosse MicroC/OS-II The Real-TimeKernel,Second Edition这本书是笔者接触嵌入式实时系统的入门书 , 在国内能够买到中文版 。 这本书较为清楚地讲述了实时系统的概念 , 各个组成部分的工作原理 , 特别是公开了实时系统内核的源代码 , 仔细研究定会受益匪浅 。 有个小的提示 , 对于初学者 , 这本书可以先不看第一章 , 直接从第二章看起 。
Abraham Silberschatz, Peter Baer Galvin,GregGagne Operating System Concepts笔者在教学过程中发现 , 无论是计算机还是电子工程专业都有很多学生对于操作系统的基本概念都没有搞清 , 很少有学生有完整的系统编程经验 。 Operating System Concepts这本书对操作系统的概念讲述只能用经典来形容 。 对于嵌入式系统有兴趣深入研究的同学 , 首先要把基础打好 , 这本书就成了必读之物了 。

推荐阅读