gzyueqian
13352868059

嵌入式开发:嵌入式系统编程—函数和堆栈

更新时间: 2022-12-11 09:08:53来源: 粤嵌教育浏览量:6589

  在嵌入式开发中,你查看过堆栈内存,观察过当一个函数被调用并且稍后返回时到底发生了什么吗?

  C语言中的函数(以及其他编程语言中的过程、子例程或子程序)是计算机科学中最伟大的发明,它使程序比任何编程语言的任何其他特性都更容易理解。

  函数保持代码DRY

  创建函数的一个明显原因是避免重复代码,也称为DRY(不要重复自己)原则。你可以通过分离一段代码并提供一个接口来实现这一点,该接口允许你从程序中的不同位置输入(调用)代码。当然,你需要编程语言支持来建立这样的接口以及从函数调用和返回的机制。

  

  堆栈的关键作用

  对函数和返回的简单调用似乎足够简单。返回地址可以存储在寄存器中,例如ARM Cortex-M中的LR(链接寄存器)。但是在嵌入式开发中当被调用的函数调用另一个函数时,事情就变得复杂了。一个LR寄存器不能“记住”两个返回地址。解决方案是将所有这样的嵌套返回地址存储在内存中——存储在一个称为堆栈的数据结构中。堆栈可以保存返回地址和函数内部使用的局部变量。

  函数调用堆栈的一个很好的比喻是一堆菜,你可以在堆栈的当前顶部添加或删除菜。为了支持这样的数据结构,CPU只需要记住堆栈的当前顶部,在ARM Cortex-M中,这是SP(堆栈指针)寄存器的工作。

  开销函数

  ARM Cortex-M处理器上的开销函数销非常低。调用本身是一条BL指令,而返回是一条BX LR指令。除此之外,还要准备函数参数,这些参数在寄存器R0-R3中传递。

  结束注释

  函数非常重要,不仅是为了避免重复,而且是降低复杂性的主要机制,因为你可以关注正在做的事情,而不是如何做。此外,在嵌入式开发中,在底层理解函数调用/返回机制和堆栈是通向其他关键概念的途径,如中断、RTOS(实时操作系统)中的上下文切换和单独编译。

免费预约试听课