8位单片机编程的一些坑
扫描二维码
随时随地手机看文章
由于TI 254x采用的是8位单片机,而且内存只有可怜的8k,所以与普通PC编程有一些不一样的地方,一定要注意。
一、不要声明太大的数组请时刻记住,内存只有8k,你声明一个太大的数组连编译都无法通过。
二、串口打印不一定可信如果你看到串口打印少了一些数据时,请不要慌张,以为是自己的程序错了。
记住:“眼见为实”这句话在这里是不适用的。
原因很简单,因为串口的速度比较慢,当输入的速度大于显示的速度,或者打印的速度大于传输的速度的时候,就会出现丢字符的情况。
有一个解决办法是将串口的波特率提高到115200,当然这也无法解决所有问题。
三、打印调试之坑2——32bit的printfSerialPrintf(“%x , %xn", 0x12345678, 0x1111);
请问这段程序打印出来的是什么呢?
在PC上,你可以毫不犹豫的说:
12345678 1111
但是在我们神奇的8位单片机里,嘿嘿~
5678 , 1234
What? 其实思考一下能猜到大概原因:
%x最多只能打16bit的数据,所以如果你让他打一个32bit数据会溢出,其高位会占用下一个数据。
所以打印32bit数的时候请用%x%x,当然用%x%x来打印也不是完全对的,会是:
56781234 1111
但也总比上面那个好吧~
四、基本数据类型的长度——你真的很懂么?你认为你对int、char之类的数据类型真的已经很懂了么?请记住,数据类型就像女人一样,请永远不要说你很懂^_^,请看以下程序段:
SerialPrintf("char : %d nr", sizeof(char));
SerialPrintf("short : %d nr", sizeof(short));
SerialPrintf("int : %d nr", sizeof(int));
SerialPrintf("long : %d nr", sizeof(long));
SerialPrintf("long long : %d nr", 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。。。)