大多数软件开发人员都接受过某种教育或培训,其他人则是自学成才。但真正的编程学习是通过实践经验和知识交流。在编程过程中,他们会遇到有用的技术,或者在代码审查期间从同事那里获得建议。即使是非常有经验的程序员也会不时收到宝贵的提示。因此,传递自己的经验是非常有价值的。本文给嵌入式开发人员五个有用的建议:
使用后将指针设置为NULL
指针是语言中非常有用和强大的功能。但它们会导致错误。一个常见的错误是代码使用的指针值无效。例如,如果它指的是一个已动态分配但已被放弃的内存。使用无效指针可能会产生负面影响,这种影响只有在长时间后才会变得明显,因此很难发现。如果在使用后常规地将指针设置为NULL,则稍后的错误使用将导致立即发生错误,很容易进行本地化。
程序员使用C中的“int”表示无符号数据
在C语言中,int数据类型几乎是标准的。事实上,在最初的语言定义中,它是函数的默认返回数据类型(应该是无效的,但后来才出现)。大多数C程序员倾向于选择int作为变量,除非数据类型明显不适合。他们真的应该选择无符号,因为无符号的数据比有符号的数据多。最好仔细查看需要存储的值范围。它是未签名还是已签名?你需要8位、16位、32位或更多位吗?令人惊讶的是,时间/日期计数器经常被签名,导致Y2K错误。
谨防过度完美
软件何时准备就绪?显而易见的答案是,如果它提供了所有指定的函数而没有已知的错误。有许多情况会危及完工:许多嵌入式开发工程师都是完美主义者,他们总是看到事情,他们可以“改进”自己的代码。如果没有尽可能多的关心和监督,一个项目可能会在他们手中变得糟糕。另一种不太明显的情况是,代码是为特定目的或项目编写的,然后在其他地方重复使用。“建立在经验基础上”非常容易。“并在重用之前改进代码。如果不小心,这将成为版本管理的噩梦。
事件标志或信号是在RTOS上发送简单逻辑信息的最有效方式
现代RTOS,就像我们自己的Nucleus RTOS一样,包含多种功能。由于这样的操作系统是可扩展的,开发人员可以选择要使用的功能,而不会因为代码大小而丢失未使用的功能。在任何多线程设计中,任务间通信都很重要。因此,应提供各种功能,并应仔细选择。如果一个任务只需要为另一个任务标记一个事件,那么最简单的通信方法——事件标志或信号——可能是最有效的选择。
递归代码看起来很优雅,但很危险
许多数学过程可以用递归函数来描述,即用直接或间接调用自己的函数来描述。这可能是解决使用最少代码的问题的一种看似优雅的方式。下面是一个简单的例子:
void printbase(int number, int base)
{
if (number >= base)
{
printbase(number/base, base);
}
printf("%X", number%base);
}
你明白这段代码的作用吗?答案很可能是“不”。这也是应该避免这种技术的原因之一。嵌入式开发人员清楚代码的含义对于进一步的软件维护至关重要。此外,递归函数非常密集地使用堆栈,这可能会使堆栈失控。堆栈溢出是非常细微的错误,需要进行本地化。