嵌入式系统中的代码执行

inq*_*ive 9 c embedded microcontroller

我在嵌入式系统域工作.我想知道从C文件开始如何从微控制器执行代码(uC通常不需要是主观的).此外,我想知道像启动代码,目标文件等的东西.我找不到有关上述内容的任何在线文档.如果可能,请提供从头开始解释这些事情的链接.在此先感谢您的帮助

syb*_*eon 39

作为一名微处理器架构师,我有机会以非常低的水平为软件工作.基本上,低级嵌入式与仅在硬件特定级别的通用PC编程非常不同.

低级嵌入式软件可分为以下几种:

  1. 重置向量 - 通常用汇编语言编写.这是在启动时运行的第一件事,可以被视为特定于硬件的代码.它通常会执行简单的功能,例如通过配置寄存器等将处理器设置为预定义的稳定状态.然后它将跳转到启动代码.最基本的复位向量只是直接跳转到启动代码.
  2. 启动代码 - 这是第一个运行的特定于软件的代码.它的工作基本上是设置软件环境,以便C代码可以运行在顶层.例如,C代码假定存在一个定义为堆栈和堆的内存区域.这些通常是软件构造而不是硬件.因此,这段启动代码将定义堆栈指针和堆指针等.这通常归入" c-runtime ".对于C++代码,也会调用构造函数.在例程结束时,它将执行main().编辑:需要初始化的变量以及需要清除的某些内存部分在此处完成.基本上,将事物转变为"已知状态"所需的一切.
  3. 应用程序代码 - 这是从main()函数开始的实际C应用程序.正如您所看到的,即使在调用第一个主函数之前,很多事情实际上都在发生.如果有一个好的硬件抽象层,这个代码通常可以写成与硬件无关的代码.应用程序代码肯定会使用很多库函数.这些库通常在嵌入式系统中静态链接.
  4. - 这些是提供原始C函数的标准C库.还有一些特定于处理器的库可以实现软件浮点支持等功能.还可以使用特定于硬件的库来访问I/O设备,例如stdin/stdout.一些常见的C库是NewlibuClibc.
  5. 中断/异常处理程序 - 这些是在正常代码执行期间由于硬件或处理器状态的变化而在随机时间运行的例程.这些例程通常也是用汇编语言编写的,因为它们应该以最小的软件开销运行,以便为所调用的实际硬件提供服务.

希望这将提供一个良好的开端.如果您有其他疑问,请随时发表评论.


pax*_*blo 5

通常,您的工作水平远低于通用计算机.

每个CPU在上电时都会有某些行为,例如清除所有寄存器并将程序计数器设置为0xf000(这里的所有内容都是非特定的,这是您的问题).

诀窍是确保您的代码在正确的位置.

编译过程通常类似于通用计算机,因为您将C转换为机器代码(目标文件).从那里,您需要将该代码链接到:

  • 您的系统启动代码,通常在汇编程序中.
  • 任何运行时库(包括C RTL的必需位).

系统启动代码通常只是初始化硬件并设置环境,以便您的C代码可以工作.嵌入式系统中的运行时库通常会使大块的东西(如浮点支持或printf)可选,以便减少代码膨胀.

嵌入式系统中的链接器通常也更简单,输出固定位置代码而不是可重定位二进制文​​件.您可以使用它来确保启动代码位于(例如)0xf000.

在嵌入式系统中,您通常希望可执行代码从一开始就存在,因此您可以将其刻录到EPROM(或EEPROM或Flash或其他在断电时维护内容的设备).

当然,请记住我最近的尝试是使用8051和68302处理器.现在可能是"嵌入式"系统是带有各种奇妙硬件的完整Linux系统盒,在这种情况下,通用和嵌入式系统之间没有真正的区别.

但我对此表示怀疑.仍然需要严格的低规格硬件,需要自定义操作系统和/或应用程序代码.

SPJ嵌入式技术具有一个可下载的评估他们的8051开发环境看起来是你想要的.您可以创建最大2K的程序,但它似乎经历了整个过程(编译链接,生成HEX或BIN文件以转储到目标硬件,甚至是可以访问片上内容和外部设备的模拟器) ).

非评估产品的成本为200欧元,但如果您想要的只是一个游戏,我只需下载评估 - 除了2K限制外,它就是完整的产品.