2026/4/18 12:27:05
网站建设
项目流程
网站建设公众号管理,公司名字大全两个字,wordpress 回复后查看,怎么提高百度搜索排名ARM 裸机开发学习知识体系第一阶段#xff1a;环境搭建与工具链认知交叉编译工具链安装与配置安装 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf。配置环境变量#xff08;修改 .bashrc 文件#xff09;。验证安装#xff08;arm-linux-gnueabihf-gcc -v#xff…ARM 裸机开发学习知识体系第一阶段环境搭建与工具链认知交叉编译工具链安装与配置安装gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf。配置环境变量修改.bashrc文件。验证安装arm-linux-gnueabihf-gcc -v。代码传输与烧录在 Ubuntu 上配置 FTP 服务 (vsftpd)。使用 Windows 下的FileZilla Client工具上传代码到 Ubuntu 开发机。使用imxdownload工具将生成的.bin文件烧录到 SD 卡 (/dev/sdb)。开发板启动方式了解 i.MX6ULL-Mini 开发板的多种启动模式SD卡、eMMC、NAND Flash、USB。通过拨码开关选择从 SD 卡启动。GNU 工具链详解编译器 (arm-linux-gnueabihf-gcc): 将源代码.S,.c编译成目标文件.o。链接器 (arm-linux-gnueabihf-ld): 将一个或多个目标文件链接成可执行文件.elf并根据链接脚本分配地址。格式转换器 (arm-linux-gnueabihf-objcopy): 将.elf文件转换为纯二进制格式.bin用于烧录。反汇编器 (arm-linux-gnueabihf-objdump): 将.elf文件反汇编成人类可读的汇编代码用于调试和分析。Makefile 自动化构建理解 Makefile 的三要素目标、依赖、规则。编写规则来自动化执行编译、链接、格式转换、反汇编等步骤。使用变量如CC,LD简化和优化 Makefile。定义伪目标如clean,load来执行清理和烧录操作。第二阶段ARM 汇编语言基础汇编程序结构与伪操作AREA: 定义代码段或数据段。CODE32/THUMB: 指定指令集32位 ARM 或 16位 Thumb。ENTRY: 定义程序入口点。END: 标记汇编源文件结束。.global _start: 声明全局符号_start作为程序入口。核心数据处理指令MOV: 数据传送指令。理解立即数12位立即数的判断标准、寄存器寻址、移位操作LSL, LSR, ASR, ROR, RRX。ADD/SUB: 加法/减法指令。MVN: 按位取反传送指令。BIC: 位清零指令AND NOT。ORR: 逻辑或指令用于置位。内存访问指令 (Load/Store)LDR: 从内存加载数据到寄存器。掌握多种寻址方式立即数偏移、寄存器偏移、前/后索引等。STR: 将寄存器数据存储到内存。程序状态寄存器 (CPSR) 与条件执行CPSR 标志位:N(Negative): 结果为负。Z(Zero): 结果为零。C(Carry): 无符号运算产生进位或借位。V(oVerflow): 有符号运算溢出。CMP: 比较指令实质是做减法但不保存结果只更新 CPSR 标志位。利用条件码如EQ,NE,GT,LT等实现条件执行。程序流控制指令B: 无条件或条件分支跳转。BL: 带返回的分支跳转将下一条指令地址存入LR。BX: 间接跳转并可切换指令集状态ARM/Thumb。ARM 处理器工作模式7 种基本模式: User, FIQ, IRQ, Supervisor (SVC), Abort, Undef, System。Cortex-A 特有模式: Monitor (安全扩展)。模式切换: 通过修改 CPSR 寄存器的 M[4:0] 位域。MRS: 读取 CPSR 到通用寄存器。MSR: 将通用寄存器的值写入 CPSR。CPS 指令: 快速开关中断和切换模式如cpsid i,cpsie i,cps #mode。异常向量表处理器复位后从固定地址通常是0x0开始执行。异常向量表包含各种异常复位、未定义指令、SWI、预取中止、数据中止、IRQ、FIQ的入口地址。软中断 (SWI): 用于在用户模式下请求内核服务系统调用。第三阶段函数调用与栈管理函数调用机制PC 与 LR:BL指令将返回地址存入LR(R14)函数通过BX LR或MOV PC, LR返回。寄存器传参: ARM AAPCS 规约规定前 4 个参数通过R0-R3传递返回值通过R0返回。栈 (Stack) 的概念与类型满栈 (Full Stack): 栈指针指向最后一个有效数据项。空栈 (Empty Stack): 栈指针指向下一个要放入数据的位置。增栈 (Ascending): 栈向高地址增长。减栈 (Descending): 栈向低地址增长。ARM 采用:满减栈 (Full Descending Stack)。栈指针初始化使用LDR SP, 0x40001000初始化栈顶指针SP, R13。保护与恢复现场 (压栈/弹栈)STMFD (Store Multiple Full Descending):STMFD SP!, {寄存器列表}。将寄存器列表中的值压入栈并更新 SP。LDMFD (Load Multiple Full Descending):LDMFD SP!, {寄存器列表}。从栈中弹出值到寄存器列表并更新 SP。主调函数职责: 在调用子函数前后负责保存和恢复自己需要使用的寄存器包括LR。栈对齐问题PRES8 伪指令: 确保栈指针在函数调用时保持 8 字节对齐以满足某些 ABI 要求避免链接错误。混合编程 (C 与汇编互调)汇编调用 C 函数:在汇编中使用IMPORT c_func_name声明。按规约准备参数R0-R3。使用BL c_func_name调用。从R0获取返回值。C 调用汇编函数:在汇编中使用EXPORT asm_func_name导出函数。在 C 中使用extern声明该函数原型。像调用普通 C 函数一样调用它。第四阶段启动代码与 C 语言运行环境搭建启动代码的核心任务初始化异常向量表。为各处理器模式SVC, IRQ, FIQ, ABT, UND设置独立的栈指针。初始化.bss和COMMON段清零。可选关闭看门狗、初始化时钟、DDR 等。设置处理器为User或SVC模式。跳转到 C 语言的main()函数。链接脚本 (Linker Script)作用: 为链接器提供内存布局蓝图精确控制各段.text,.rodata,.data,.bss在内存中的位置。关键语法:SECTIONS { ... }: 定义输出段。. 0x87800000;: 设置当前链接地址Location Counter。*(.text): 收集所有输入文件的.text段。*(.rodata*): 使用通配符收集所有以.rodata开头的段如.rodata.str1.1。__bss_start .; ... __bss_end .;: 定义符号标记.bss段的起始和结束地址供启动代码用于清零。内存段 (Memory Segments) 详解.text: 代码段存放程序的机器指令。.rodata: 只读数据段。存放字符串常量、const全局变量、跳转表等。运行时不可写。.data: 已初始化数据段。存放初始化为非零值的全局/静态变量。程序镜像中包含其初始值。.bss: 未初始化数据段。存放初始化为0或未显式初始化的静态/全局变量。程序镜像中不占空间运行时由启动代码清零。COMMON: 未初始化的非静态全局变量。在链接时才确定大小和位置最终通常与.bss合并。第五阶段i.MX6ULL 裸机外设驱动开发硬件抽象与寄存器访问volatile关键字: 告诉编译器不要优化对该变量的访问因为其值可能被硬件异步修改。直接地址映射:#define GPIO1_DR *((volatile unsigned int *)0x0209C000)。结构体映射: 将外设寄存器组定义为结构体提高代码可读性和可维护性。c编辑struct GPIO_t { unsigned int DR; unsigned int GDIR; // ... other registers }; #define GPIO1 (*((struct GPIO_t *)0x0209C000))SDK (Software Development Kit) 的使用主要利用 NXP 提供的头文件如MCIMX6Y2.h,fsl_common.h,fsl_iomuxc.h。使用 SDK 封装好的 API如IOMUXC_SetPinMux,IOMUXC_SetPinConfig进行引脚复用和电气属性配置。GPIO 驱动开发流程 (以 LED 为例)时钟使能: 配置CCM(Clock Control Module) 寄存器打开对应外设的时钟门控。引脚复用 (IOMUX): 配置IOMUXC_SW_MUX_CTL_PAD_xxx寄存器将引脚功能设置为 GPIO。电气属性配置: 配置IOMUXC_SW_PAD_CTL_PAD_xxx寄存器设置驱动能力、上下拉等。GPIO 方向设置: 配置GPIOx_GDIR寄存器设置为输出模式。GPIO 数据操作: 通过GPIOx_DR寄存器进行置位开灯、清零关灯或异或翻转操作。BSP (Board Support Package) 工程管理分层架构:project/: 存放main.c,start.S等主程序文件。imx6ull/: 存放 SoC 相关的官方头文件。bsp/: 存放板级外设驱动模块如led.c/h,beep.c/h。优点: 模块化、可重用、易于维护。蜂鸣器 (BEEP) 驱动原理通过 GPIO 控制 PNP 三极管如 S8550的基极从而控制蜂鸣器的通断。高电平导通蜂鸣器响。