【问题标题】:Why bootloaders are in assembly? [closed]为什么引导加载程序在汇编中? [关闭]
【发布时间】:2016-02-23 22:18:10
【问题描述】:

我已经阅读了几个嵌入式项目,在所有这些项目中,引导加载程序都是用汇编而不是 C 编写的。这有什么原因吗?

【问题讨论】:

  • 这是一个更适合 Programmers Stack Overflow 站点的问题,而不是 Stack Overflow 直接的问题。
  • 我在 C.0 中编写了 3 个引导加载程序。更容易维护。 Example tight code
  • @AntonH 请不要建议交叉发布到其他站点。如果某个问题确实更适合其他地方并且没有直接的迁移路径,请将其标记为由版主迁移(这个问题在程序员身上做得不好)。请阅读:What goes on Programmers.SE? A guide for Stack Overflow.
  • 可能是由一位老派退休程序员编写的。没有人知道它是如何工作的,所以保持原样。
  • 我不明白为什么这被标记为基于意见。他问是否有任何理由在汇编中编写引导加载程序。正如下面的答案所表明的那样,至少有一部分是有原因的。

标签: c embedded


【解决方案1】:

通常至少入口点存根,可能还有到真正内核的转换,需要用汇编语言编写,因为它们涉及不能用 C 表示的控制转移/调用约定约束。例如,如果引导加载程序需要在堆栈可用之前初始化堆栈指针以指向 ram,如果没有笨拙的编译器扩展,这无法在 C 中表示。然而,通常可以保持在 asm 中写入的数量非常小,并且与这些类型的边界隔离。如果引导加载程序的其余部分也是用 asm 编写的,这通常表明作者对成本(维护、错误等)与收益(可能更小)的评估不佳。

【讨论】:

  • FWIW,Cortex MCU 并不需要组装任何东西。核心获取向量表的第一个字并将其用作堆栈指针。然后跳转到第二个单词。从那里,你几乎可以用 C 语言做所有事情(甚至编写任务切换内核)
  • @RussSchultz:这并不完全正确。您谈论的是 Cortex-M。 Cortex-A 和 R 仍然是更老的方式(我希望它们不是)。对于 Cortex-M,您可以使用 CMSIS 内在函数在 C 中编写所有代码,您在复位后与 C 不兼容。原因很简单,全局变量没有按照 C 标准的要求进行初始化。因此,初始代码(启动代码)不能依赖于此,而是必须为完全兼容的 C 代码(即 main 或任何调用的主入口点)正确设置 RAM 变量。
  • @Olaf 我不会争辩说它已经完全为 C 或 C++ 做好了准备,但是如果你愿意,你可以用 C 编写启动代码。您只需要知道除非它们是 const 否则不会设置全局范围变量(至少使用 Keil 工具,请检查工具的行为)。不过,编写启动代码的人并不多,因为它是由工具和芯片供应商提供的。
  • @RussSchultz:我没有说相反的话。但是 Cortex-AR 仍然需要汇编程序(或来自编译器的特殊函数进入/退出代码),例如中断处理程序。例如,他们的向量表可能仍然包含代码,而不是像 C-M 那样指向处理程序的指针。问题显然是关于启动代码的,不包括对这个问题毫无用处的代码。请注意,我很好地说明了对于 C-M,您可以用 C 编写所有内容(除了少数例外,例如未初始化的静态变量)。并且您有时必须采用这种代码。
【解决方案2】:

使其尽可能小。您不希望引导加载程序占用您可以用于实际程序的所有空间,并且在某些芯片中,为引导加载程序保留的内存空间相对较小。这样的小程序仍然是组装中手动优化的可行目标。

不过,您可能会在 C 语言中非常接近。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 2010-10-21
    • 2011-12-23
    • 1970-01-01
    • 2010-11-02
    • 2011-02-10
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多