【问题标题】:Alternatives to C and asm on microcontrollers [closed]微控制器上 C 和 asm 的替代品[关闭]
【发布时间】:2023-03-29 07:13:01
【问题描述】:

我的背景是这样的:嵌入式/C,然后是 C++,然后是更高级别的 OO 语言(Java、Scala、Ruby、Groovy 等),现在我正在做一个涉及 MSP430 微控制器的小项目。同时,受此启发,我正在考虑一些潜在的宠物嵌入式系统项目(网格和/或 RTLS 看起来很吸引人)。所以我的问题目前主要集中在 MSP430 上,不过,顺便说一句,我也希望有一个更广泛的情况,包括其他微控制器。

我有点惊讶地发现,经过这么多年,我可能需要回到 C 语言,包括它的宏、命名约定等等。我的大脑曾经被连接到 C,但那是很多很多年前的事了。

那么有哪些替代品呢?

  1. C++ 让我感觉更舒服,幸运的是,它似乎可行:http://stonepile.fi/object-oriented-approach-to-embedded-programming-with-c/

    所以如果我要编写 C++,我只需要内联很多,尽可能避免使用虚函数,我应该会很好,对吧? (至少在内存方面;他们没有在上述链接中对性能进行基准测试)。

    但是,如果这么简单,为什么人们要编写 C 语言?我一定是错过了什么。

  2. 上面的链接似乎也为 pico]OS 提供了一个包装库。有没有人在MSP430上用过picoOS,可靠性如何,需要多少资源?

  3. 对于一个简单的 MS430 项目,Energia 的优缺点是什么?我试过了,它看起来非常直观和自我记录,但它是否会在引擎盖下产生整洁的代码?例如,Energia 是否将未使用的 GPIO 初始化为关闭状态以节省能源?它会初始化未使用的中断吗?内存和速度方面的开销是多少?等等。

    编辑:作为一个长期使用 Eclipse 的人,我很想使用 CCS。我看到可以将 Energia 草图导入 CCS。这是否意味着 CCS 完全支持 Energia 并且可以用作 Energia IDE?

  4. 有人用过 Java Grinder http://hackaday.com/2014/02/10/java-grinder-spits-out-dspic-and-msp430-assembly-code/ 吗?它看起来很吸引人,但因为它输出的是一个汇编而不是 C/C++ 代码,所以提交它有点吓人:如果我被锁定在它里面并且它还没有准备好迎接黄金时段怎么办?如果它生成 C 代码,如果它不起作用,我可以很容易地删除它。

  5. 我提到了 Java,我的问题被删除了,因为不言而喻,除了像磨床一样的语法糖(我不介意语法糖!),Java 不能在 MSP430 上运行。我想我会问另一个问题,Java 可以在哪里运行。这已经太长了。

  6. 还有哪些其他语言/环境可以填补低级和高级语言之间的空白?

【问题讨论】:

  • 这个问题方式太宽泛了以至于栈溢出。
  • 简而言之:可以将 C++ 用于小型控制器并且效果很好。避免使用标准库中可能涉及动态内存分配的任何内容。
  • 我应该把它分成多个问题吗?我想过这个,但感觉有点像垃圾邮件/洪水。
  • 如果您能找到适合您平台的 Java 虚拟机 (JVM),则可以使用 Java。您可以将 Java 编译为适用于您平台的本机指令。
  • 您可能必须禁用垃圾收集器。阅读 JVM 的规范。由于垃圾收集器,许多嵌入式系统不使用 Java;因为动态内存在嵌入式系统中是邪恶的,主要是由于碎片。

标签: c++ c embedded msp430


【解决方案1】:

