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

news/2024/12/22 10:56:29/

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/news/1534526.html

相关文章

Spring Boot 3.x 集成 Feign

在Spring Boot 3.x中集成Feign,可以大大简化微服务之间的HTTP调用。以下是关于Spring Boot 3.x集成Feign的详细步骤和说明: 一、Feign简介 Feign是一个声明式的HTTP客户端,它使得编写Web服务客户端变得更加简单。使用Feign,可以通…

【Linux系统编程】第二十七弹---文件描述符与重定向:fd奥秘、dup2应用与Shell重定向实战

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、文件描述符fd 1.1、0 & 1 & 2 1.2、文件描述符的分配规则 2、重定向 3、使用 dup2 系统调用 3.1、> 输出…

Ubuntu2404安装

Ubuntu是一款非常优秀的发行版本,起初她的优势主要在于桌面版,但是随着Centos 从服务版的支持的退出,Ubuntu server也在迅猛的成长,并且不断收获了用户,拥有了一大批忠实的粉丝。好了,废话不多说&#xff0…

C++学习笔记----8、掌握类与对象(二)---- 成员函数的更多知识(3)

3.3、引用验证的成员函数 通常的成员函数可以被非临时和临时的类实例调用。假设你有如下的类只是记住了string作为参数传递给了构造函数: class TextHolder { public:explicit TextHolder(string text) : m_text { move(text) } {}const string& getText() con…

Android 开启相机一键拍照,一键录制

一键拍照: Intent intent new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { context.startActivity(intent); …

Edge SCDN:安全与速度并进的解决方案

在当今数字化时代,网络速度与安全成为企业不可忽视的双刃剑。Edge SCDN(边缘安全加速)正重新定义着内容分发与安全防护的边界,它不仅优化了内容传输的速度,还强化了网络的安全防护能力,为企业构建了一个既快…

Django Web开发接口定义

Django Web 介绍 Django Web是一个Pyhton高级 Web 框架,实际上 Django 也可以做到前后端分离,即主要作为后端框架使用,不用模板渲染也是可行的。 Django Web 应用的运行流程,如下图所示: 此外,Django Web 在开发环境可以通过自带的服务器进行本地调试。但是该服务器不适…

【Android】【bug】ImageView设置scaleType不生效的问题

问题 在设置ImageView的时候&#xff0c;添加了一张图片&#xff0c;图片是正方形的&#xff0c;但是图片要尽可能的占据控件&#xff0c;同时也要保证图片是不能变形的。 然后在图片里面使用了这个scaleType <ImageViewandroid:id"id/iv_luopan"android:layout…