嵌入式系统是以嵌入式处理器为核心部件的,用于执行独立功能的专用计算机系统。嵌入式系统原理及应用开发教程:
一、嵌入式系统原理
1、ARM微处理器支持两种指令集ARM和Thumb。
2、ARM处理器正常的程序执行状态是在用户模式下。
3、ARM处理器中R13寄存器用作程序计数器。R15寄存器用作堆栈指针。
4、当异常发生时,寄存器SPSR存、用于保存CPSR的当前值,从异常复退出时则可由它来恢复CPSR。
5、Flash芯片在写入操作时需要先进行擦除操作。
二、开发流程
1、建立开发环境
安装操作系统与交叉编译器,操作系统一般使用RedhatLinux,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(比如,armn-1inux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的相关交叉编译器。
2、配置开发主机的参数
配置MNICOM参数,MNICOM软件的作用是作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具。
一般情况下的参数为波特率115200Baud/s,数据位8位,停止位为1,无奇偶校验,软件硬件流控设为无。
在Windows下的超级终端的配置也是这样。
配置网络主要是配置NFS网络文件系统,需要关闭防火墙以简化嵌入式网络调试环境设置过程。
3、建立引导装载程序BOOTLOADER
从网络上下载一些公开源代码的BOOTL0ADER,如U-BOOT、BLOB、VIVI、LILO、ARM-Boot、RED-Boot等,根据具体芯片进行移植修改。
有些芯片没有内置引导装载程序,这样就需要编写开发板上FLASH的烧写程序,也可以在网上下载相应的烧写程序。
果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。
这是让系统可以正常运行的第一步。
4、下载已经移植好的Linux操作系统内核。
如MCLiunx、ARM_Linux、PPC-Linux等,如果有专门针对所使用的CPU移植好的Linux操作系统那是再好不过,下载后再添加特定硬件的驱动程序,然后进行调试修改,对于带MMU的CPU可以使用模块方式调试驱动,而对于MCLiunx这样的系统只能编译内核进行调试。
5、建立根文件系统
下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。
由于默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包:/etc/init.drc.S、/etc/profile、/etc/.profile及自动挂装文件系统的配置文件/etc/fstab等,具体情况会随系统不同而不同。
根文件系统在嵌入式系统中-般设为只读,需要使用mkcramfsgenromfs等工具产生烧写映像文件。
6、建立应用程序的FLASH磁盘分区
一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动。
有的系统使用一个线性FLASHNOR型)512KB~32MB,有的系统使用非线性FLASHNAND型)8MB~512MB,有的系统两种同时使用,需要根据应用规划FLASH的分区方案。
7、开发应用程序
根据需要开发应用程序,把开发成功的应用程序可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,这有点类似于uC/OS-II的方式。
交叉编译器原理是什么
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。
另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。
交叉编译器在生成新的硬件平台时非常有用。
“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。
例如:自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。
预处理器(preprocessor)
作用是通过代入预定义等程序段将源程序补充完整。
编译器前端(frontend)
前端主要负责解析(parse)输入的源代码,由语法分析器和语意分析器协同工作。
语法分析器负责把源代码中的‘单词’(Token)找出来,语意分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句,函数等等。
例如“a=b+c;”前端语法分析器看到的是“a,=,b,+,c;”,语意分析器按定义的语法,先把他们组装成表达式“b+c”,再组装成“a=b+c”的语句。
前端还负责语义(semanticchecking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。
最终的结果常常是一个抽象的语法树(abstractsyntaxtree,或AST),这样后端可以在此基础上进一步优化和处理。
编译器后端(backend)
编译器后端主要负责分析,优化中间代码(Intermediaterepresentation)以及生成机器代码(CodeGeneration)。
一般说来所有的编译器分析,优化,变型都可以分成两大类:函数内(intraprocedural)还是函数之间(interprocedural)进行。
很明显,函数间的分析,优化更准确,但需要更长的时间来完成。
还没有评论,来说两句吧...