Programlama söz konusu olduğunda 8 bitlik mikrodenetleyicilerin 32 bitlik mikrodenetleyicilerden farkı nedir?


19

Evet, şu anda bu dünyada 8 bit, 16 bit ve 32 bit mikrodenetleyicilerimiz var. Hepsi sıklıkla kullanılır. 8 bit ve 16 bit mikroişlemcileri programlamak ne kadar farklıdır? Yani, farklı bir teknik veya beceri gerektiriyor mu? Mesela mikroçip alalım. Bir kişinin 8 bit mikrodenetleyiciden 32 bit mikrodenetleyiciye geçiş yapmak istiyorsa hangi yeni şeyleri öğrenmesi gerekir?


Hayır. Kesinlikle farklı kaygılar vardır, ancak bunlar büyük ölçüde cihaza özgü ayrıntı düzeyindedir. Örneğin, hizalanmamış kelime erişimine izin veriliyor mu? (ARM'de değil - henüz x86'da). Bu soru gerçekten yeterince spesifik değil.
Chris Stratton

Vay canına, cevaplar için teşekkürler. Dolayısıyla 32 bit işlemcileri ve 8 bit işlemcileri programlarken dikkate almamız gereken çok önemli farklılıklar vardır. Burada, çoğu insanın hepimizi bildiği nedenlerden dolayı programlama için Meclis'e girmediğini düşündüğüm için C'den bahsediyordum. Ayrıntılı yanıtlar için teşekkürler, gerçekten takdir ediyorum.
quantum231

32 bit uc ile LOT daha fazla seçenek ve doğru almak zorunda bir LOT daha fazla kayıt var. Sanırım ne yaptığına bağlı. Yani, bu günlerde bir geliştirme kurulu, compilier, hata ayıklayıcı, IDE yaklaşık 50 $ alabilirsiniz. Günde 1000 dolara mal olacak.

Yanıtlar:


33

Genel olarak, 8 ila 16 ila 32 bit mikrodenetleyicilere gitmek, özellikle bellek ve aritmetik ve mantıksal işlemleri yapmak için kullanılan kayıt genişliğinde daha az kısıtlamaya sahip olacağınız anlamına gelir. 8, 16 ve 32 bitlik takma adlar genellikle hem dahili hem de harici veri yollarının boyutuna ve ayrıca aritmetik ve mantıksal işlemler için kullanılan dahili kayıtların büyüklüğüne (akümülatörler olarak adlandırılan yalnızca bir veya iki tane) karşılık gelir , şimdi genellikle 16 veya 32 kayıt bankaları vardır).

G / Ç bağlantı noktası bağlantı noktası boyutları da genellikle veri yolu boyutunu izler, bu nedenle 8 bitlik bir mikro 8 bit bağlantı noktasına, 16 bitlik 16 bit bağlantı noktasına vb.

8 bitlik bir veri yoluna sahip olmasına rağmen, birçok 8 bitlik mikro denetleyicinin 16 bitlik bir adres veriyolu vardır ve 2 ^ 16 veya 64K bayt belleğe hitap edebilir (bu, uygulamanın yakınında herhangi bir yere sahip oldukları anlamına gelmez). Ancak, düşük uçlu PIC'ler gibi bazı 8 bitlik mikrolar sadece çok sınırlı bir RAM alanına sahip olabilir (örneğin bir PIC16'da 96 bayt).

Sınırlı adresleme şemasını aşmak için, bazı 8 bitlik mikro veriler disk belleği kullanır, burada sayfa kaydının içeriği kullanılacak birkaç bellek kümesinden birini belirler. Sayfa kaydı ne şekilde ayarlanırsa ayarlansın genellikle bazı yaygın RAM kullanılabilir.

16-bit mikrodenetleyici genellikle 64K bellekle sınırlıdır, ancak bu sorunu gidermek için sayfalama tekniklerini de kullanabilir. 32-bit mikrodenetleyicilerin elbette böyle bir kısıtlaması yoktur ve 4GB'a kadar belleği ele alabilir.

