8位单片机编程的一些坑

8位单片机编程的一些坑

 

由于TI 254x采用的是8位单片机,而且内存只有可怜的8k,所以与普通PC编程有一些不一样的地方,一定要注意。

 

一、不要声明太大的数组

请时刻记住,内存只有8k,你声明一个太大的数组连编译都无法通过。

 

二、串口打印不一定可信

如果你看到串口打印少了一些数据时,请不要慌张,以为是自己的程序错了。

记住:“眼见为实”这句话在这里是不适用的。

原因很简单,因为串口的速度比较慢,当输入的速度大于显示的速度,或者打印的速度大于传输的速度的时候,就会出现丢字符的情况。

有一个解决办法是将串口的波特率提高到115200,当然这也无法解决所有问题。

        

三、打印调试之坑2——32bit的printf

SerialPrintf(“%x , %x\n", 0x12345678, 0x1111);

请问这段程序打印出来的是什么呢?

在PC上,你可以毫不犹豫的说:

12345678 1111

 

但是在我们神奇的8位单片机里,嘿嘿~

5678 , 1234

 

What? 其实思考一下能猜到大概原因:

%x最多只能打16bit的数据,所以如果你让他打一个32bit数据会溢出,其高位会占用下一个数据。

所以打印32bit数的时候请用%x%x,当然用%x%x来打印也不是完全对的,会是:

56781234 1111

 

但也总比上面那个好吧~

 

四、基本数据类型的长度——你真的很懂么?

你认为你对int、char之类的数据类型真的已经很懂了么?请记住,数据类型就像女人一样,请永远不要说你很懂^_^,请看以下程序段:

 

SerialPrintf("char : %d \n\r", sizeof(char));

SerialPrintf("short : %d \n\r", sizeof(short));

SerialPrintf("int : %d \n\r", sizeof(int));

SerialPrintf("long : %d \n\r", sizeof(long));

SerialPrintf("long long : %d \n\r", sizeof(long long));

 

你能猜得到他们各占多少空间么?

答案是:

char : 1

short : 2

int : 2

long : 4

long long : 4

 

而在一部32位的计算机上,这个结果应该是:

char : 1

short : 2

int : 4

long : 4

long long : 8

 

所以这里我们就能真切的感受到编程经验里的谆谆教导:

“请不要直接使用基本数据类型,除非你很确定你的程序只在一种处理器上运行”

 

最聪明的方法是所有的数据在定义时都采用自定义的标明字长的类型:

typedef signed   char   int8;     //!< Signed 8 bit integer

typedef unsigned char   uint8;    //!< Unsigned 8 bit integer

typedef signed   short  int16;    //!< Signed 16 bit integer

typedef unsigned short  uint16;   //!< Unsigned 16 bit integer

typedef signed   long   int32;    //!< Signed 32 bit integer

typedef unsigned long   uint32;   //!< Unsigned 32 bit integer

typedef unsigned char   bool;     //!< Boolean data type

 

这样程序的可移植性会很好(这里不得不再感慨一下JAVA程序员好幸福,希望有一天JAVA能完全替代C。。。)

posted @ 2014-04-19 22:16  alexcai  阅读(2576)  评论(0编辑  收藏  举报