物联网创客指南:MCU设计的最佳实践和除错技巧
在本节中,SiliconLabs将分享在软件开发方面的经验教训。关键词extern,staTIc和volaTIle都是什么?你应该在你的代码中使用递归还是malloc()?
1)查找硬件设备的现有软件示例
开发任何嵌入式解决方案的第一步是找到可以使您的任务更简单的示例。您在自定义解决方案中找到的特定部分的软件示例将帮助您以另一种方式"查看"设备,并帮助您重新解释设备规格,即使这些示例是针对其他计算机架构或软件语言的。
2)编译器的代码
没有完美的计算机软件语言。所有语言都有自己的优势和弱点。用于EFM32家族的Simplicity Studio中使用的软件语言是C。C语言有着很长的历史,它被广泛信任,并且在嵌入式设计上表现良好,但是其语法及特性很难掌握。当你在C中编码时,你实际上是为编译器和其他构建工具编写指令。记住这一点。C语言是"接近金属"的语言,因为您的代码在人类可读格式下编写的代码,汇编代码和二进制映像的构建过程的结果之间仅有几个步骤。
C代码具有严格的类型,要求某些变量匹配得足够好以执行安全赋值。这是为了保护你不要做愚蠢的事情,比如变量(即指针)的地址和变量的内容。但是经常在嵌入式开发中,您需要能够将纯数字转换为地址,以便指定寄存器地址。这需要你熟悉类型转换,以告诉编译器你真的知道你在做什么。
3)使用描述性变量和函数名称
你可以做的最好的事情是确保你的代码设计得很好,使用描述性的变量和函数名。在C代码中没有与长名称关联的运行性能损失。当构建工具将C代码转换为二进制机器码时,将删除所有标识符。请考虑在FAT文件系统(FF)库中找到的以下代码段:
上面的代码有一些注释,这当然有帮助,是一件非常好的事情,但是很难通过查看变量,函数,枚举和预处理符号知道这个代码的确切原因。考虑使用以下代码作为替代:
是的,代码有点宽,难以键入,但Simplicity Studio提供代码完成与CTRL +空格键的快捷键,你可以随时剪切和粘贴。代码可读性会增强,需要更少的寻找变量名。我们可以通过查看第二个例子来说明,这段代码旨在查看目标目录,并在找到目标目录中的已删除(先前已填充但现在可用)或零(从未填充)短文件名条目时中断。描述性名称允许您像读一段故事似得阅读代码,在你阅读时告诉你目的。
4)严肃的对待注释
一个好的软件开发人员在几个关键的地方给代码添加了很多注释。注释,如长变量名,不影响到运行时可执行二进制文件的文件大小,只是在那里,以帮助阅读文档的代码。解决方案中每个文件的顶部应说明该文件的目的,并且在每个函数的顶部应有较长的注释,说明函数的用途以及描述输入和输出。除了这些关键的地方,应该在逐行的基础上使用注释,无论代码的意图清不清楚。使用描述性变量名称可以帮助解释代码的目的,并减少必要的注释,使得那里的注释更突出。相信我,一年后你不会记得当初写代码的目的,所以要重视注释了!
5)使用emlib库
对于EFM32程序员,emlib库是你的朋友。接入EFM32外设时,尽可能的调用这些库。这些库经过良好测试,并有额外的代码来帮助寻找问题,而不仅仅是直接调整寄存器。
例如,以下代码使用emlib库:
TIMER_TopSet(TIMER3, 1000);
相同的事情可以通过预处理器定义寻址内存映射外设的寄存器来完成,定义TIMER3为0x40010C00。我们不使用这个地址,因为它很难被记住,但这是TIMER3映射在主内存中的地方。
TIMER3-》TOP = 1000;
所有外设以完全相同的方式映射到内存地址,因此有时您会看到使用此指针表示法的示例,而不是emlib库函数。如果您将看到em_timer.h中的TIMER_TopSet函数定义,您将看到该函数与此示例完全相同,因此在这种情况下,库函数没有提供任何附加值。然而,使用emlib库,有时会得到比简单操作映射寄存器更多的功能。例如,CMU_ClockEnable函数在最终使用"bit band"命令确保寄存器位自动地设置之前,小心地代表您做出很多决定。尽可能频繁地使用这些库函数,以获得所有EFM32库设计师设计的便利性。
6)定义变量以避免堆栈和堆的问题
C的许多方面对于非专业的程序员来说并不明显,但在嵌入式设计中运行代码时变得很重要。对于初学者,所有本地声明的变量都在栈上。这些是您在函数或任何代码块中定义的变量。
堆栈是从"内存顶部"或物理RAM中最高可用地址开始的内存区域,然后向下计数,直到达到堆栈限制。如果您定义了太多的局部变量,或者您的代码通过使用递归或其他嵌套函数动态创建这些变量,那么您的堆栈空间会
- Silicon Labs展示高级计量无线解决方案(02-24)
- 物联网的最大挑战,在于“最后一寸”元件端(09-07)
- 主流ZigBee芯片大盘点(3):Silicon labs EM35x(07-25)
- 单片机选型有诀窍:根据数值选择低功耗MCU(04-24)
- 简化嵌入式设计的无线连接解决方案(05-09)
- Silicon Labs 32 位微控制器的 10 大技术特点(02-10)