嵌入式开发中使用C语言的常见误区
用单片机,针对的都是特定的mcu,资源非常少,而字符串处理、数据字符格式转换等函数,在C语言标准库中均通过堆(heap)中建立临时空间来实现;为了节约资源,在C用于单片机开发时,连接的是一个简化的mini库,对动态空间申请的检查、回收管理均是不完备的,容易引起运行时错误,而且也没足够资源来进行运行时的错误处理。最为致命的是这些错误是运行时出现而不是编译时出现!而且不知何时出现。
因此在单片机上以下功能能不用尽量不用:
- 动态变量的申请和释放:malloc 和free:空间不够时,少量的可以重复使用一些变量空间;大量的可改用固定数组自己重复使用这些空间就可以了。除非能预见可能出现的所有情况,否则频繁申请空间和释放,系统一定会崩溃!
- 和字符串相关的函数,包含printf,sprintf等,因为C语言字符串处理使用了动态内存,而且资源不足,对于你少量的格式转换,自己写个程序来实现,这样连接时就不会把这部分代码连接到目标代码中,既可以使代码短小运行速度快,也可以避免一些错误,当有问题时也容易查错。还有并非所以C编译器都支持这些函数,有时需要自己写点东西,如stdin stdout stderr(在avr 和stm32中都要自己重定向这三个函数);不用这些函数,你源代码的可移植性就增强了。
- 少用浮点运算;浮点运算得不多,如果需要在输出的时间涉及小数,可以输出时转换一下,只要哪怕有一处使用浮点数,连接时就要连接整个浮点运输库,代码增大很多。
- 慎用迭代算法,这通常出现在排序算法中,还有运行时计算表达式,这对于单片机来说堆栈很小,一不留神就出界了。
- 少用函数指针。这类高级的应用是C语言的特色,但这类应用中要是还包括传递参数,甚至不同类型的参数,要是有错很难查。
- 对初学者,少用指针变量,因为一不小心指向的就不是你想要的空间了。