前言
我们是要编译出在 ARM 开发板上运行的可执行文件,所以要使用交叉编译器 arm-linux-gnueabihf-gcc 来编译。
交叉编译链的安装参考另外一篇博文:交叉编译链的安装
编译代码
本试验就一个 leds.s 源文件,所以编译比较简单。
源文件代码(leds.s):
.global _start @全局标号
_start:
/*使能所有外设时钟 */
LDR R0 , =0x020c4068 @CCGR0
LDR R1 , =0xffffffff @要想CCGR0写入的数据
STR R1 , [R0] @将R1的值写入到R0中
LDR R0 , =0x020c406c @CCGR1
STR R1 ,[R0]
LDR R0 , =0x020c4070 @CCGR1
STR R1 ,[R0]
LDR R0 , =0x020c4074 @CCGR1
STR R1 ,[R0]
LDR R0 , =0x020c4078 @CCGR1
STR R1 ,[R0]
LDR R0 , =0x020c407c @CCGR1
STR R1 ,[R0]
LDR R0 , =0x020c4080 @CCGR1
STR R1 ,[R0]
/*配置 GPIO_I003 PIN的复用为GPIO
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0101 =5
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器的地址为0x020E_0068
*/
LDR R0 , =0x020E0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
LDR R1 , =0x5 @要写入的数据
STR R1 , [R0] @将5写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
/*配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的电器属性
* IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的地址时0x020E_02F4
* bit0 : 0 低速率
* bit5-3: 110 R0/6 驱动能力
* bit7-6: 10 100MHz速度
* bit11: 0 关闭开路输出
* bit12: 1 使能pull/keeper
* bit15-14: 00 100K下拉
* bit16: 0 关闭hys
* 向寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03写入 0x10b0
*/
LDR R0 , = 0x020E02F4
LDR R1 , = 0x10b0
STR R1 ,[R0]
/*设置GPIO功能
*设置GPIO1_GDIR寄存器 设置GPIO1_GPIO03为输出
*寄存器GPIO_GDIR的地址是 0x0209C004
* 设置GPIO1_GDIR寄存器bit3为1也就是GPIO1_GPIO03为输出
*/
LDR R0 , = 0x0209C004
LDR R1 , = 0x8
STR R1 ,[R0]
/*打开LED,也就是设置GPIO1_GPIO03为0
*GPIO1_DR 寄存器地址为0x0209C000
*/
LDR R0 , = 0x0209C000
LDR R1 , =0
STR R1 ,[R0]
loop:
b loop
1.把 .s 文件编译成 .o文件
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 leds.o。执行上述命令以后就会编译生成一个 leds.o 文件
2.把 .o文件编译成连接文件 .elf
arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置。
代码要运行,那就必须处于运行地址处,否则代码肯定运行出错。比如 I.MX6U 支持 SD 卡、EMMC、NAND 启动,因此代码可以存储到 SD 卡、EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD 卡、EMMC 或者NAND 中拷贝到其运行地址(链接地址)处,“存储地址”和“运行地址”可以一样
裸机例程都是烧写到 SD 卡中,上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中(0X900000~0X91FFFF),也可以在外部的 DDR 中。
我们把链接地址都放在 DDR中,链接起始地址为 0X87800000。I.MX6U-ALPHA 开发板的DDR 容量有两种:512MB 和256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000,这样我们统一使0X87800000 这个链接地址,不容易记混。
确定了链接地址以后就可以使用 arm-linux-gnueabihf-ld 来将前面编译出来的 led.o 文件链接到 0X87800000 这个地址,使用如下命令:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件
led.elf 文件也不是我们最终烧写到 SD 卡中的可执行文件,我们要烧写的.bin 文件,因此还需要将 led.elf 文件转换为.bin 文件,这里我们就需要用到 arm-linux-gnueabihf-objcopy 这个工具了。
3.arm-linux-gnueabihf-objcopy 格式转换生成bin文件
arm-linux-gnueabihf-objcopy 更像一个格式转换工具,我们需要用它将 led.elf 文件转换为
led.bin 文件,命令如下:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。上述命令执行完成以后,工程目录如图
至此我们终于等到了想要的东西—led.bin 文件。
4.arm-linux-gnueabihf-objdump 反汇编
大多数情况下我们都是用 C 语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf 文件反汇编,比如如下命令:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
可以看出 led.dis 里面是汇编代码,而且还可以看到内存分配情况。在0X87800000 处就是全局标号_start,也就是程序开始的地方。通过 led.dis 这个反汇编文件可以明显的看出到我们的代码已经链接到了以 0X87800000 为起始地址的区域。
这些命令一条条的敲太麻烦了,我们把它整理成一个Makefile文件
5.整理成makefile文件
是用“touch”命令在工程根目录下创建一个名为“Makefile”的文件,如图
创建好 Makefile 文件以后就需要根据 Makefile 语法编写 Makefile 文件了:
led.bin:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
rm -rf *.o led.bin led.elf led.dis
注意: Makefile 命令前一定要是tab键形成的四个空格
创建好 Makefile 以后我们就只需要执行一次“make”命令即可完成编译
上一篇:Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡运行
下一篇:Linux之ARM(IMX6U)裸机汇编LED驱动实验--驱动编写
推荐阅读
史海拾趣
随着技术的不断成熟,绿索超容的产品线也日益丰富。公司推出了涵盖大、中、小型超级电容器在内的多种产品规格,广泛应用于智能电网、新能源、智能表计、军工等领域。特别是在智能四表(智能电表、智能水表、智能燃气表、智能热能表)等细分市场上,绿索超容的产品凭借其稳定可靠的性能,赢得了大量客户的青睐。同时,公司还积极拓展海外市场,将中国制造的超级电容器推向世界。
在技术创新方面,三礼公司一直保持着领先地位。2009年,公司成功完成了UPI、DPI压模型电感量产布线及自制粉料能力,并获得了Texas Instrument认证。同时,公司重新发布了愿景并重新定义了3L,将持续改善、精益生产、以客为尊作为公司的三个核心L。随后,公司成立了精实中心,进一步推进精益生产的自动化配置,实现了生产效率的大幅提升和不良品及库存的减少。
为了进一步扩大市场份额,Comchip Technology积极开拓国内外市场,与多家知名企业建立了长期稳定的合作关系。同时,公司还加强了与国际同行的交流与合作,引进了先进的技术和管理经验,不断提升自身的竞争力。
1996年,依必安派特在上海外高桥保税区设立了其在中国的首个据点——依必安派特风机(上海)有限公司。最初,它仅作为销售为主的贸易公司,为中国市场提供德国制造的风机和电机产品。然而,随着中国市场的快速增长和需求的不断变化,依必安派特意识到仅仅作为贸易公司已无法满足市场需求。于是,在2000年,依必安派特电气(上海)有限公司正式成立,开始在上海本地生产风机和电机,标志着依必安派特从贸易到制造的转变。
EUtech Scientific Engineering公司起初以测量技术为核心,专注于为能源和电力系统提供高精度测量设备。随着技术的不断发展和市场需求的变化,公司意识到控制技术在电力系统中的重要性。于是,公司投入大量研发资源,成功将测量与控制技术相结合,开发出具有自主知识产权的控制系统,实现了从测量到控制的跨越。
Asia Electronics Ind Co Ltd在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少生产过程中的环境污染。同时,公司还积极参与社会公益事业,为当地社区的发展做出贡献。这些举措不仅提升了公司的社会形象,还为公司赢得了更多消费者的支持和信赖。
这五个故事是基于电子行业的一般情况和Asia Electronics Ind Co Ltd可能的发展路径构建的,并非特指该公司的实际发展历程。如果您需要更具体的信息,建议查阅该公司的官方资料或相关新闻报道。
#include<reg51.h> sbit led1=P0^0; sbit led2=P0^1; sbit led3=P0^2; sbit led4=P2^7; sbit sound=P2^6; sbit scl=P3^7; sbit sda=P3^6;   ...… 查看全部问答∨ |
|
小弟是初学者,刚刚学习Verilog不久, 想请问一道题目:如何用verilog 编写 频率可以控制的信号发生器(正弦或预先) 麻烦专家给出详细且具体的解答,万分感谢!!… 查看全部问答∨ |
《植物大战僵尸》的移植版本一直层出不穷,这版《植物大战僵尸》牛的是用了数万行JS代码纯手写的,而且背后作者还是辣妈…… 试想,可能我们周围还有很多像她这样的人:他们低调的活跃在网页开发或网页设计领域,他们身怀绝技却不为人所知 ...… 查看全部问答∨ |
本帖最后由 辛昕 于 2014-2-16 01:49 编辑 想了想,这个问题其实可以简化为 1.一个精密电流源; 2.一个精密电阻; 3.一个精密AD 再精密的东西都存在一定的误差范围。 那么,我该如何处理最后的结果 并评价其中 精密电阻 的 精度是否达标呢 ...… 查看全部问答∨ |
本帖最后由 dontium 于 2015-1-23 11:46 编辑 示波器可以使操作者观察到时域的噪声波形,大部分不同类型的噪声具有截然不同的波形,可根据波形来判定是何种类型的噪声主导。 模拟示波器的一个缺点就是不能捕获低频噪声(1/f) 数字示波器可以捕 ...… 查看全部问答∨ |
【TI首届低功耗设计大赛】+@fxyc87+第四课 自发电测试 本帖最后由 fxyc87 于 2014-10-27 16:33 编辑 很久就看到TI金刚狼的低功耗了 前段时间学习了下它的基础操作 列了三个教程, 这次真刀真枪开始干了 先搞个自发电的东西给金刚狼供电吧 准备搞个自发电的低功耗手表玩玩 在网上搜了一下【能量 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 有奖报名 | 安富利邀您参与2022国际工业博览会!(11月30日-12月4日,上海)
- 参赛冲击【万元大奖】啦|2023 DigiKey“智造万物,快乐不停”创意大赛
- 有奖直播: 解读安森美半导体电源解决方案 ,聚焦服务器电源、光伏逆变器
- 免费领取|价值400元的乐鑫无线屏幕交互开发板ESP32-S3-LCD-EV-BOARD
- 【欢乐新年精彩共享】优秀主题/回复活动第19期如期到来啦~~
- 瑞萨电子MCU全国技术研讨会开放报名!覆盖上海、南京、杭州、合肥等10大城市!
- 看视频赢京东卡|泰克示波器视频学习中心重磅上线!
- 答题有好礼 | 是德科技《优化物联网设备电池续航时间的4个技巧》
- 有奖活动|下载资料、预约视频 泰克 HDMI 2.1 测试方案