加载中...
学习ARM
发表于:2009-07-12 | 分类: 硬件设计
字数统计: 1.6k | 阅读时长: 5分钟 | 阅读量:

认识ARM系列器件

ARM7 9 ARM Cortex

开发环境/软件

Keil IAR ads

IAR

ARM还有一个simulator可供仿真调试使用,其他的需要连接实际硬件调试 全速运行;添加断点 F9;进入 step into;跳出 step out跳出循环 Forced Interrupt-trigger触发中断 .s文件  startup文件

ARM指令集

ARM 32 thumb 16位

Ads中生成烧录文件

生成烧录文件bin等,targetsetting中选择 Target Settings中将Post- linker设置为 ARM fromELF。然后,设置 ARM fromELF,在Output Format中选择需要的格式。

ads中.a文件

a文件是封装的lib库文件,封装成a文件,然后给人用,要告诉人接口 如何生成?新建Lib工程 File-New-ARM Object Library,然后建立c文件,输入函数int test(void),然后编译,就生成了.a文件 如何调用?在arm可执行文件中调用,File-New-ARM Executable Image,然后c文件中中声明extern int test(void);,然后就可调用.a中的函数了,要将.c文件和.a文件都加入工程中

.s文件

startup文件

__main函数

__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。所以说,前者是库函数,后者就是我们自己编写的main()主函数;

__main()为编译系统提供的一个库函数,使用__main标号引导系统时必须将应用程序的入口数定义为main();

__main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__main标号引导系统时必须将应用程序的入口定义为main()。 在初始化的过程中,__main函数的作用主要有两点: (1)  完成对映像文件的初始化操作 在介绍映像文件的初始化操作之前,先介绍以下几个概念: 1.  映像文件 链接器把多个目标文件链接成一个映像文件。 2.  加载地址和执行地址 映像文件可以有两种地址:加载地址和执行地址。加载地址是映像文件在存储器中的存储地址;执行地址就是映像文件运行时的地址。 3.  加载域和执行域 文件加载的存储区叫加载域,文件运行的存储区叫执行域。 4.  从加载地址到执行地址 在结构比较简单的系统中,加载地址就是执行地址;而在复杂系统中,程序运行前,常常会把映像文件的一部分或全部从存储区域移出去,此时执行地址就不再是加载地址。 知道以上几个概念,__main函数对映像文件的初始操作就不难理解了。对于加载地址和执行地址不同的映像文件,__main函数会把加载地址的代码和数据复制到执行地址中,并且对被链接器指定为需要初始化为0的段,进行清零操作

__main和main

ADS中规定的C语言入口,ADS中从初始化汇编代码跳到main函数有两种方式,main和__main: 1,在__main入口的模式下,汇编代码的指令为 b  __main, 编译器在跳转到main之前还要作一系列的工作,这其中就包括对运行环境的初始化,在中提到: copies nonroot(RO&RW) execution regions from load addr to exec addr, and Zeros ZI region. 借助编译器,我们还可以定义更为复杂的运行环境,这里要用到scatter文件(.scf),比如我们要的目标运行环境是:将启动代码以外的所有代码都拷贝到SDRAM的初始地址中运行,并且把RW段设在0x30800000,那么对应的scf文件如下: FLASH 0x0  0x200000 { EXEC1 0x0 0x200000 { 2410init.o(Init, +First) __main.o(+RO)   ; copy code * (Region$$Table)       ; RO/RW addresses to copy * (ZISection$$Table)    ; ZI addresses to zero } EXEC2 0x30000000 0x00800000 { *(+RO) } SDRAM 0x30800000 0x00800000 { *(+RW,+ZI) } } ;Sections named Region$$Table and ZISection$$Table which contain the addresses of the code/data to be copied. 当然,在这种模式下,有些入口函数必须自己重定义,比如__user_initial_stackheap,具体参见ADS文档。 2, main入口模式即简单的跳转,这里起始不用“main”这个名字也无所谓。那么编译器不会作任何的初始化,所有运行环境的建立都要靠 我们自己,这就是大家看到的那段搬运代码存在的理由。但是它实现一些简单的运行环境是可取的,如果用scf定义的复杂环境,虽然我相信是可以做到的,但是可能会比较麻烦。我还没深究。

.scf文件

ads ARM linker simple scattered Simple方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的ELF格式的目标文件,使用的是链接器选项中指定的地址映射方式。Scattered方式使得链接器要根据scatter格式文件中指定的地址映射,生成复杂的ELF格式的映像文件。 -– 开发过程:建立项目—>源文件—>编译—->调试—–>固化 交叉编译: -------三类: 驱动工程师: 主做底层驱动,为上层提供接口,不断新增硬件,还是比较忙的 系统工程师:修剪、移植系统,配置系统,跑起来 各种对象和事件的处理 应用工程师: 界面的设计, 网络(常常用到网络) 数据库等 --------------Linux ARM Linux有MMU的 UCLinux无MMU -----交叉编译 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓 平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结 构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

参考资料

ADS120_DEBUG_Hardware.exe ARM Linux在SkyEye上的移植-电子开发网.mht arm-CH8.ppt ARM体系结构与编程.pdf ARM嵌入式入门级教程.pdf ARM嵌入式应用开发技术白金手册.pdf ARM应用系统开发详解全集.pdf ARM开发详解.pdf ARM接口设计技术.ppt skyeye122Rel·tar.bz2

上一篇:
域名使用经验
下一篇:
PIC开发环境、开发工具
本文目录
本文目录