嵌入式产品很多都是小芯片,有些甚至连MCU都算不上。特别是在传感网络方面,有时就需要一个无线芯片就
OK了。那么这些芯片配套的编译器性能就不会多高端了。大部分编译器功能都不怎么强大。比如 Silicon LABS 芯片
系列,其编译器就很一般,只支持汇编和C语言,当然伪指令也会有支持。如果你以前是做上位机软件,经常用微软
的Visual Studio 编译器编程,当你转行到嵌入式就会发现编译器的差距了。感叹一句:用VS的程序员们是幸福的!
做嵌入式开发产品前,一定要仔细看其芯片配套的编译器手册。这点很重要。不要以为只要会C,会芯片手册上的
知识就可以做埋头 Coding 做产品了。
有的编译器连 bool 都不识别,更别谈 true 和 false 。 遇到这种情况怎么办呢? 自己动手,丰衣足食。自己做一
个头文件,着重其可移植性。
#ifndef XXX_X
#define XXX_X
typedef enum
{
false = 0,
true
}bool;
#endif
嵌入式程序员必须要掌握 volatile 关键字的使用,尤其是做驱动方面。volatile修饰变量,其作用简单的说就是:
确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止编译器对代码进行优化。到底是什么意思呢?
例如: 正常变量定义
int test ;
test = 0x01;
test = 0x02;
test = 0x03;
编译器遇到这几行代码会对它干什么呢?编译器会对其优化,忽略到之间两条代码,认为 test = 0x03,即将该语句编
译并产生机器码。对于 赋值 0x01,0x02的过程就没有了。
volatile int test2;
test = 0x01;
test = 0x02;
test = 0x03;
编译器遇到以上四条语句会老老实实的 将其一条一条编译产生相应机器码,不会偷懒了。那 volatile 对嵌入式具体应用到哪方面呢?
我们假定 STATUS 为某芯片中一个状态寄存器,其值的变化频率非常高。
代码块一: 代码块二:
int check_status = STATUS; volatile int check_status = STATUS;
while( check_status != 0x05); while( check_status != 0x05);
......... .........
注意在另一个线程中会对check_status = STATUS 处理。
假定 STATUS 初始化为 0x0F,当其无线功能准备好后值变为 0x05。在试问上面的代码谁会达到预定的目的呢?显然
是代码块二。代码块一会卡死在while中。
下次写 内部RAM和外部RAM,以及Flash。 这么晚了,下班了。明天还要加班。。。。