将软件/固件从一种架构移植到另一种混乱

Porting software / firmware from one architecture to another confusion

当提到从另一个架构移植到某个架构的软件/固件时,我仍然对这个概念感到困惑。

如果软件已经移植到 ARM 架构,例如,如果这是 C/C++ 代码,我的理解是源代码不需要更改,我们只需要使用 ARM 特定的编译器将代码编译成 ARM 芯片可以理解的指令?

如果源代码需要根据体系结构(无论是 ARM、PowerPC、X86 等)进行更改,您能否举例说明原因?

我一直在阅读有关 U-Boot 的文章,它指出它最初是作为嵌入式 PowerPC 芯片的引导加载程序,从那时起它被移植到 ARM 和其他架构。 同样,被移植是否意味着它只是用不同的编译器编译的?我几乎可以肯定它不是那么简单,所以请解释在源代码等中需要更改什么以适应特定的体系结构。

由于您要求提供一些示例,因此 C 中有两个相对简单的不可移植示例,只是为了开始。

(请注意,这些是不可移植的 代码示例 。移植活动还可能包括与现有代码无关的任务,例如编写接口或新的硬件抽象层对于自定义 target/processor)

  1. sizeof(uint32_t)
    很容易期望这个计算结果为 4,但是,在像 TI C2000 这样的架构上,这个计算结果为 2。假设 4(当然首先是 buggy) 的算法将 为 C2000 编译得很好,也可能 运行,但是,如果将产生预期的结果

  2. Typecasts

    typedef struct _M {
      uint32_t a;
      uint32_t b;
    } M;
    
    uint8_t *p = (uint8_t *)malloc(100);
    
    M *m = (M *)p;
    
    printf("%d", m->b); //may cause hard fault at m->b on Cortex-M0
    

    最后一行将始终在 Cortex-M4 上运行,但是,可能 会在 Cortex-M0 上导致硬故障,具体取决于 p 的对齐方式到 32 位边界。参见 this