1.链接脚本的作用?各个段存放什么类型数据
作用:
是控制程序转换成二进制格式时的蓝图,通过自定义内存布局,段的组织,符号信息等,确保程序能在特定硬件中正确加载和运行,实现硬件适配
例如:
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.bss段
存放未初始化或初始化为0的数据
2.COMMON段
用于存放未初始化的非静态全局变量
3.data段
用于存放已初始化的全局变量或静态变量,非0值
4.rodata段
用于存放只读的数据(如字符常量,const修饰的变量),运行时受到保护,不可修改
2.编译过程需要哪些工具,分别什么作用?
交叉编译器工具链 (arm-linux-gnueabihf-)这是针对 ARM 架构的交叉编译工具链,用于在 x86 等主机平台上编译能在 ARM 架构设备上运行的程序。
gcc (交叉编译版本:arm-linux-gnueabihf-gcc)
作用:C 语言编译器
在这里负责将 C 源代码 (.c) 和汇编源代码 (.S) 编译为目标文件 (.o)
使用了-Wall(显示所有警告)、-nostdlib(不链接标准库)、-c(只编译不链接)等选项
ld (交叉编译版本:arm-linux-gnueabihf-ld)
作用:链接器
负责将所有目标文件 (.o) 链接成可执行的 ELF 格式文件 (.elf)
通过-Timx6ull.lds指定链接脚本,控制链接过程和内存布局
objcopy (交叉编译版本:arm-linux-gnueabihf-objcopy)
作用:目标文件转换工具
在这里将 ELF 格式的可执行文件 (.elf) 转换为二进制文件 (.bin)
使用-O binary指定输出格式为二进制,-S移除符号表和重定位信息,-g移除调试信息
objdump (交叉编译版本:arm-linux-gnueabihf-objdump)
作用:目标文件反汇编工具
用于将 ELF 格式文件反汇编,生成汇编代码文本文件 (.dis)
通过-D选项对所有段进行反汇编,方便调试和分析
这些工具共同完成了从源代码到可在 ARM 设备上运行的二进制文件的完整编译流程:源代码编译→目标文件链接→格式转换→反汇编分析。
3.led点灯程序需要进行哪些步骤?
一:写启动代码:
在start.S中
包括
1.异常向量表的初始化
2.异常处理函数
3.对需要使用的模式的栈指针的初始化
4.切换到初始模式(一般是user/system模式)
二:写对应函数
包括
1.led初始化
包括:
时钟配置
复用功能寄存器配置
电气配置
输入输出模式配置
2.打开led
对对应的引脚输入能亮灯的电平,即对该引脚赋值0或1
3.关闭led
对对应的引脚输入不能亮灯的电平,即对该引脚赋值0或1
4.led闪烁
对该引脚上的值进行异或操作
5.led的延时
普通延时,通过循坏执行--来延时