【散文诗】单片机程序基础

目录

  • 一、压栈、出栈
  • 二、函数调用
  • 三、中断响应
  • 四、回调函数和函数调用的区别
  • 五、回调函数和中断函数的区别

一、压栈、出栈

在单片机中,通常使用堆栈(或称为栈)来保存程序执行时的现场信息。堆栈是一种数据结构,在内存中按照“先进后出”的顺序进行操作。当程序执行到一个函数调用时,它会将当前的指令地址和寄存器等现场信息保存到堆栈中,并跳转到函数的入口处继续执行。当函数执行结束后,它会从堆栈中取回之前保存的现场信息,恢复程序执行的状态。

当发生函数调用、中断处理、缓冲区溢出、递归函数时会进行压栈,结束时会进行出栈。


二、函数调用

函数调用流程:保存现场 --> 函数调用 --> 执行函数 --> 返回结果 --> 恢复现场

保存现场后,进行函数调用时,以下内容依次会被保存到堆栈中:

  1. 函数返回地址:将下一条指令地址压入堆栈,以便在子程序执行完毕后能够正常返回。
  2. 函数参数:将调用函数时传递的参数压入堆栈中,参数从右往左按顺序排列。
  3. 执行环境信息:函数内部定义的局部变量、临时变量、寄存器状态等信息。

执行完后函数的返回值讲存放到之前预留的位置上,并恢复现场,恢复原来的指令地址和执行状态。


三、中断响应

在执行主程序时,突然接收到一个中断信号后,立即暂停当前的任务,转而去处理该中断信号所对应的中断服务函数任务。

 每个外设都有一个或多个中断请求引脚(IRQ),每个IRQ又对应一个特定的中断服务函数(ISR),当外设需要向CPU发出请求时,就改变IRQ引脚的电平状态。此时,在单片机中断系统硬件的支持下,CPU会立即停下来执行相对应的中断服务函数,以处理该中断请求。


四、回调函数和函数调用的区别

  • 回调函数:一般作为参数传入到其他函数中,在特定条件下被执行。如在主程序中传递一个函数指针,并且由另一个函数或事件触发后异步执行该函数。
  • 函数调用:在主程序中直接调用一个函数,,一般由程序员直接调用,并且在一般情况下,是同步的,也就是说,当函数被调用后,在该函数执行完毕前,程序会一直等待。

 回调函数的可重用性很高,因为它们不依赖于任何具体的环境。相反,普通的函数可能会涉及到环境变量和局部变量等问题。


五、回调函数和中断函数的区别

  • 回调函数:在程序中以普通函数的形式定义,并且可以在任何时候被调用。当回调函数作为参数传递至其他函数或事件处理器时,它既可以同步执行也可以异步执行。
  • 中断函数:由硬件或操作系统发起的一种机制,在特定的事件(例如外部设备请求、错误、时钟等)发生时被自动触发。中断函数通常需要快速响应,立即执行,并尽可能地短暂运行,因此其实现上有着很多限制。

 虽然回调函数和中断函数都是在事件发生时被调用的,但由于回调函数是普通的程序代码而非由硬件或操作系统直接触发,因此其实现上更加灵活和可控。

你可能感兴趣的:(单片机,c语言)