嵌入式软件开发中最容易被忽视的过程之一是微控制器引导过程。原因是硅工具链已经变得非常善于提供和抽象引导过程,因此嵌入式开发人员通常不会考虑它。不幸的是,这可能导致对微控制器如何启动、如何初始化以及最终如何找到自己熟悉的主要功能缺乏了解。本文将探讨引导过程,并阐明幕后发生了什么。
微控制器启动过程从简单地给系统通电开始。一旦电压轨稳定下来,微控制器就会在复位向量中查找flash中可以找到启动指令的位置。复位向量是闪存映射中的一个特殊位置。
微控制器加载存储在复位向量中的地址,然后CPU加载并执行其中包含的指令。这些最初的指令并不是开发人员创建的main的开始。相反,这些是关于如何启动微控制器的说明。
通常发生的第一件事是将存储在flash中的向量表复制到RAM中。它们被复制到创建可执行程序时在链接器文件中指定的位置。将向量表复制到RAM的一个原因是从RAM执行比从flash执行更快。这有助于减少系统中任何中断调用的延迟。根据微控制器的特定架构,可能会有更新向量表寄存器的指令,以便微控制器知道RAM表的起始位置。
接下来嵌入式开发人员将初始化的数据部分复制到 RAM 中,这通常是存储在链接器的 .data 部分中的变量。 初始化数据的示例是静态、全局和静态局部变量,这些变量在编译时提供了初始化值,这些是显式定义,例如 int Var = 0x32;。
在复制数据部分之后,还会复制 .bss 部分。 .bss 部分包含未显式初始化或已初始化为零值的变量。 一个简单的例子就是变量 static int Var; 将包含在本节中。
最后,微控制器会将任何RAM功能从闪存复制到RAM。同样,由于执行速度稍快,有时从RAM而不是从flash执行某些功能是值得的。这些函数通常由开发人员决定,并在编译程序之前特意放在链接器文件中。
这整个过程通常被称为“C Copy Down”。 如果不执行此复制,将无法正确设置 C 环境以执行程序。 通常,一旦完成复制,微控制器就会跳转到开发人员应用程序开始的主程序的开始。
微控制器引导过程实际上相对简单。虽然它经常是用汇编语言或其他一些晦涩难懂的方式编写的,因此嵌入式开发人员很难清楚地理解微控制器实际上是如何进入main的。相反,它看起来像一个非常复杂且几乎不可知的过程,这使得引导代码的定制开发成为一个潜在的痛苦过程。
发表评论 取消回复