題:
8位微控制器與32位微控制器在編程方面有何不同
quantum231
2014-04-17 19:27:28 UTC
view on stackexchange narkive permalink

對,所以目前我們有8位,16位和32位微控制器。它們都是經常使用的。對8位和16位微控制器進行編程有何不同?我的意思是,它需要不同的技術或技能嗎?讓我們以微芯片為例。如果人們想從8位微控制器過渡到32位微控制器,需要學習什麼新東西?

不會。當然存在不同的問題,但是這些問題主要在特定於設備的細節級別上。例如,是否允許未對齊的單詞訪問? (在ARM上不是-在x86上是)。這個問題還不夠具體。
哇,謝謝你的回答。因此,在對32位處理器和8位處理器進行編程時,實際上需要考慮非常重要的差異。在這裡我指的是C,因為我認為大多數人都不是出於編程目的而去研究彙編語言。感謝您的詳細答复,我非常感謝。
有了32位uc,您將擁有更多的選擇權和更多的寄存器 正確。我想這取決於您在做什麼。也就是說,這些天來,您可以以約50美元的價格獲得開發板,編譯器,調試器和IDE。回到那一天 費用將接近$ 1000。
五 答案:
tcrosley
2014-04-17 20:39:33 UTC
view on stackexchange narkive permalink

通常,從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位處理器趨向於具有更少的寄存器和更少的正交指令(AVR是一個更具RISCy例外),這是開發它們時受到設計約束的結果。 32位處理器往往是RISC的後代(瑞薩的RX,一種現代的CISC,是一個例外,而飛思卡爾的ColdFire則是從m68k降級)。
為了不為此添加一個新的答案,我認為添加從16到8的32位到16的過渡很重要,因為算術不再是原子的。如果在8位微控制器上添加兩個16位數字,並在中斷中使用它們,則必須注意使它們成為線程安全的,否則最終可能在中斷觸發之前只添加一半。您的中斷服務程序中的值無效。
@vsz-好的,忘記了那個。通常,應該禁用任何大於默認寄存器大小的易失變量的訪問(包括讀取操作)周圍的中斷。
32位uC通常具有32位I / O接口,這是真的嗎?我認為無論如何通常都是串行通訊。
@clabacchio我的經驗是,所有I / O端口*寄存器*都定義為32位,但是有時高16位16-31未被使用,因此並行端口仍然是16個物理引腳。在其他情況下,例如RTCC寄存器,則全部使用32位。
關於“寄存器數量”,PIC是一種有趣的情況,因為大多數指令限於使用一個特定的寄存器(W)作為源操作數之一,但是可以直接使用數十個或數百個寄存器作為另一個操作數,而無需中間或遵循加載/存儲操作。
作為一般經驗法則,請在可用的地方使用`stdint.h`。例如,至少8位的最快無符號整數將是“ uintfast8_t”。可能是16位或32位,但保證至少為8位。因此,在那些32位運算比8位運算更快的32位微處理器上,它將是32位,而在8位運算較快的8位微處理器上,它將是8位。
supercat
2014-04-17 20:44:37 UTC
view on stackexchange narkive permalink

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位控制器上,該訪問需要六條或更多條指令。

我認為您的意思是“位砰”。可能值得注意的是,ARM支持位帶區域(其中字操作是單位操作),並且MIPS的MCU專用擴展提供了字節指令內的原子置位/清除位指令(ASET / ACLR)。
@PaulA.Clayton:在過去的20年中,我並沒有真正研究過MIPS。至於位帶區域,我從來沒有想過在合理的外觀代碼中使用它們的方法,即使我可以使用它們,它們也只保存一條指令,除非有人使用了一些瘋狂的編程技巧。它們可能會保存兩個[根據該位是否應置1或清零來向R0加載偶數或奇數地址,並適當調整存儲指令上的偏移量以進行補償]。順便說一句,你知道為什麼位帶區域使用字地址嗎?
@supercat:字尋址使您可以通過指針下標(“ region_base [offset]”)從C或C ++訪問位帶區域
@BenVoigt為什麼字節尋址不能做到這一點? (也許一個可能的原因是消除了對支持兩位和四位運算的期望/希望。)
@BenVoigt:必須將位數字縮放4倍,通常會花費額外的指令。實際上,我希望看到的是一組區域,而不是位帶區域,它們相對於“正常”內存訪問處於固定偏移量,但是指定寫入一個區域如果可能的話,將僅“置”位,而寫入另一位將僅“清除”位。如果總線具有單獨的“寫使能”和“寫零使能”控制位,則可以實現位帶允許的功能,但在許多情況下,請避免進行讀-修改-寫操作。
-1
@supercat:我已經在許多外圍設備的內存映射中看到了具有僅設置和僅清除功能的ARM實現。
@BenVoigt:許多單獨的外圍設備都具有這樣的功能,但是它們的實現方式有所不同。此外,RAM不具有這種功能。據我所知,要將這種功能添加到RAM陣列中,只需要更改列控制邏輯即可。無需其他每單元邏輯。不過,我不知道有任何可行的實現方式。
Unslander Monica
2015-02-06 20:32:00 UTC
view on stackexchange narkive permalink

