将软件/固件从一种架构移植到另一种混乱
Porting software / firmware from one architecture to another confusion
当提到从另一个架构移植到某个架构的软件/固件时,我仍然对这个概念感到困惑。
如果软件已经移植到 ARM 架构,例如,如果这是 C/C++ 代码,我的理解是源代码不需要更改,我们只需要使用 ARM 特定的编译器将代码编译成 ARM 芯片可以理解的指令?
如果源代码需要根据体系结构(无论是 ARM、PowerPC、X86 等)进行更改,您能否举例说明原因?
我一直在阅读有关 U-Boot 的文章,它指出它最初是作为嵌入式 PowerPC 芯片的引导加载程序,从那时起它被移植到 ARM 和其他架构。
同样,被移植是否意味着它只是用不同的编译器编译的?我几乎可以肯定它不是那么简单,所以请解释在源代码等中需要更改什么以适应特定的体系结构。
由于您要求提供一些示例,因此 C
中有两个相对简单的不可移植示例,只是为了开始。
(请注意,这些是不可移植的 代码示例 。移植活动还可能包括与现有代码无关的任务,例如编写接口或新的硬件抽象层对于自定义 target/processor)
sizeof(uint32_t)
很容易期望这个计算结果为 4
,但是,在像 TI C2000 这样的架构上,这个计算结果为 2
。假设 4
(当然首先是 buggy) 的算法将 为 C2000 编译得很好,也可能 运行,但是,如果将产生预期的结果
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
当提到从另一个架构移植到某个架构的软件/固件时,我仍然对这个概念感到困惑。
如果软件已经移植到 ARM 架构,例如,如果这是 C/C++ 代码,我的理解是源代码不需要更改,我们只需要使用 ARM 特定的编译器将代码编译成 ARM 芯片可以理解的指令?
如果源代码需要根据体系结构(无论是 ARM、PowerPC、X86 等)进行更改,您能否举例说明原因?
我一直在阅读有关 U-Boot 的文章,它指出它最初是作为嵌入式 PowerPC 芯片的引导加载程序,从那时起它被移植到 ARM 和其他架构。 同样,被移植是否意味着它只是用不同的编译器编译的?我几乎可以肯定它不是那么简单,所以请解释在源代码等中需要更改什么以适应特定的体系结构。
由于您要求提供一些示例,因此 C
中有两个相对简单的不可移植示例,只是为了开始。
(请注意,这些是不可移植的 代码示例 。移植活动还可能包括与现有代码无关的任务,例如编写接口或新的硬件抽象层对于自定义 target/processor)
sizeof(uint32_t)
很容易期望这个计算结果为4
,但是,在像 TI C2000 这样的架构上,这个计算结果为2
。假设4
(当然首先是 buggy) 的算法将 为 C2000 编译得很好,也可能 运行,但是,如果将产生预期的结果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