通常我們經常說一個單片機是8位的,16位的,32位的,那么怎么判斷一款單片機的位數是多少位呢,判斷的依據是什么呢,
一 單片機的位數
單片機的位數是指單片機數據總線的寬度,也就是一次能處理的數據的位數(bit),不是地址總線的寬度,也不是存儲器的位寬,地址線的位數可以跟數據線不一致,像51單片機的地址總線為16位,但是它是8位單片機,ARM的存儲器也有8位的但是它是32位機。
顧名思義,單片機的位數越多,一次能處理的數據也就越大,一次能搬運執行的命令也就越復雜,性能也就越強,例如stm32F1系列的性能可以到16~17,而51單片機只能到2~3。
但是8位單片機也有他的優勢,就是在達到某些低性能的應用場景下,它的指令與數據更密集,能利用較小的空間實現同樣的功能,成本比較低。
二? 8位,16位,32位單片機的典型代表以及應用場景
8位單片機,典型的是51系列的,再高級點用AVR、pic的,功能方面,似乎都不會很復雜,一般可能是控制類的多一下。一般不跑嵌入式OS。
16位的單片機,例如MSP430,感覺16位的單片機比較尷尬,高不成低不就,要求低一點,8位MCU就夠,高級點不如用32位MCU。一般不跑嵌入式OS。
32位的,就高級點了,一般能跑嵌入式OS,例如ucos2,ucos3,uclinux等等,能做更多復雜的功能。用OS和不用OS的話,編程的思路差異比較大。功能一般有面向控制的,也有簡單消費類電子的。
三 編程差異性:
單純C寫代碼沒啥區別,一般編譯器把初始化都做了,需要注意的是,8位單片機定義變量最小可以到1位bit,最大位數可能只能是8位uint8_t, 而16位,32位單片機最小只能到8bit uint8_t, 最大可能能到32bit,uint32_t.
再有就是變量字節對齊問題,32位機字起始地址必須是0,4,8,C這樣的4的整數倍,如果一個char型的變量賦值給一個int型字變量,要通過強制類型轉換,內存會自動先轉換到4字節對齊再賦值。
還有就是結構體中成員對齊的問題,如果在一個 32-bit 類型的成員前面,有 char 及 short 類型成員,且沒有湊齊到 32-bit 自然邊界,那么編譯器將會自動補 NULL 來填充。可以參考另一篇文章-《結構體成員對齊問題》