一、浅谈编译器
嵌入式产品很多都是小芯片,有些甚至连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 关键字的使用,尤其是做驱动方面。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。 这么晚了,下班了。明天还要加班。。。。
本文探讨了嵌入式产品中编译器的性能及其局限性,特别强调了volatile关键字在驱动开发中的应用。通过实例演示了volatile如何确保变量的稳定性和避免编译器优化带来的潜在问题。

被折叠的 条评论
为什么被折叠?