您这里似乎有几个问题,所以我将按照您编号的顺序进行。

  1. 大多数 micros 确实会运行 C++(假设制造商或开源项目提供编译器后端),但是您必须警惕一些缺点。 C++ 的确定性较低,因为它提供了显着更高级别的抽象,人们可能不想要一个资源受限的嵌入式系统,而且总的来说也不需要它,因为嵌入式系统很少强大到足以有效地运行极其复杂的算法需要像 C++ 这样的高级语言。考虑到从嵌入式系统调试代码的难度,具有简单且易于跟踪的错误非常好,它也可能导致范围广泛的难以跟踪的错误。然而非常重要的是,C++ 标准库非常庞大,它们会使用过多的内存,并且很可能会浪费您有限的内存空间。因此,即使您使用 C++,也无法使用任何使其强大的技术。

  2. 简单地说,我没有使用过它,但是像任何 RTOS 一样,如果你想要一个更高级别的接口,它会很有用,但是对于 MSP430 的微型尺寸来说,它似乎有点过分了,我无法想象你在做什么任何需要 ROTS 的东西,如果您需要多任务处理,最好自己提供简单的协作任务。

  3. 1234563您的代码,但在需要时调用较低级别的库。然而,除此之外,它确实提供了一个可爱的、自我记录的界面,我强烈建议您尝试一下。如果您稍后切换到另一个 micro,它还会使您的代码更容易移植许多倍(许多公司的许多系统都提供接线绑定)。
  4. 这个问题你自己回答吧,它可能很强大但还很不成熟,我会因为这种锁定而避免它,直到它变得更成熟,然后值得重新评估。

  5. Java 在功能更强大的 ARM 芯片上运行良好,这是我看到的唯一广泛使用它的地方,并且在微型芯片中实现相当高效(ARM 专门为 Java 提供硬件支持)。除此之外,Java 不适合微观世界,在某个时候,它似乎可能会去某个地方,但这在很大程度上没有实现,因为现在 C 喜欢是更小的微型世界的方式。

  6. 不幸的是,除了 C 之外,没有太多的选择。我最好的建议是使用更高级别的库,如布线。这样可以在不降低效率的情况下为您提供更好的界面,否则如果您需要高级别的抽象,则使用微型微几乎没有意义。

总而言之,C 在这里做得相当不错,我认为没有任何动机或努力来做一个好的替代品。坦率地说,我在很大程度上也有这种感觉,C 从未成为一门糟糕的语言,它仍然非常适合小型系统,原因与以前相同。它提供动力、效率和可预测性。

希望对你有所帮助,如果您有任何疑问,请评论我,我会尽力提供帮助。

【讨论】:

  • 哇,非常感谢您的精彩回答。很多问题:1)还有哪些其他高级库,如布线(在我的例子中是 Energia)? 2) 为什么 Java 处理器的努力消失了? 3) 我完全忘记了 C/C++ 静态链接!你是对的,我不想要任何标准库!但是,如果我只使用没有任何库的 C++,就像我在问题中提供的链接一样,那会起作用吗? (OTOH,为什么要麻烦,布线似乎是一个简单的选择) 4)布线和 C 之间的集成有多容易,尤其是涉及 CCS? 5) 待定
  • 5) 我听到你说的是:将 Wiring 用于高级、抽象的东西,然后将其与 C 集成用于低级的东西,从而两全其美;以同样的方式,曾经建议将 Java 用于高级内容,然后将 C 和 Java/Native 接口用于低级内容和紧密循环。我没听错吗?如果我这样做了,这听起来像是我可以遵循的策略!
  • 另外,请您阅读我的问题中的“编辑”段落吗?
  • @ТаняТ。 1) uClibC 很好(为 micros 提供了接近标准库的东西)。您可能还会发现一些很好的微型 SDK 甚至提供 POSIX 子集,但您需要检查您的制造商,因为它们始终是特定于芯片的(我认为 TI 在某些芯片上这样做)。除此之外,它们往往是特定于平台的,所以谷歌在这里是你的朋友。 2) java 语言最初只是当今 java 的一个小子集,可以很好地适应小型 micros,因为它变得越来越复杂,简单的传统实现变得不够用,无法支持新功能,因此人们放弃了它们。
  • 除了对C++库的使用谨慎外,大部分C++评论都是没有根据的意见。
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 2010-09-28
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多