gpt4 book ai didi

c - 编写固件:组装还是高级?

转载 作者:太空狗 更新时间:2023-10-29 16:28:10 26 4
gpt4 key购买 nike

相关:

  • Testing firmware
  • starting a microcontroller simulator/emulator
  • Interpreting assembly code

  • 如果您正在为 microcontroller编写代码,那么以汇编语言或C语言或其他高级语言编写的内容是否真的有所不同?如果您编写C代码,将如何编译它?

    谢谢

    最佳答案

    几点评论:

    1)绝对是而不是程序集,除非性能或优化约束对其保证。以下指标通过装配进行分析:

  • 编写代码的时间
  • 调试时间
  • 测试时间
  • 是时候记录下来了
  • (1年后)找出您在编码时的工作
  • 犯错的机会

  • 2)对于命名空间封装及其对编译时面向对象实践的促进,我更喜欢C++而不是C。 C对于全局变量和 namespace 冲突有太多的机会。 (实时Java会很好,但是据我了解,它的要求仍然很高)

    或更确切地说,是C++的一个子集:在大多数情况下,不包括异常,虚函数,运行时类型标识以及动态内存分配-基本上是在编译时未指定的任何内容,因为在运行时它通常需要大量额外资源。那就是C++的“膨胀”。

    我分别使用了TI和IAR的C++编译器,分别用于TMS320和MSP430微 Controller ,并且使用了适当的优化设置,它们在减少C++开销方面做得非常出色。 (特别是如果您通过明智地使用 inline关键字来提供帮助)

    我什至使用模板来获得一些编译时的好处,这些好处可以促进良好的代码重用:编写单个源代码文件以处理8位,16位和32位CRC;和 compile-time polymorphism允许您指定类的常规行为,然后重用该类,但覆盖其某些功能。同样,通过适当的优化设置,TI编译器的开销非常低。

    我一直在寻找适用于Microchip PIC的C++编译器;我发现的唯一一家能够生产IAR的公司。 ($$$一直是一个障碍,但我希望有一段时间能买到它的副本)Microchip C18 / C30编译器相当不错,但它们是C语言,而不是C++语言。

    3)关于编译器优化的特别警告:它可能/将使调试非常困难;通常,单步执行优化的C / C++代码是不可能的,并且监视窗口可能会显示与您认为未优化的代码应包含的变量不相关的变量。 (一个好的调试器会警告您,某个特定变量已经过优化,已经不存在或进入寄存器而不是内存位置。很多调试器都没有。> :(

    一个好的编译器也可以让您通过#pragmas在功能级别上选择/选择优化。我只使用了那些,可以让您在文件级别指定优化。

    4)将C代码连接到汇编程序:这通常很困难。最简单的方法是制作具有所需签名的存根函数,例如 uint16_t foo(uint16_t a, uint32_t b) {return 0; },其中 uint16_t = unsigned short,我们通常将位数明确。然后编译它并编辑它产生的程序集(只需确保保留代码的开始/退出部分),然后 小心不要在完成操作后破坏任何寄存器而不恢复它们。

    内联汇编通常会出现问题,除非您执行诸如启用/禁用中断之类的非常简单的操作。

    我最喜欢的方法是编译器内部函数/“扩展的ASM”语法。 Microchip的C编译器基于GNU C编译器,并且具有“ extended ASM”,可让您对内联汇编的位进行编码,但是您可以给它很多提示,以告诉它所引用的寄存器/变量,并将处理所有保存/恢复寄存器以确保您的汇编代码与C配合使用。TI针对TMS320 DSP的编译器不支持这些代码。它确实具有一组有限的内在函数,但有一定用处。

    我已经使用汇编来优化一些经常执行的控制循环代码,或者计算sin(),cos()和arctan()。但是否则,我将远离汇编并坚持使用高级语言。

    关于c - 编写固件:组装还是高级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/452139/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com