相关:
测试固件
启动微控制器模拟器/仿真器
解释汇编代码
如果您正在为微控制器编写代码,那么如果您使用汇编语言或C语言或其他高级语言编写,会有真正的区别吗?如果你编写C代码,你会如何编译它?
谢谢
几条评论:
1)绝对不是装配,除非性能或优化限制保证.以下指标通过汇编进入屋顶:
是时候编码了
时间来调试它
是时候测试了
记录它的时间
是时候弄清楚(1年后)你编码时你在做什么
犯错的可能性
2)我的首选项是C++而不是C,因为它的命名空间封装和它促进了编译时面向对象的实践.C有太多的全局变量和命名空间冲突的机会.(实时Java会很好,但据我所知,它的要求仍然很高)
或者更确切地说是C++的一个子集:排除异常,虚函数,运行时类型识别,以及大多数情况下的动态内存分配 - 基本上是在编译时未指定的任何内容,因为在运行时通常需要大量额外资源.这是C++的"膨胀".
我已经使用TI和IAR的C++编译器,分别用于TMS320和MSP430微控制器,并且通过适当的优化设置,它们可以很好地减少您对C++的开销.(特别是如果你通过明智地使用inline
关键字来帮助它)
我甚至使用模板来获得一些编译时的好处,这些好处促进了良好的代码重用:例如,编写单个源代码文件来处理8位,16位和32位CRC; 和编译时多态,允许您指定类的通常行为,然后重用它,但覆盖它的一些功能.同样,TI编译器具有极低的开销,并具有适当的优化设置.
我一直在寻找Microchip PIC的C++编译器; 我找到的唯一一家生产IAR的公司就是IAR.($$$一直是一个障碍,但我希望有时会买一份)Microchip C18/C30编译器非常好,但它们是C,而不是C++.
3)关于编译器优化的一个具体警告:它可以/将使调试变得非常困难; 通常不可能单步执行优化的C/C++代码,并且您的监视窗口可能会显示与您认为应该包含未优化代码的内容无关的变量.(一个好的调试器会警告你一个特定的变量已经优化不存在或者进入寄存器而不是内存位置.很多调试器都没有.> :(
另外一个好的编译器可以让你通过#pragmas在函数级别选择/选择优化.我使用过的只允许您在文件级别指定优化.
4)将C代码连接到汇编:这通常很困难.最简单的方法是创建一个具有所需签名的存根函数,例如uint16_t foo(uint16_t a, uint32_t b) {return 0; }
,where uint16_t
= unsigned short,我们通常将#位显式化.然后编译它并编辑它产生的程序集(只需确保保留代码的开始/退出部分)并注意不要在完成后修复任何寄存器而不恢复它们.
内联汇编通常会遇到问题,除非您正在执行一些非常简单的操作,例如启用/禁用中断.
我最喜欢的方法是编译器内在函数/"扩展ASM"语法.Microchip的C编译器基于GNU C编译器,它具有" 扩展ASM ",允许您对内联汇编的位进行编码,但是您可以给它很多提示,告诉它您正在引用哪些寄存器/变量,它将处理所有的保存/恢复寄存器以确保您的汇编代码与C一起"很好".TI用于TMS320 DSP的编译器不支持这些; 它确实有一组有限的内在函数,它们有一些用处.
我已经使用汇编来优化一些经常执行的控制循环代码,或者计算sin(),cos()和arctan().但是否则我会远离集会并坚持使用高级语言.
大多数微控制器制造商提供某种交叉编译器,您可以在PC上编译代码然后将其传输到微控制器.
为何选择C?
C的一个优点是您的代码将来更容易移植到其他微控制器.计算历史表明,代码通常比硬件实现更耐用.
第二个优点是控制结构(if,for,while)使代码更易读和可维护.
为什么汇编语言?
您可以手工优化.
判决
与这类问题的情况一样,权衡取决于具体用途.
请注意,通常可以通过在C代码中进行汇编调用来混合这两者,这样您就可以找到适合您项目的余额.
具体到PIC硬件
这似乎是你没有GCC的大部分PIC硬件的选项.另一方面,正如评论者所指出的,16位PIC24和dsPIC33的Microchip C30编译器是gcc.SDCC
尚未支持PIC .新信息:根据评论,SDCC对PIC有可行的支持.
还有其他一些开源选项,但我没有使用它们的经验.
最好的选择可能是用C编写代码,然后对于需要手动优化并且可以比编译器做得更好的极少数实例,您应该将程序集编码到c文件中.
对于PC来说,汇编编码已成为过去,但在嵌入式编码中非常重要.
在嵌入式中编写程序集与在PC上编写程序集不同.PC编译器在生成优化指令时"比人类更好".嵌入式系统通常具有奇怪的架构,其优化编译器并不像PC优化编译器那样成熟.
我在为微控制器编写程序集时遇到的一个问题是需要非常小心地编写代码.有一个跨越内存边界的跳转表,并导致你的代码跳转到非常奇怪的地方是相当令人不安的.在C语言编码中,编译器为您提供了基础.
我肯定会选择C.它更快,它创造了更可靠的软件.大会几乎没有提供,在稀缺的场合.请记住在C:
您可以轻松地从现有平台移植代码,甚至可以从PC移植代码.
您可以使用高级语言进行开发,而不会影响执行速度或代码大小.如果可以使用高质量的编译器(PIC18有很多选择),那么使用C语言最好比手工制作的组件更好.
调试,测试和维护代码要容易得多.C生成更可靠的代码.
另一件事与PIC18有关.您不必处理非直观的PIC架构和内存BANK等问题.