對,所以目前我們有8位,16位和32位微控制器。它們都是經常使用的。對8位和16位微控制器進行編程有何不同?我的意思是,它需要不同的技術或技能嗎?讓我們以微芯片為例。如果人們想從8位微控制器過渡到32位微控制器,需要學習什麼新東西?
對,所以目前我們有8位,16位和32位微控制器。它們都是經常使用的。對8位和16位微控制器進行編程有何不同?我的意思是,它需要不同的技術或技能嗎?讓我們以微芯片為例。如果人們想從8位微控制器過渡到32位微控制器,需要學習什麼新東西?
通常,從8位到16位到32位的微控制器意味著對資源(特別是內存)以及用於進行算術和邏輯運算的寄存器的寬度的約束較少。 8位,16位和32位綽號通常既指內部和外部數據總線的大小,也指用於算術和邏輯運算的內部寄存器的大小(以前只是一個或兩個稱為累加器) ,現在通常有16個或32個寄存器組。)
I / O端口的端口大小通常也將跟隨數據總線的大小,因此8位微型將具有8位端口,即16個位將具有16位端口等。
儘管具有8位數據總線,但許多8位微控制器都具有16位地址總線,並且可以尋址2 ^ 16或64K字節的內存(但這並不意味著他們可以實現這一目標)。但是某些8位微控制器(如低端PIC)可能只有非常有限的RAM空間(例如PIC16上為96字節)。
為解決其有限的尋址方案,需要一些8位微控制器Micros使用分頁,其中頁寄存器的內容確定要使用的幾個存儲庫之一。無論頁面寄存器設置為什麼,通常都會有一些可用的公共RAM。
16位微控制器通常限於64K內存,但也可以使用分頁技術來解決此問題。當然32位微控制器沒有這種限制,並且可以尋址多達4GB的內存。
不同的內存大小就是堆棧大小。在低端的micros中,這可以在特殊的存儲器區域中實現,並且非常小(許多PIC16具有8級深度調用堆棧)。在16位和32位micros中,堆棧通常位於通用RAM中,並且僅受RAM大小的限制。
在各種設備上實現的內存量(程序和RAM)也存在巨大差異。 8位單片機可能只有幾百個字節的RAM,還有幾千個字節的程序存儲器(或者更少-例如PIC10F320只有256個14位字的閃存和64個字節的RAM)。 16位的micros可能具有數千字節的RAM和數万字節的程序存儲器。 32位單片機通常具有超過64K字節的RAM,並且可能具有1/2 MB或更多的程序存儲器(PIC32MZ2048具有2 MB的閃存和512KB的RAM;針對圖形優化的新發布的PIC32MZ2064DAH176具有2 MB的閃存和
如果您使用彙編語言進行編程,則寄存器大小的限制將非常明顯,例如,在8位處理器上加兩個32位數字是一件很麻煩的事情。位微控制器,但在32位微控制器上卻微不足道。如果您使用C進行編程,那麼這在很大程度上是透明的,但是對於8位代碼,其基礎編譯代碼當然會更大。
我說的在很大程度上是透明的,因為各種C數據類型的大小可能從一個尺寸的微型到另一個尺寸不同;例如,針對8位或16位微指令的編譯器可以使用“ int”表示16位帶符號變量,而在32位微指令上,這將是32位變量。因此,許多程序使用#defines來明確說明所需的大小,例如對於無符號16位變量的“ UINT16”。
如果您使用C語言進行編程,那麼影響最大的將是變量的大小。例如,如果您知道變量將始終小於256(如果帶符號,則始終在-128至127範圍內),則應在8位單片機(例如PIC16)上使用8位(無符號char或char) ),因為使用較大的尺寸將非常低效。同樣在16位單片機(例如PIC24)上重新存儲16位變量。如果您使用的是32位單片機(PIC32),則由於MIPS指令集具有字節,字和雙字指令,因此它實際上沒有任何區別。但是,在某些32位微控制器上,如果它們缺少這樣的指令,則由於存在屏蔽,操作8位變量的效率可能會低於32位變量。
論壇成員vsz指出,在系統上如果您有一個大於默認寄存器大小的變量(例如8位微控制器上的16位變量),並且該變量在兩個線程之間或在基本線程與中斷處理程序之間共享,則必須使 atomic 的em> any 操作(包括僅讀取),這使其看起來像是一條指令。這稱為關鍵部分。緩解此問題的標準方法是在關鍵部分周圍使用禁用/啟用中斷對。
因此,從32位系統到16位或從16位到8位的任何操作這種類型的變量現在大於默認寄存器的大小(但以前沒有),則需要將其視為關鍵部分。
從一個PIC處理器到另一個PIC處理器的另一個主要區別是外圍設備的處理。這與字長無關,而與每個芯片上分配的資源的類型和數量有關。通常,Microchip嘗試使跨不同芯片使用的同一外設的編程盡可能相似(例如timer0),但是總會有差異。使用它們的外設庫將在很大程度上隱藏這些差異。最後的區別是中斷的處理。 Microchip庫再次在這裡提供幫助。
8位和32位微控制器之間的一個共同區別是8位微控制器通常具有一定範圍的存儲器和I / O空間,而在32位微控制器中,無論執行上下文如何,都可以在一條指令中對其進行訪問。微控制器經常需要多指令序列。例如,在典型的8位微控制器(HC05、8051,PIC-18F等)上,可以使用一條指令來更改端口位的狀態。在典型的ARM(32位)上,如果最初不知道寄存器的內容,則需要四條指令序列:
ldr r0,= GPIOA ldrh r1,[r0 + GPIO_DDR] ior r1,#64 strh r1,[r0 + GPIO_DDR]
在大多數項目中,控制器將花費大量時間進行除設置或清除單個I / O位之外的其他操作,因此清除端口引腳之類的操作需要更多指令這一事實通常無關緊要。另一方面,有時代碼必須“大爆炸”許多端口操作,並且用一條指令執行這些操作的能力可能會非常有價值。
方面,始終將32位控制器設計為有效訪問可以存儲在內存中的多種數據結構。相比之下,許多8位控制器在訪問不是靜態分配的數據結構時效率很低。一個32位控制器可以在一條指令中執行一個數組訪問,而在一個典型的8位控制器上,該訪問需要六條或更多條指令。
最大的實際不同是,要完全了解整個芯片的文檔數量。那裡有8位微控制器,附帶了將近1000頁的文檔。相比之下,1980年代的8位CPU及其流行的外圍芯片的價值約為200-300頁。外圍設備豐富的32位設備將需要您閱讀2000-10,000頁的文檔來理解該部件。具有現代3D圖形的部分位於2萬頁的文檔中。 8位部分。所謂“一切”,是指您即使不按常規方式也知道如何使用所有外圍設備,並且了解機器語言,平台使用的彙編程序以及其他工具,ABI等。
在很多情況下對設計有一定的了解,這並不是不可想像的。有時這無關緊要,有時不是。切換平台必須在理解短期和中期生產率的前提下進行,您需要為此付出代價,才能從更強大的體系結構中獲得可觀的生產率提升。盡職調查。
我個人不必擔心升級同一家族的(8bit-> 32bit)uC,而您正在全面提高規格。通常,我不會對數據類型做任何超出正常範圍的事情,因為這可能很難維持下去。
降級設備代碼是另一回事。
32位MCU將消耗更多的功率。並且需要更多的支持電路。
一個並沒有真正從8位過渡到32位...您將經常同時使用這兩種方法。底線是您應該使用(並學習)適合該工作的任何內容。學習ARM,因為它可以立即撼動嵌入式世界,並且會繼續努力。還要學習AVR或PIC,因為它們是出色的闆卡控制器。
您可能會遇到從AVR切換到ARM的苦惱,就像從ARM切換到x86一樣,總線的大小實際上並不能差別很大。儘管所有其他高級硬件都可以。從標準中斷到具有6個優先級的向量中斷數組,要比計算出40億計數要困難得多。