Farklı bellek boyutları ile birlikte yığın boyutu. Alt uç mikrolarda bu, özel bir bellek alanına uygulanabilir ve çok küçük olabilir (birçok PIC16'nın 8 seviyeli derin çağrı yığını vardır). 16-bit ve 32-bit mikrolarda, yığın genellikle genel RAM'de olacak ve sadece RAM'in boyutu ile sınırlı olacaktır.

Çeşitli cihazlarda uygulanan bellek miktarı - hem program hem de RAM - arasında büyük farklılıklar vardır. 8-bit mikrolar sadece birkaç yüz bayt RAM ve birkaç bin bayt program belleğine sahip olabilir (veya çok daha azı - örneğin PIC10F320 sadece 256 adet 14 bit flash ve 64 bayt RAM'e sahiptir). 16-bit mikronlarda birkaç bin bayt RAM ve on bin bayt program belleği olabilir. 32 bit mikronlar genellikle 64K baytın üzerinde RAM'e ve belki de 1/2 MB veya daha fazla program belleğine sahiptir (PIC32MZ2048, 2 MB flash ve 512KB RAM'e sahiptir; Yeni çıkan PIC32MZ2064DAH176, grafikler için optimize edilmiş 2 MB flash ve 32MB'lık çipli RAM).

Montaj dilinde programlama yapıyorsanız, kayıt boyutu sınırlamaları çok belirgindir, örneğin iki adet 32 ​​bit sayı eklemek 8 bitlik bir mikrodenetleyici için bir iştir, ancak 32 bitlik bir değerdir. C dilinde programlama yapıyorsanız, bu büyük ölçüde şeffaf olacaktır, ancak elbette altta yatan derlenmiş kod 8 acı için çok daha büyük olacaktır.

Büyük ölçüde şeffaf dedim, çünkü çeşitli C veri tiplerinin boyutu bir boyut mikrodan diğerine farklı olabilir; örneğin, 8 veya 16 bitlik bir mikro hedefleyen bir derleyici, 16 bitlik bir işaretli değişken anlamına gelmek için "int" kullanabilir ve 32 bitlik bir mikroda bu 32 bitlik bir değişken olabilir. Bu nedenle, birçok program işaretsiz bir 16 bit değişken için "UINT16" gibi istenen boyutun ne olduğunu açıkça belirtmek için #defines kullanır.

C dilinde programlama yapıyorsanız, en büyük etki değişkenlerinizin boyutu olacaktır. Örneğin, bir değişkenin her zaman 256'dan az olacağını (veya imzalanmışsa -128 ila 127 aralığında) olduğunu biliyorsanız, 8 bitlik bir mikroda (örn. PIC16) 8 bitlik (işaretsiz karakter veya karakter) kullanmalısınız. ) daha büyük bir boyut kullanmak çok verimsiz olacağından. Benzer şekilde 16 bitlik bir mikroda 16 bitlik değişkenler (örn. PIC24). 32 bit mikro (PIC32) kullanıyorsanız, MIPS komut kümesinde bayt, sözcük ve çift sözcük yönergeleri olduğu için gerçekten bir fark yaratmaz. Bununla birlikte, bazı 32 bitlik mikrolarda, bu tür talimatlardan yoksunlarsa, 8 bitlik bir değişkenin manipüle edilmesi, maskeleme nedeniyle 32 bitlik bir modülden daha az verimli olabilir.

Forum üyesi vsz'nin işaret ettiği gibi, varsayılan kayıt boyutundan daha büyük bir değişkene sahip olduğunuz sistemlerde (örneğin 8 bitlik bir mikroda 16 bit değişken) ve bu değişken iki iş parçacığı arasında veya temel iş parçacığı arasında paylaşılır ve bir kesme işleyici, değişken atomik üzerinde herhangi bir işlem (sadece okuma dahil) yapmalıdır, yani bir komut olarak yapılmış gibi görünmelidir. Buna kritik bölüm denir. Bunu azaltmanın standart yolu, kritik bölümü devre dışı bırakma / etkinleştirme kesme çiftiyle çevrelemektir.

32-bit sistemlerden 16-bit veya 16-bit-8-bit olmak üzere, bu tip değişkenler üzerinde artık varsayılan kayıt boyutundan daha büyük olan (ancak daha önce olmayan) herhangi bir işlemin kritik kabul edilmesi gerekir. Bölüm.

Bir PIC işlemciden diğerine giden bir diğer ana fark, çevre birimlerinin işlenmesidir. Bunun kelime boyutu ile ilgisi yoktur ve her çipte ayrılan kaynakların türü ve sayısı ile ilgilidir. Genel olarak, Microchip farklı yongalarda kullanılan aynı çevre biriminin programlanmasını mümkün olduğunca benzer yapmaya çalışmıştır (örneğin timer0), ancak her zaman farklılıklar olacaktır. Çevre kütüphanelerini kullanmak, bu farklılıkları büyük ölçüde gizleyecektir. Son fark, kesintilerin ele alınmasıdır. Yine burada Mikroçip kütüphanelerinden yardım var.


Derleme dili düzeyinde, 8 bit işlemcilerin daha az sayıda kayıt ve daha az dikey talimatlara (AVR daha RISCy istisnasıdır) sahip olma eğiliminde olduklarını, tasarım kısıtlamalarının geliştirildiklerinin bir sonucu olduğunu belirtmek gerekir. 32-bit işlemciler RISC torunları olma eğilimindedir (modern bir CISC olan Renesas'ın RX'i bir istisnadır ve Freescale'in ColdFire'ı m68k'den gelmektedir).
Paul A. Clayton

9
Sadece bu ekleme için yeni bir cevap başlatmamak için, aritmetiklerin atomik olmayı bırakması nedeniyle 32 bit'ten 16'dan 8'e 16'dan geçişin kötü sürprizlere neden olabileceğini eklemek önemli. 8 bitlik bir mikro denetleyiciye iki adet 16 bit sayı ekler ve bunları bir kesmede kullanırsanız, bunları iş parçacığı açısından güvenli hale getirmeye dikkat etmeniz gerekir, aksi takdirde kesme tetiklemelerinden önce bunun yarısını eklemeniz gerekebilir. kesme hizmeti rutininizde geçersiz bir değer.
vsz

2
@vsz - İyi bir nokta, bunu unuttum. Genellikle, varsayılan kayıt boyutundan daha büyük olan herhangi bir değişken değişken herhangi bir erişim (sadece okuma dahil) etrafındaki kesintileri devre dışı bırakmalıdır.
tcrosley

1
32-bit uC'nin genellikle 32-bit I / O arayüzlerine sahip olduğu doğru mu? Zaten daha seri bir iletişim olduğunu düşünüyorum.
clabacchio

1
@clabacchio Deneyimlerim, tüm G / Ç bağlantı noktası kayıtlarının 32 bit olarak tanımlandığını, ancak bazen en iyi 16 bit 16-31'in kullanılmadığından paralel bir bağlantı noktası hala 16 fiziksel pimdir. Diğer durumlarda, bir RTCC kaydı gibi, 32 bitin tamamı kullanılır.
tcrosley

8

8-bit ve 32-bit mikrodenetleyiciler arasındaki ortak farklardan biri, 8-bit olanların genellikle yürütme bağlamından bağımsız olarak tek bir komutla erişilebilen bir dizi bellek ve G / Ç alanına sahipken, 32-bit mikrodenetleyiciler sıklıkla çoklu komut dizisi gerektirir. Örneğin, tipik bir 8-bit mikrodenetleyicide (HC05, 8051, PIC-18F, vb.) Tek bir komut kullanarak bir port bitinin durumu değiştirilebilir. Tipik bir ARM'de (32 bit), eğer kayıt içeriği başlangıçta bilinmiyorsa, dört komutlu bir talimat dizisi gereklidir:

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

Çoğu projede, kontrolör zamanının büyük çoğunluğunu tek tek G / Ç bitlerini ayarlamak veya temizlemek dışında bir şeyler yaparak geçirecektir, bu nedenle bir port pinini temizlemek gibi işlemlerin daha fazla talimat gerektirmesi genellikle önemli değildir. Öte yandan, kod çok sayıda bağlantı noktası manipülasyonunu "büyük patlama" yapmak zorunda kalacağı zamanlar vardır ve bu tür şeyleri tek bir talimatla yapma yeteneği oldukça değerli olabilir.

Kapak tarafında, 32 bit denetleyiciler her zaman bellekte depolanabilen birçok veri yapısına verimli bir şekilde erişmek için tasarlanmıştır. Birçok 8-bit denetleyici, karşılaştırmalı olarak, statik olarak tahsis edilmemiş veri yapılarına erişmede çok verimsizdir. 32 bit denetleyici, bir komutta, tipik bir 8 bit denetleyicide yarım düzine veya daha fazla yönerge alacak bir dizi erişimi gerçekleştirebilir.


Sanýrým "bit-bang" demek istiyorsun. ARM'nin bit bandı bölgelerini (kelime işlemlerinin tek bit işlemleri olduğu) desteklediğini ve MIPS için MCU Uygulamaya Özgü Uzantı'nın Bayt talimatları (ASET / ACLR) içinde Atomik Olarak Ayarlanmış / Temizle Bit'i sağladığını belirtmek gerekir.
Paul A. Clayton

@ PaulA.Clayton: Son 20 yıldır MIPS'ye gerçekten bakmadım; Bit bandı bölgelerine gelince, bunları makul görünümlü kodda kullanmanın bir yolunu hiç bulamadım ve bunları kullanabilsem bile, bir tane delice programlama hilesi kullanmadıkça sadece bir talimat kaydedeceklerdi, bu durumda iki tane kaydedebilirler (bitin ayarlanması veya silinmesi gerekip gerekmediğine bağlı olarak çift veya tek adresli R0 yükü ve dengeleme için uygun olduğunda mağaza talimatındaki ofseti ayarlayabilirler). BTW, bit-band bölgesinin neden kelime adresleri kullandığına dair bir fikrin var mı?
supercat

@supercat: Kelime adresleme, işaretçi aboneliği yoluyla C veya C ++ 'dan bit-band bölgelerine erişmenizi sağlar ( region_base[offset])
Ben Voigt

@BenVoigt Ve bunu neden bayt adresleme ile yapamıyorsunuz? (Belki de olası bir sebep, iki bitlik ve dört bitlik işlemlerin destekleneceği beklentisini / umudunu ortadan kaldırmak olabilir.)
Paul A. Clayton

@BenVoigt: Bit sayısını 4 katına çıkarmak zorunda kalmak genellikle ekstra bir talimata mal olacaktır. Aslında, bir bit-bant alanı yerine, görmek istediğim şey, "normal" bellek erişimlerine göre sabit bir ofsette oturacak, ancak bir alana yazacağını belirten birkaç alan kümesi olurdu mümkünse sadece bitleri "ayarlar" ve diğerine yazarsa sadece "bitirir" bitleri. Veriyolunun ayrı "write-ones-enable" ve "write-zeroes-enable" kontrol bitleri varsa, bit bantlamanın izin verdiği şeylere ulaşılabilir, ancak çoğu durumda okuma-değiştirme-yazma işleminden kaçınılabilir.
supercat

6

En büyük pratik fark, tüm çipi tamamen anlamak için dokümantasyon miktarıdır. Dışarıda neredeyse 1000 sayfalık dokümanlarla gelen 8 bitlik mikrodenetleyiciler var. Bunu 1980'lerin 8 bit CPU'su ve birlikte kullanacağı popüler çevre yongaları için yaklaşık 200-300 sayfa ile karşılaştırın. Çevresel açıdan zengin bir 32 bit aygıt, parçayı anlamak için 2000-10.000 sayfa belgeden geçmenizi gerektirir. Modern 3D grafiklere sahip parçalar, 20 bin sayfalık dokümantasyonda uç noktalara ayrılıyor.

Deneyimlerime göre, modern bir 8 bitlik bir parça için olduğu gibi, belirli bir modern 32 bit denetleyici hakkında bilinmesi gereken her şeyi bilmek yaklaşık 10 kat daha uzun sürer. "Her şey" ile kastedilen, tüm çevre birimlerini, alışılmadık yollarla bile nasıl kullanacağınızı ve makine dilini, platformun kullandığı montajcıyı ve diğer araçları, ABI'leri vb.

Kısmen anlayışla pek çok tasarımın yapılması düşünülemez. Bazen önemsiz, bazen değil. Anahtarlama platformları, daha güçlü bir mimariden algılanan verimlilik kazanımları için ödediğiniz üretkenlikte kısa ve orta vadeli bir fiyat olacağı anlayışıyla yapılmalıdır. Durumunuzu gösterin.


3

Şahsen aynı ailenin uC'sini (8bit-> 32bit) yükseltme konusunda çok fazla endişe etmem ve tüm özellikleri artırıyorsunuz. Genel olarak, veri türleriyle norm dışında hiçbir şey yapmıyorum çünkü yolda devam etmek zor olabilir.

Cihaz kodunu eski sürüme geçirmek farklı bir hikaye.


3
Veri türlerinin boyutu işlemci mimarisi tarafından değil, derleyici tarafından belirlenir. Bir 8-bit işlemci, işlemek için birden fazla talimat almasına rağmen, 32-bit ints içerebilir.
Joe Hass

iyi yorum- Düzeltme nedeniyle ilk satırı kaldırdım.
Nick Tullos

@JoeHass: 8 bit işlemci için bir derleyici olabilir tanımlamak int32 bit, ya da bu konuda bile 64 olmak, ama aslında varolan herhangi 8 bitlik derleyici habersiz olduğum do tanımlamak intdaha büyük 16 bit olabilir veya teşvik etmek Daha büyük her şeye 16 bit değer.
supercat

-1

32-bit MCU'lar biri için çok daha fazla güç tüketecek. Ve daha fazla destek devresi gerektirir.

8 bitten 32 bit'e gerçekten geçiş yapılmaz ... Her ikisini de sık sık birlikte kullanmaya devam edersiniz. Sonuç olarak, iş için uygun olanı kullanmanız (ve öğrenmeniz) gerekir. ARM öğrenin, çünkü şu anda gömülü dünyayı sallıyor ve yapmaya devam edecek. AVR veya PIC'yi de öğrenin çünkü harika kart denetleyicileri.

Herhalde ARM'den x86'ya kadar AVR'lerden ARM'lere kadar çok fazla sıkıntı yaşayacaksınız, otobüsün boyutu gerçekten çok fazla fark yaratmıyor. Tüm ekstra gelişmiş donanımlar bunu yapar. Standart kesintilerden 6 öncelik seviyesine sahip vektörlü bir kesme dizisine geçmek, dört milyarın nasıl sayılacağını bulmaktan çok daha zor olacaktır.


4
32 bit MCU'ların kendilerine göre daha fazla güce aç olduklarını iddia etmenin doğru olup olmadığını bilmiyorum. En az bir şirketin ( enerji mikro ) tüm ürün serisi ultra düşük güçlü MCU'lardır ve hepsi 32-bit ARM çekirdektir.
Connor Wolf

3
Sadece bir cr2032 üzerinde 7 yıl boyunca çalışması gereken bir stm32l1 devresi çalıştı
Scott Seidman

2
32 bit MCU'nun daha fazla "destek devresine" ihtiyacı olduğu yorumunu haklı gösterebilir misiniz? Sanırım burada birkaç haksız görüş dile getiriyorsunuz.
Joe Hass

1
Ayrıca, vektörlü kesinti yorumunuz çok anlamlı değildir, çünkü 8 bitlik mikro denetleyicilerde birden fazla öncelik düzeyi elde edebilirsiniz (3 öncelik düzeyine sahip Atmel xmega MCU'lara bakın) ve her donanım aygıtında kendi bağımsız vektörleri zaten.
Connor Wolf

2
Elektrikli bir araç için akıllı pil şarj cihazını kontrol etmek için 32 bit Cortex-M0 işlemci kullanıyorum. Tek bir 3,3 V besleme kullanır. Dahili bir osilatör ve PLL'ye sahip, bu yüzden bir kristale bile ihtiyacım yok. 28 pimli bir DIP paketi kullanıyorum ama isterseniz 8 pimli bir DIP'de bir Cortex-M0 alabilirsiniz. Bu tipik bir PIC veya AVR'den nasıl daha karmaşık olabilir?
Joe Hass
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.