针对不同目标MCU开发C/C++代码的区别
Difference between developing C/C++ code for different target MCUs
我在很多嵌入式开发人员职位的职位描述中看到,例如要求具备 ARM 微控制器上的嵌入式 C 编程知识。
我不太清楚的是,了解为特定 ARM 处理器开发 C 的知识与为 PowerPC 或其他类型的处理器开发 C 之间的区别是什么。使用 C 进行开发,我们从将要编译的实际指令和体系结构中抽象出来,那么为什么它真的很重要?
我猜主要是了解嵌入式开发知识、了解内存限制等,而实际的目标处理器并不重要。例如,为 PowerPC MCU 编写代码多年的开发人员难道不会和为基于 ARM 或其他类型的 MCU 开发代码一样出色吗?
也许我在这里遗漏了一些明显的东西。请有人举例说明为一种类型的处理器和另一种类型的处理器编写 C/C++ 代码之间可能存在的一些主要差异。谢谢
好吧,我自己没有写过任何 ARM 代码,但我认为 ARM 特定的体验应该是(排名不分先后):
- 使用 ARM 特定工具链(特别是该工具链的非标准部分、专有软件等)的经验
- 了解哪些相关库在 ARM 而不是 Intel 机器上可用,以及它们的 ARM 版本是否足够高性能、足够稳定等。
- 了解某些编码模式在编译为 ARM 机器代码时的样子,因此能够很好地判断有关低级实现的某些选择。
- 能够在必要时编写内联 ARM 程序集
- 了解 ARM 系统的缓存布局
- 能够 estimate/forecast 代码的功率经济性,而不仅仅是其性能(因为 ARM 处理器有时更关心这一点)。
答案是肯定的,也不是。
如果一份工作更多地与应用相关,那么 MCU 的具体知识将帮不上什么忙
如果软件开发处于 kernel/BSP/drivers 或硬件相关,那么 MCU/CPU 硬件知识至关重要。
请详细查看职位描述以了解期望的工作类型。
像往常一样,这取决于。
如果您打算在深 C 级别进行开发,了解架构是个好主意,以便根据速度优化您的代码 or/and 内存(数据总线大小,每条指令时钟等)。
如果你要进行更深层次的开发,这是必须的(如果我们谈论的是 ARM 和它的 thumb,thumb2 和 ARM……这太疯狂了)。
另外,每个架构因为遗留的原因或者为了让我们的生活更美好,都添加了一些技巧。例如,ARM PC 指向下一条要执行的指令之后,这在 PowerPC 或 RH850 或其他系统中是完全不同的。
在那之上(我的意思是,高于或接近 OS),编译器过去比我们好,但无论如何,很高兴知道它是如何工作的(而且它肯定会使调试更容易)
你写的都是关于 Linux 和内核的,但是 99% 的嵌入式工作都是纯粹的裸机。因此,核心和外围设备的知识是必不可少的。
在大多数情况下,在 Linux 程序员学习如何对裸机进行编程之前,他们毫无用处。
而这个时间需要花费你雇主的钱。
我在很多嵌入式开发人员职位的职位描述中看到,例如要求具备 ARM 微控制器上的嵌入式 C 编程知识。
我不太清楚的是,了解为特定 ARM 处理器开发 C 的知识与为 PowerPC 或其他类型的处理器开发 C 之间的区别是什么。使用 C 进行开发,我们从将要编译的实际指令和体系结构中抽象出来,那么为什么它真的很重要?
我猜主要是了解嵌入式开发知识、了解内存限制等,而实际的目标处理器并不重要。例如,为 PowerPC MCU 编写代码多年的开发人员难道不会和为基于 ARM 或其他类型的 MCU 开发代码一样出色吗?
也许我在这里遗漏了一些明显的东西。请有人举例说明为一种类型的处理器和另一种类型的处理器编写 C/C++ 代码之间可能存在的一些主要差异。谢谢
好吧,我自己没有写过任何 ARM 代码,但我认为 ARM 特定的体验应该是(排名不分先后):
- 使用 ARM 特定工具链(特别是该工具链的非标准部分、专有软件等)的经验
- 了解哪些相关库在 ARM 而不是 Intel 机器上可用,以及它们的 ARM 版本是否足够高性能、足够稳定等。
- 了解某些编码模式在编译为 ARM 机器代码时的样子,因此能够很好地判断有关低级实现的某些选择。
- 能够在必要时编写内联 ARM 程序集
- 了解 ARM 系统的缓存布局
- 能够 estimate/forecast 代码的功率经济性,而不仅仅是其性能(因为 ARM 处理器有时更关心这一点)。
答案是肯定的,也不是。
如果一份工作更多地与应用相关,那么 MCU 的具体知识将帮不上什么忙
如果软件开发处于 kernel/BSP/drivers 或硬件相关,那么 MCU/CPU 硬件知识至关重要。
请详细查看职位描述以了解期望的工作类型。
像往常一样,这取决于。
如果您打算在深 C 级别进行开发,了解架构是个好主意,以便根据速度优化您的代码 or/and 内存(数据总线大小,每条指令时钟等)。
如果你要进行更深层次的开发,这是必须的(如果我们谈论的是 ARM 和它的 thumb,thumb2 和 ARM……这太疯狂了)。
另外,每个架构因为遗留的原因或者为了让我们的生活更美好,都添加了一些技巧。例如,ARM PC 指向下一条要执行的指令之后,这在 PowerPC 或 RH850 或其他系统中是完全不同的。
在那之上(我的意思是,高于或接近 OS),编译器过去比我们好,但无论如何,很高兴知道它是如何工作的(而且它肯定会使调试更容易)
你写的都是关于 Linux 和内核的,但是 99% 的嵌入式工作都是纯粹的裸机。因此,核心和外围设备的知识是必不可少的。
在大多数情况下,在 Linux 程序员学习如何对裸机进行编程之前,他们毫无用处。
而这个时间需要花费你雇主的钱。