为什么芯片控制语言可供选择

时间:2010-07-18 05:43:39

标签: c++ c embedded verilog

我之前已经问过这个问题,我应该学习嵌入式开发的语言。大多数嵌入式工程师表示c和c ++是必须的,但也指出它取决于芯片。

有人可以澄清吗?这是编译器问题还是什么?芯片是否有自己的特定编译器(如c编译器或c ++编译器),这就是为什么你必须使用编译器知道的语言?是不是可以在其他地方编码和编译它,然后直接在其编译状态下将其刻录到芯片? (我想我听到一个熟人说出了这个效果)

我不确定这是如何工作的,显然我不太了解嵌入式系统或它们是如何工作的。对于那些知道的人来说,这可能是一个简单的答案。

8 个答案:

答案 0 :(得分:5)

可能他们意味着一些工具链不支持C ++。是的,许多芯片和电路板都带有自己的工具链。不同的处理器具有不同的指令集,这意味着不同的编译器(或更具体地说是不同的后端)。这并不意味着你总是要重新学习一切。其中许多都是基于GCC(通常被认为是最多移植的编译器)。最终的可执行文件/图像格式也各不相同,因此您需要特定的链接器。最有可能的是,您将在“常规”计算机上(交叉)编译芯片,然后将其刻录到芯片上。但是,这并不意味着您可以使用针对桌面操作系统的典型编译器和链接器。

答案 1 :(得分:3)

它“取决于芯片”有三种可能的方式:

  1. 一些非常受约束的体系结构不适合C ++,或者至少C ++提供的结构不适合这种体系结构,所以提供的结果没有C.大多数8位设备属于这一类,但绝不是全部;我见过在MegaAVR上实现的有用的C ++代码。

  2. C ++编译器不支持某些设备。例如,Microchip的dsPIC / PIC24编译器仅为C(第三方工具可能支持C ++)。

  3. 芯片架构专为特定语言而设计;例如INMOS Transputers总是运行OCCAM。

  4. 除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调用的函数分配变量,然后为其他函数分配变量,然后为这些函数调用的函数分配变量,这将产生一个相当容易的最佳分配,但有一些警告:

  1. 只有添加代码才能将变量显式复制到某种堆栈排列上,才能支持递归;在许多编译器中,它根本就不受支持。
  2. 如果某个函数看起来“可能”调用另一个函数,那么链接器会假设它可以在所有情况下都这样做(例如,当'foo'调用'bar'时,它的一个参数可能总是有一个值,'bar'不会调用'boz',但链接器不会知道)。
  3. 对具有特定签名的函数指针的任何调用都将被视为对具有相同签名的所有函数的调用,其地址被采用。
  4. 如果对函数的多个参数的评估需要进行额外的函数调用,则通常必须悲观地分配额外的临时存储,即使参数存储的最佳放置可以避免这种情况。

有许多类型的C程序,上述限制完全没有问题,还有更多的C程序造成麻烦但不是很大(例如通过添加虚拟参数或返回值来确保间接的不同类别 - 被叫函数有不同的签名)。不幸的是,C ++到C预编译器生成的代码几乎总是涉及函数指针,其调用图无法合理地划分,因此在这样的平台上使用C ++即使不是不可能也很难。