在Cortex-A 的架构中一共有9种处理模式,如下表所示:
CPSR(Current Program Status Register)用于存储当前程序的状态信息。它包含了处理器模式、条件标志、中断屏蔽位等信息。
CPSR 寄存器结构
CPSR 是一个 32 位的寄存器,其各个位的含义如下:
模式位
模式位用于设置处理器的工作模式,常见的模式及其对应的值如下:
MRS 指令
MRS(Move Register from Special register)指令用于将特殊寄存器(如 CPSR 或 SPSR)的值移动到通用寄存器中。常用于读取当前程序状态寄存器(CPSR)或保存程序状态寄存器(SPSR)的值。
MSR 指令
MSR(Move Special register from Register)指令用于将通用寄存器的值移动到特殊寄存器中。常用于修改 CPSR 或 SPSR 的值。
在 ARM 处理器中,SP(Stack Pointer)指针用于指向当前栈的顶部。设置 SP 指针通常用于初始化栈或切换栈。以下是一些常见的设置 SP 指针的方法:
设置 SP 指针
可以使用 指令将一个值加载到 SP 寄存器中,以设置栈指针的位置。
示例
保存和恢复 SP 指针
在某些情况下,可能需要保存当前的 SP 指针值,并在稍后恢复它。可以使用通用寄存器来保存和恢复 SP 指针。
示例
SP可以指向内部RAM,也可以指向DDR内存。 对于512M的DDR来说,内存范围是 0x~0x9FFFFFFF,栈大小一般设置为2M,由于A7栈是向下增长的,可以将SP设置为 0x。
一般跳到 main 函数,下面是一个示例:
上面的 Makefile 直接编译的话,会出现 0x 地址放的不是 _start 函数,而是 main 函数。为了确保 0x,需要使用链接脚本 。
链接脚本(linker script)是用于控制链接器(如 )如何将目标文件(object files)链接成可执行文件的脚本,链接脚本通常以 为扩展名,主要有以下作用:
- 定义内存布局:指定程序各个段(如 、、)在内存中的位置。
- 设置入口点:指定程序的入口点,即程序开始执行的地址。
- 分配段:将目标文件中的段分配到内存中的特定位置。
- 定义符号:可以定义一些符号,用于在程序中引用特定的内存地址。
以下是本示例使用的链接脚本文件 :
本次实验使用的链接脚本 文件:
定位计数器
.text
.rodata 段
只读数据段,如字符串变量,使用const关键字定义的全局或静态变量。
定义 .rodata 段,并将其对齐到 4 字节边界。定位计数器会更新为 .text 段结束后的地址,并对齐到 4 字节。
其中前面一个* 表示匹配所有的输入文件,
(.rodata*)表示匹配所有以.rodata 开头的段,如 .rodata,rodata1,.rodata2。
.data数据段
定义 .data 段,并将其对齐到 4 字节边界。定位计数器会更新为 .rodata 段结束后的地址,并对齐到 4 字节。
.bss段
记录 .bss 段的起始地址为 __bss_start,然后定义 .bss 段,并将其对齐到 4 字节边界。定位计数器会更新为 .data 段结束后的地址,并对齐到 4 字节。最后,记录 .bss 段的结束地址为 __bss_end。
*(.bss):匹配所有输入文件中的 .bss 段,并将其内容放入输出文件的 .bss 段中。在输入文件中,未初始化的全局变量和静态变量会被放入 .bss 段。 这些变量在编译时会被放入 .bss 段,并在程序启动时被初始化为零。
按第3课操作,将程序烧写到SD卡,可以看到LED1在闪烁。
本文代码开源地址:
https://gitee.com/xundh/learn_i.mx6u.git
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/71332.html