ARM的裸机开发环境


一.什么是裸机开发
----------------------------------------------------------------------
裸机是一种通俗的讲法,就是指ARM设备上没有任何现成的程序来支持你的开发的软件运行。它是相对设备上有在操作系统的情况运行可执行程序而言的。
这两种程序有很大区别。在操作系统环境下,基本上跟桌面程序开发没有太多区别,而裸机程序需要自己初始化硬件环境来运行。因为必须有一小段汇编写的引导代码来初始化,并且直接操作硬件。
裸机程序一般采用少量汇编加C语言来编译(理论上C++可以了,但比较少)主要用来ARM汇编,硬件控制教学。硬件验证和驱动开发。
大型的程序bootloader,实时操作系统uCOS/Nclues严格讲也是裸机程序。
而且ARM的CPU的都有JTAG的在线硬件调试接口,通过JTAG硬件调试器,可以直接运行和单步调试裸机程序
二.裸机开发流程.
-------------------------------------------------------------------
编码-->编译-->调试-->下载

1.编码采用文本编辑器或相应IDE均可
2.编译器目前主要是两大类
armcc (ARM出品的编译器)
arm-linux-gcc (GNU ARM-Linux 编译器,在非EABI的编译器还分为arm-elf-gcc和arm-linux-gcc的区别现在基本不分了。)
arm-linux-gcc 编译出来的可执行文件格式是ELF,除了常见的TEXT段,BSS/DATA段外,还有会有一些调试段..而armcc编译出来的格式是AXF。但AXF本质是仍然是ELF格式,只不过加一些特殊的调试段。
3.调试方法
如果用JTAG在线硬件调试的那种单步调试.有两种接口。一种是ARM公司的RDI接口,另外一种硬件调试器虚拟的gdb接口。这个要使用ELF/或AXF格式
但很多程序会用直接让程序输出信息到串口方式进行调试。这种速度比较快,可以理解是广义上的调试。这个阶段要使用BIN格式。
4.下载
下载是指把可执行的BIN文件下载到开发板上的Flash之中。让其完全脱离调试环境完全独立运行。
如果一个空板,即Flash中没有任何程序。这时需要一些特殊下载方式。比用JTAG烧录工具下载到Flash之中。有一些CPU还有一些特殊的下载方式。比如S3C6410支持SD卡启动。可以把下载的文件放在SD卡上,由SD卡里的BOOTLOADER来下载。
还有一些CPU内部带有ROM自行启动一个小程序,然后通过USB下载程序。比如JZ4740。
如果Flash上烧录有bootloader,它往往自带有烧录功能。 可以通过TFTP/USB/串口方式从PC机下载到设备上。
可执行文件格式
Elf
Linux下标准可执行结构.还有一种out是早期的较为简单的可执行文件格式。但是在新版本里out就是ELF格式。
BIN
bin文件是由ELF转化而来,专门用下载到设备。相对于ELF它有两个变化。第一BIN只有基本的text/bss/data段,没有调试信息。第二。因为bin要下载到设备的。里面各段的地址是按相应地址对齐烧录的。因为两段之间很可能补一些空间的0空间。
ELF转换为BIN用arm-linux-objcopy 以下语句把elf_name转换成bin_name。
arm-linux-objcopy -O binary -S elf_name bin_name
HEX:
HEX主要是把BIN内容转换成相应的ASCII的文本格式,并且每一行都带下载地址。
HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:
+---------------------------------------------------------------+
| RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM |
| MARK ':' | | OFFSET | | | |
+---------------------------------------------------------------+
| 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte |
+---------------------------------------------------------------+
关于HEX/BIN区别,参见
http://blog.ednchina.com/wwh_nuaa/74736/message.aspx

不同产家的HEX格式有细微的差别,比如MOTO的HEX格式称为S-Record格式,Intel格式称为 Intel-HEX ,两者的差别参见
http://blog.chinaunix.net/u1/58640/showart_1864111.html
http://www.upsdn.net/html/2004-12/95.html
多用于可编程器的的离线下载或者单片机程序的下载。ARM开发不常用。
### 如何搭建ARM架构的裸机开发环境 #### 配置交叉工具链 在Linux环境下进行ARM裸机开发时,需要配置一个适合目标系统的交叉编译器。这可以通过安装预构建的工具链或者自行编译来实现。通常推荐使用现成的工具链,例如GNU Arm Embedded Toolchain[^1]。 对于Windows或MacOS用户,可以分别参考特定的操作指南。例如,在MacOS环境中,开发者可以选择基于Homebrew或其他包管理工具获取必要的依赖项,并完成工具链的部署[^2]。 #### 下载必要软件包 为了简化设置过程,可以从官方资源或者其他可信站点下载预先打包好的工具集。比如Yagarto是一个流行的解决方案之一,它包含了GCC、GDB以及Newlib库的支持,非常适合初学者快速入门[^3]。 另外还需要考虑硬件通信需求,如果计划通过串口连接设备,则可能需要用到相应的驱动程序支持,像CH340系列芯片对应的驱动就是常见例子。 #### 创建首个项目实例 一旦完成了上述准备工作之后,就可以着手创建自己的第一个工程项目了。按照惯例,我们会先尝试点亮一块板子上的LED作为验证手段;为此需经历几个主要环节——包括但不限于虚拟工作区建立(即模拟运行条件)、实际物理连线确认还有最终代码上传测试等等具体事项均已在先前资料有所提及[^4]。 以下是简单的Blinking LED C源码片段用于演示目的: ```c #include "stm32f4xx.h" void delay(volatile uint32_t count){ while(count--); } int main(void){ RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // Enable clock access to GPIO port A GPIOA->MODER &= ~(GPIO_MODER_MODE5_Msk); // Clear mode bits for pin PA5 GPIOA->MODER |= (0b01 << 10); // Set output mode on pin PA5 while(1){ GPIOA->ODR ^= GPIO_ODR_OD5; // Toggle state of pin PA5 delay(900000); // Wait some time before toggling again } } ``` 此段落展示了如何控制STM32微控制器的一个通用I/O端口以达到周期性改变其电平状态的效果,从而使得外接于此管脚处的小型发光二极管能够规律闪动起来。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值