ARM裸机开发:链接脚本、进阶Makefile(bsp)、编译过程、beep实验
一、链接脚本的作用?各个段存放什么数据类型
(一)链接脚本内容
SECTIONS
{
. = 0x87800000;
.text : {
obj/start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : {*(.data)}
__bss_start = .;
.bss ALIGN(4) : {*(.bss) *(COMMON)}
__bss_end = .;
}
(二)链接脚本作用(链接的规划)
1.指导链接器如何将输入的目标文件(.o文件)组合成最终的可执行文件
理解:makefile中遍历目录寻找.s文件和.o文件时,找到的文件乱序排列,没有使启动代码start.o放在.text数据段的刚开始地址,这样使得代码开始运行时不是启动代码。链接脚本将start.o放在了.text刚开始位置。
2.内存布局定义:指定程序各个段在内存中的起始地址和排列顺序
__bss_start = .; .bss段开始地址(定位寄存器)
__bss_end = .; .bss段结束地址
理解:启动代码时通过此地址将未初始化值初始化未0
(二)各个数据段存放数据类型
1. .text:存放可执行代码(机器指令)
2. .rodata:只读数据:字符串常量、全局常量(const int)
3. .data:已初始化的全局变量和静态变量
4. .bss:未初始化的全局变量和静态变量
二、编译过程需要哪些工具,分别什么作用?
(一)预处理器:处理c语言中#相关代码
(二)编译器:将c语言转为汇编语言
(三)汇编器:将汇编语言转换为目标文件(前三个独立进行)
(四)链接器:将所有目标文件链接为led.elf(可执行可链接文件)文件(通过链接脚本链接起来)
(五)目标文件格式转换:将led.elf转换成不带额外信息的二进制指令集
(六)其他辅助工具
1.反汇编目标文件:将elf反汇编为汇编文件
2.GNU调式器:可用于单步代码调式
三、进阶Makefile
(一)bsp文件编写格式
1.bsp文件:存放功能文件
2.imx6ull:存放imx6ull函数库文件
3.project:启动函数、主函数
4.脚本文件
5.Makefile
四、beep
(一)原理图
(二)工作原理:三极管基极电压低于发射极时三极管导通
(三)实验步骤
1.iomuxc配置:因为每个引脚都有对应的iomuxc所以必须配置iomuxc,这里选择iomuxc_snvs中的temper1_gpio5_io01,即寄存器内容全部置0
2.电器特性配置:IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,配置为0x10B0
3.GPIO5组的GDIR配置:因为是GPIO5_IO01所以给他置1,使其为输出模式
4.GPIO5组的DR配置:因为是GPIO5_IO01,所以通过配置此引脚为高低电平来控制开关