【STM32】【rt-thread】C函数调用

devtools/2024/12/23 2:26:57/

C函数调用

  • 一、基本概念
  • 二、函数调用
    • 2.1 函数调用
    • 2.2 参数传递
    • 2.3 栈帧创建
      • 2.3.1 保存旧FP
      • 2.3.2 更新FP和SP
      • 2.3.3 保存调用者状态
  • 三、函数执行
    • 3.1 局部变量分配
    • 3.2 执行代码
  • 四、返回过程
    • 4.1 返回值
    • 4.2 恢复栈帧
      • 4.2.1 恢复FP
      • 4.2.2 恢复SP
  • 4.3 返回地址
  • 五、继续执行
  • 六、参考

一、基本概念

在函数调用中,r0-r4被用来传递参数或返回值。在子函数调用中,被用来存放临时数据。
r4-r8,r10,r11被用来存放函数局部变量。
子程序必须保留寄存器r4-r8、r10、r11和SP的内容。
在所有程序中r12-r15是特点寄存器,分别是IP(The Intra-Procedure-call scratch register),SP(The Stack Pointer),LR(The Link Register)和PC(The Program Counter)。
CPSR是全局寄存器。

二、函数调用

2.1 函数调用

返回地址存放在LR寄存器中;将目标地址存放到PC寄存器实现跳转。LR寄存器的0位值是1表示Thumb,0表示Arm。

2.2 参数传递

使用r0-r4及栈传递参数。参数较多少才使用栈传递参数。

2.3 栈帧创建

2.3.1 保存旧FP

  • 在调用函数之前,如果需要,会保存当前帧指针(FP,通常是R11)到栈上,确保调用者栈帧的完整性。

2.3.2 更新FP和SP

  • 通过将栈指针(SP)的值赋给帧指针(FP),然后调整SP以为局部变量和可能的额外参数分配空间。这形成了一个新的栈帧。

2.3.3 保存调用者状态

  • 在某些情况下,可能会保存LR(链接寄存器,用于保存返回地址)和其他可能受影响的寄存器到栈上,确保函数调用后的恢复。

三、函数执行

3.1 局部变量分配

函数内部的局部变量空间在栈上分配,栈指针SP会相应调整。

3.2 执行代码

函数执行其指定的逻辑,可能包括对其他函数的调用。

四、返回过程

4.1 返回值

返回时使用r0-r4传递返回值。对于多返回值或复杂类型,需要其他机制。

4.2 恢复栈帧

4.2.1 恢复FP

如果改变了FP,函数在返回前会将FP指向的地址(即上一层函数的栈帧底部)赋给FP,恢复调用者的栈帧指针。

4.2.2 恢复SP

调整SP以释放当前函数的栈帧空间,回到调用者函数的栈状态。

4.3 返回地址

通过LR寄存器中的值来实现返回,LR在函数调用时被自动设置为下一条指令的地址(通过BL指令自动完成,或者在手动管理栈时显式保存)。执行BX LR或BLX LR指令,根据Thumb/ARM状态切换,跳转到LR寄存器保存的地址,从而返回到调用者。

五、继续执行

控制权回到调用函数,从调用点的下一条指令开始执行。

六、参考

Procedure Call Standard for the Arm® Architecture


http://www.ppmy.cn/devtools/119785.html

相关文章

SpringBoot整合JPA详解

SpringBoot版本是2.0以上(2.6.13) JDK是1.8 一、依赖 <dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--…

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…

【含文档】基于Springboot+微信小程序 的高校社团管理小程序(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩 1 穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;返回空值&#xff09;&#xff08;互斥锁&#xff09;&#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 2 击穿&#xff1a;一个或多个热…

二维环境下的TDOA测距定位的MATLAB代码,带中文注释

TDOA测距定位程序介绍 概述 本MATLAB程序实现了基于时间差到达&#xff08;TDOA&#xff09;技术的二维测距定位&#xff0c;能够处理4个或任意数量&#xff08;大于3个&#xff09;的锚节点。在无线定位和导航系统中&#xff0c;TDOA是一种常用的定位方法&#xff0c;通过测量…

深度学习500问——Chapter17:模型压缩及移动端部署(2)

文章目录 17.4.6 低秩分解 17.4.7 总体压缩效果评价指标有哪些 17.4.8 几种轻量化网络结构对比 17.4.9 网络压缩未来研究方向有哪些 17.5 目前有哪些深度学习模型优化加速方法 17.5.1 模型优化加速方法 17.5.2 TensorRT加速原理 17.5.3 TensorRT如何优化重构模型 17.5.4 Tensor…

第七章 Redis常用五大数据类型之ZSet

目录 一、介绍 二、常用命令 2.1. zadd 2.2. zrange 2.3. zrangebyscore 2.4. zrevrangebyscore 2.5. zincrby 2.6. zrem 2.7. zcount 2.8. zrank 一、介绍 Redis有序集合ZSet与普通集合Set非常相似&#xff0c;是一个没有重复元素的字符串集合。不同之处是有序…

【无标题】logistic映射

当Logistic映射中的控制参数 μ \mu μ 为负数时&#xff0c;系统的行为与正数 μ \mu μ 的情况截然不同。Logistic映射的一般形式是&#xff1a; x ( t 1 ) μ x ( t ) ( 1 − x ( t ) ) x(t1) \mu x(t) (1 - x(t)) x(t1)μx(t)(1−x(t))其中 x ( t ) x(t) x(t) 表示时…