一点一滴做好嵌入式——1

、浅谈编译器


       嵌入式产品很多都是小芯片,有些甚至连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,嵌入式,C语言,编译器)