20250925的学习笔记
一、链接脚本
1.作用
链接主要在链接阶段,为连接器提供蓝图;
2.常用段一览
段名 | 全称/别名 | 存放的数据类型 | 运行时所在存储器 |
.text | 代码段 | 机器指令、只读常量(const) | Flash / ROM |
.rodata | 只读数据 | 字符串字面量、const 数组、跳转表 | Flash / ROM |
.data | 已初始化可写数据 | 全局/静态变量且 初值非 0 | 上电后必须拷贝到 RAM |
.bss | Block Started by Symbol | 全局/静态变量且 初值 0 或未初始化 | 上电后清零,不占文件空间 |
.heap | 堆 | malloc / new 所用区域 | RAM(由 _end 向上长) |
.stack | 主栈 | 启动文件里 ldr sp, =0x8xxxxxxx 所指区域 | RAM(向下长) |
二、裸机ARM可执行文件的编译
1.过程
源码->汇编器->目标文件->链接器->ELF->格式转换->BIN/HEX
2.表格
工具名(arm-linux-gnueabihf-*) | 输入 | 输出 | 核心作用 |
gcc(交叉) | .c .S | .o | 预处理器 + 编译器 + 汇编器三合一:把 C/汇编变成 可重定位目标文件 |
ld | .o .lds | .elf | 按链接脚本把多个 .o 合并、重定位、生成 可执行 ELF |
objcopy | .elf | .bin .hex | 去掉 ELF 头、调试段,留下纯二进制/Intel HEX,供烧录 |
objdump | .elf | .dis .map | 反汇编、查看段布局、调试符号,人眼调试器 |
3.流程图
三、裸机点亮一颗LED(以i.MX6ULL为例)
1.查原理图
确认LED挂在哪个GPIO(例如GPIO3_IO03→引脚名GPIO_3)。
2.查芯片手册
①找到引脚MUX寄存器地址(IOMUXC_SW_MUX_CTL_PAD_GPIO3_IO03=0x020E_0068)
②找到PAD寄存器地址(IOMUXC_SW_PAD_CTL_PAD_GPIO3_IO03=0x020E_02F4)
③找到GPIO外设基址(GPIO3 base=0x0209_C000)
记下 DR、GDIR、PSR 偏移。
3.复用功能(MUX)
把MUX寄存器设为ALT5(GPIO功能),其余ALT码全部禁用。
4.电气特性(PAD)
配置驱动强度、上下拉、压摆率(DSE、PUS、SRE),保证电流够用且EMI达标。
5.方向寄存器(GDIR)
对应bit 置1→设为输出。
6.数据寄存器(DR)
写0/1让引脚输出低/高;LED常见接法"低电平点亮",所以DR bit=0→亮;DR bit= 1→灭。
7.循环翻转
死循环里置位/清位+延时→人眼看到闪烁。