Cortex-M7——函数及中断异常调用过程

本文详细介绍了ARMv8架构下函数调用的过程,包括参数传递、栈的使用以及函数返回时的操作。同时,也阐述了中断异常调用时的硬件自动压栈机制,包括压栈顺序、中断返回后的处理。通过实例和栈结构图,清晰地展示了函数调用和中断异常处理的关键步骤。

Cortex-M7——函数及中断异常调用过程

小狼@http://blog.youkuaiyun.com/xiaolangyangyang


一、函数调用过程

ARMv8架构下,函数参数是通过R0~R4寄存器传递的,如果参数超过4个,就要借助于栈进行参数传递。

int func(int a1, int a2, int a3, int a4, int a5, int a6)
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}
 
void main(void)
{
	func(1, 2, 3, 4, 5, 6);
}

main()函数的汇编如下:

movs    r2, #0x6            ; 参数赋值,用于压栈
movs    r3, #0x5            ; 参数赋值,用于压栈
sub     sp, sp, #0x0C       ; 预留栈空间给参数
str     r2, [sp, #0x4]      ; 参数保存到栈
str     r3, [sp]            ; 参数保存到栈
movs    r2, #0x3            ; 参数赋值给r3
movs    r3, #0x4            ; 参数赋值给r2
movs    r1, #0x2            ; 参数赋值给r1
movs    r0, #0x1            ; 参数赋值给r0
bl      0x80A278            ; 调用func

func()函数的汇编如下:

push    {r4-r5, lr}         ; 函数用到r4/r5,将原值压栈,lr压栈
ldr     r4, [sp, #0x8]      ; 将栈保存的参数赋
### Cortex-M7 处理器中断处理机制及配置方法 #### 中断控制器 (NVIC) Cortex-M7 配备了一个嵌套向量中断控制器(NVIC),用于管理和优先级分配多个中断源。NVIC 支持多达 240 个可编程优先级的外部中断线,允许灵活配置不同外设和事件触发的响应顺序[^1]。 #### 中断优先级分组 为了实现更精细的控制,Cortex-M7 提供了中断优先级分组功能。通过设置 `AIRCR` 寄存器中的 PRIGROUP 字段可以调整抢占式优先级(preemptive priority) 和子优先级(subpriority) 的位宽分布。这种设计使得系统能够更好地平衡实时性和资源利用率。 #### 向量表重定位 默认情况下,向量表位于闪存起始地址处;然而,在某些应用场景下可能需要动态改变其位置。为此,可以通过修改 `VTOR` (Vector Table Offset Register)来指定新的基址,从而支持更加复杂的应用需求如多任务调度或安全分区隔离。 #### 软件触发中断 除了硬件产生的中断请求之外,软件也可以主动发起特定编号的异常调用(SWI, Software Interrupt Instruction),这为调试工具以及操作系统内核提供了便利接口。 ```c // 设置全局中断使能 __enable_irq(); // 清除某个具体IRQ通道上的挂起状态 NVIC_ClearPendingIRQ(USART1_IRQn); // 设置某类IRQ对应的回调函数指针 void (* const usart1_handler)(void); usart1_handler = USART1_IRQHandler; // 安装并启用该IRQ通道 NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0)); NVIC_EnableIRQ(USART1_IRQn); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值