最大的實際不同是,要完全了解整個芯片的文檔數量。那裡有8位微控制器,附帶了將近1000頁的文檔。相比之下,1980年代的8位CPU及其流行的外圍芯片的價值約為200-300頁。外圍設備豐富的32位設備將需要您閱讀2000-10,000頁的文檔來理解該部件。具有現代3D圖形的部分位於2萬頁的文檔中。 8位部分。所謂“一切”,是指您即使不按常規方式也知道如何使用所有外圍設備,並且了解機器語言,平台使用的彙編程序以及其他工具,ABI等。

在很多情況下對設計有一定的了解,這並不是不可想像的。有時這無關緊要,有時不是。切換平台必須在理解短期和中期生產率的前提下進行,您需要為此付出代價,才能從更強大的體系結構中獲得可觀的生產率提升。盡職調查。

Nick Tullos
2014-04-17 20:31:21 UTC
view on stackexchange narkive permalink

我個人不必擔心升級同一家族的(8bit-> 32bit)uC,而您正在全面提高規格。通常,我不會對數據類型做任何超出正常範圍的事情,因為這可能很難維持下去。

降級設備代碼是另一回事。

數據類型的大小由編譯器而不是處理器體系結構確定。 8位處理器可以具有32位int,即使要花費多條指令來操作它們也是如此。
好的評論-由於更正,我刪除了第一行。
@JoeHass:一個用於8位處理器的編譯器*可以*將* int定義為32位,或者甚至是64位,但是我不知道任何現有的8位編譯器實際上*確實*將* int定義為大於16位,或將16位值提升為更大的值。
Hugo
2014-04-18 05:51:26 UTC
view on stackexchange narkive permalink

32位MCU將消耗更多的功率。並且需要更多的支持電路。

一個並沒有真正從8位過渡到32位...您將經常同時使用這兩種方法。底線是您應該使用(並學習)適合該工作的任何內容。學習ARM,因為它可以立即撼動嵌入式世界,並且會繼續努力。還要學習AVR或PIC,因為它們是出色的闆卡控制器。

您可能會遇到從AVR切換到ARM的苦惱,就像從ARM切換到x86一樣,總線的大小實際上並不能差別很大。儘管所有其他高級硬件都可以。從標準中斷到具有6個優先級的向量中斷數組,要比計算出40億計數要困難得多。

我不知道宣稱32位MCU本質上更耗電。至少有一家公司([energy micro](http://www.energymicro.com/))的整個產品線都是超低功耗MCU,它們都是基於32位ARM內核的。
剛設計出一個stm32l1電路,該電路應在cr2032上運行7年
您能證明32位MCU需要更多的“支持電路”嗎?我認為您在這裡表達了一些不合理的意見。
對於最簡單的8位微控制器電路,您真正需要的只是一個陶瓷諧振器(或內部RC振盪器完全不需要),以及一個或多或少穩定的電源。對於最簡單的32位微控制器,您通常至少需要2個電源(有些例外,有些ARM7帶有內部調節器並在單個3.3v電源上運行)和更多的旁路電容器。更多的IO也意味著更多的功能。
我還要說是,事實上,由於晶體管數量和更大的內存,實際上32位芯片比8位芯片需要更多的功率是不可避免的。但是,在某些任務上,任何CPU體系結構都將不可避免地比其他體系結構更高效。
至於您的stm32l1,我看到了300uA的待機模式,並在6MHz下將mega1284p的100uA待機模式提升了。
STM32L1在紙上待機時的功耗為2 uA。我要3
@Hugo-我使用EFM32的600 ** nano ** amp休眠模式提高了100 uA待機狀態。
另外,向量中斷註釋沒有多大意義,因為您可以在8位微控制器中獲得多個優先級(請參閱具有3個優先級的Atmel xmega MCU),並且在每個硬件設備都具有向量中斷的情況下,向量中斷是無關緊要的擁有自己的獨立向量。
我正在使用32位Cortex-M0處理器來控制電動汽車的智能電池充電器。它使用3.3 V單電源。它具有一個內部振盪器和PLL,因此我什至不需要晶體。我使用的是28引腳DIP封裝,但如果需要,我可以在8引腳DIP中獲得Cortex-M0。怎麼會比典型的PIC或AVR更複雜?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...