我之前已经问过这个问题,我应该学习嵌入式开发的语言。大多数嵌入式工程师表示c和c ++是必须的,但也指出它取决于芯片。
有人可以澄清吗?这是编译器问题还是什么?芯片是否有自己的特定编译器(如c编译器或c ++编译器),这就是为什么你必须使用编译器知道的语言?是不是可以在其他地方编码和编译它,然后直接在其编译状态下将其刻录到芯片? (我想我听到一个熟人说出了这个效果)
我不确定这是如何工作的,显然我不太了解嵌入式系统或它们是如何工作的。对于那些知道的人来说,这可能是一个简单的答案。
答案 0 :(得分:5)
可能他们意味着一些工具链不支持C ++。是的,许多芯片和电路板都带有自己的工具链。不同的处理器具有不同的指令集,这意味着不同的编译器(或更具体地说是不同的后端)。这并不意味着你总是要重新学习一切。其中许多都是基于GCC(通常被认为是最多移植的编译器)。最终的可执行文件/图像格式也各不相同,因此您需要特定的链接器。最有可能的是,您将在“常规”计算机上(交叉)编译芯片,然后将其刻录到芯片上。但是,这并不意味着您可以使用针对桌面操作系统的典型编译器和链接器。
答案 1 :(得分:3)
它“取决于芯片”有三种可能的方式:
一些非常受约束的体系结构不适合C ++,或者至少C ++提供的结构不适合这种体系结构,所以提供的结果没有C.大多数8位设备属于这一类,但绝不是全部;我见过在MegaAVR上实现的有用的C ++代码。
C ++编译器不支持某些设备。例如,Microchip的dsPIC / PIC24编译器仅为C(第三方工具可能支持C ++)。
芯片架构专为特定语言而设计;例如INMOS Transputers总是运行OCCAM。
除C,C ++外,其他可能性还有汇编程序,Forth,Ada,Pascal等等,但C几乎无处不在;很少有芯片供应商会在第一天就没有C编译器的情况下发布新的架构或设备。对于其他语言,您通常需要等到第三部分决定开发一个语言,并且等待可能永远是一个利基架构。
是否无法在其他地方编码和编译,然后直接在编译状态下将其刻录到芯片上?
这称为交叉编译或交叉开发,是嵌入式系统的常用开发方法。大多数嵌入式系统缺乏自行托管编译器的操作系统,文件,性能和内存资源,并且大多数开发人员希望在熟悉的面向用户的桌面操作系统中使用IDE,调试器等熟悉复杂的开发环境。
我不确定这是如何工作的 显然我不太了解嵌入式 系统或它们如何工作。
快速了解其中一些:
答案 2 :(得分:2)
是的,有许多架构存在C编译器,但C ++编译器不存在。您选择的处理器越小且功能越少,这种情况发生的可能性就越大。
对于嵌入式开发,您几乎总是在其他地方编译代码,如您所说,然后将其发送到芯片以执行/调试。为编译器本身编译的代码编译过程称为“交叉编译”。
答案 3 :(得分:2)
你是对的:芯片在编译器上有变化。大多数/许多现代芯片都有gcc端口;但不是所有的。
答案 4 :(得分:1)
术语“嵌入式”用于描述各种硬件。大多数嵌入式软件工程将包括编写C / C ++代码以为目标微处理器生成二进制文件,但是有些设备可以使用未编译的二进制编码。
一个例子是可编程逻辑控制器(PLC)。这些设备使用名为“Ladder Logic”的语言。这是一种很棒的语言。我很高兴过去和它合作过。
您可能遇到的另一件事,就像我过去一样,是解释BASIC仿真器的设备。希望今天很少见。
答案 5 :(得分:1)
C / C ++是固件开发的一个很好的选择。因此,您制作的软件将在嵌入式CPU /微控制器上运行。为了使设备正确编程,您需要了解语言和设备架构。
相同的代码可能不适用于不同的设备。因此,您必须学习语言和设备架构。
另一种选择是FPGA,它不是微控制器。 FPGA是具有专用单元的器件,能够在任何类型的同步电路中转换自身,包括微控制器。 FPGA采用硬件描述语言编写,如verilog和VHDL。软件的“编译”(合成)版本称为门户软件。
HDL与用于ASIC设计的语言相同。正确学习的道路 语言很长。所以我建议用PIC形式的C / C ++开始,这是一个 低成本且高度接受的微控制器。
如果您打算进行FPGA开发,那么使用C / C ++ / pic获得的知识将非常有用和重要,因为FPGA内部必须嵌入CPU /微控制器。
答案 6 :(得分:1)
答案 7 :(得分:0)
某些8位部件无法有效地从堆栈访问数据。而不是使用堆栈传递参数,静态分配自动变量和参数;通常,链接器在内存的一端为main()分配自动变量,然后为main调用的函数分配变量,然后为其他函数分配变量,然后为这些函数调用的函数分配变量,这将产生一个相当容易的最佳分配,但有一些警告:
有许多类型的C程序,上述限制完全没有问题,还有更多的C程序造成麻烦但不是很大(例如通过添加虚拟参数或返回值来确保间接的不同类别 - 被叫函数有不同的签名)。不幸的是,C ++到C预编译器生成的代码几乎总是涉及函数指针,其调用图无法合理地划分,因此在这样的平台上使用C ++即使不是不可能也很难。