MPLabX IDE 5.4'te en basit montaj dosyası nasıl oluşturulur
MPLabX IDE 5.4'te montaj kodlamayı öğrenmeye başladım. Herhangi bir donanım, simülatör veya hata ayıklayıcı bağlamadan, sadece bir nesne kodu dosyası oluşturmak ve bir montaj dosyasından bir liste dosyası oluşturmak istiyorum - sadece IDE'nin çalışıp çalışmadığını kontrol etmek için. Ancak mümkün olan en basit montaj hatlarını oluştururken bile belirsiz hata mesajları almaya devam ettim.
Şekil [1-6] 'da gösterildiği gibi, MPLabX IDE'nin XC8 entegrasyonu ile birlikte düzgün bir şekilde kurulmasını sağlamalıyım (bu, MPASM assembler için pic-as assembly derleyicisini veya başka bir adı paketliyor gibi görünüyor - saatlerce uğraştıktan sonra) ve neden bir MPASM kodu için bir C derleyicisine ihtiyacım olduğunu araştırıyorum, ta ki bunların paketlendiğini anlayana kadar). Daha sonra tek bir yorum satırı ve bir end
talimat içeren bir montaj dosyası oluşturmayı test ettim . Derleme başarıyla oluşturuldu, ancak listeleme dosyası için hiçbir yerde bulamıyorum (tüm dizinlerde arama yapan bir * .lst dosyası bulunamadı).
Daha önce herhangi bir talimat ekler koymaz end
, inşa süreci Şekil [7] ' de gösterildiği gibi başarısız oldu .
- Montaj kodum neden oluşturulmuyor?
- Oluşturma sürecim (başarısız veya başarılı) neden herkes gibi liste dosyasını oluşturmadı


[DÜZENLE]
Montaj kodu dosyası burada. Proje [1-6]. Adımdan oluşturulmuştur. Üç satırlık talimat içeren yeni bir montaj dosyası ( FooFile.asm ) oluşturdum - org, clrw ve end.

Yanıtlar
Microchip, MPLABX v5.40'ın en son sürümünü kullanarak 8 bitlik birleştirme dili uygulamaları geliştirmeyi çok zorlaştırdı.
Yardımcı olmak için burada bulabileceğiniz bir PIC16F84A örnek projesi hazırladım .
Bu pic-as (v2.20) kaynak kodudur:
;
; File: main.S
; Target: PIC16f84A
; Author: dan1138
; Date: 2020-08-20
; Compiler: pic-as(v2.20)
; IDE: MPLABX v5.40
;
; Description:
;
; Example project for the PIC16F84A controller using the pic-as(v2.20) tool chain.
;
; Add this line in the project properties box, pic-as Global Options -> Additional options:
; -Wa,-a -Wl,-pPor_Vec=0h,-pIsr_Vec=4h
;
; PIC16F84A
; +----------:_:----------+
; <> 1 : RA2 RA1 : 18 <>
; <> 2 : RA3 RA0 : 17 <>
; <> 3 : RA4/T0CKI OSC1 : 16 <- 4MHz crystal
; ICSP_VPP -> 4 : MCLR OSC2 : 15 -> 4MHz crystal
; GND -> 5 : GND VDD : 14 <- 5v0
; <> 6 : RB0/INT PGD/RB7 : 13 <> ICSP_PGD
; <> 7 : RB1 PGC/RB6 : 12 <> ICSP_PGC
; <> 8 : RB2 RB5 : 11 <>
; <> 9 : RB3 RB4 : 10 <>
; +-----------------------:
; DIP-18
PROCESSOR 16F84A
PAGEWIDTH 132
RADIX DEC
#include <xc.inc>
; PIC16F84A Configuration Bit Settings
config FOSC = HS ; Oscillator Selection bits (HS oscillator)
config WDTE = OFF ; Watchdog Timer (WDT disabled)
config PWRTE = OFF ; Power-up Timer Enable bit (Power-up Timer is disabled)
config CP = OFF ; Code Protection bit (Code protection disabled)
skipnc MACRO
btfsc STATUS,STATUS_C_POSITION
ENDM
skipnz MACRO
btfsc STATUS,STATUS_Z_POSITION
ENDM
;
; Power-On-Reset entry point
;
PSECT Por_Vec,global,class=CODE,delta=2
global resetVec
resetVec:
PAGESEL main ;jump to the main routine
goto main
;
; Data space use by interrupt handler to save context
PSECT Isr_Data,global,class=RAM,space=1,delta=1,noexec
;
GLOBAL WREG_save,STATUS_save
;
WREG_save: DS 1
STATUS_save: DS 1
PCLATH_save: DS 1
;
; Interrupt vector and handler
PSECT Isr_Vec,global,class=CODE,delta=2
GLOBAL IsrVec
;
IsrVec:
movwf WREG_save
swapf STATUS,W
movwf STATUS_save
movf PCLATH,W
movwf PCLATH_save
;
IsrHandler:
;
IsrExit:
movf PCLATH_save,W
movwf PCLATH
swapf STATUS_save,W
movwf STATUS
swapf WREG_save,F
swapf WREG_save,W
retfie ; Return from interrupt
;objects in bank 0 memory
PSECT MainData,global,class=RAM,space=1,delta=1,noexec
max: DS 1 ;reserve 1 byte for max
tmp: DS 1 ;reserve 1 byte for tmp
/* find the highest PORTB value read, storing this into the object max */
PSECT MainCode,global,class=CODE,delta=2
main:
BANKSEL TRISB ;starting point
movlw 0xFF
movwf BANKMASK(TRISB) ;
BANKSEL max
clrf BANKMASK(max)
loop:
BANKSEL PORTB ;read and store port value
movf BANKMASK(PORTB),w
BANKSEL tmp
movwf BANKMASK(tmp)
subwf max,w ;is this value larger than max?
skipnc
goto loop ;no - read again
movf BANKMASK(tmp),w ;yes - record this new high value
movwf BANKMASK(max)
goto loop ;read again
END resetVec
Git veri havuzumdan MPLABX projesinin tamamının bir kopyasını edinirseniz lütfen. MPLABX'te bir assembly dili projesi kurma hakkında öğrenmeniz gereken, Microchip'in henüz yeterince ayrıntılı olarak belgelemediği şeyler var.
Mikroçip varsa ben çalışan değilim ve onlar için bunu yapacak kadar bana ödeme yapamadılar.
Okullar sonbahar oturumlarında PIC montaj dilini öğretmeye başladıkça, MPLABX araçlarıyla ilgili sorunların daha fazla sorun haline gelmesini bekliyorum. Bu cevapla amacım, daha fazla öğrenciye yardım etmeye çalışmak, topal aletlerle ilgili önemsiz sorunlar nedeniyle hüsrana uğramamak ve başarısız olmaktır.
Microchip'in MPLab X ve XC8 için sahip olduğu belgeler muhtemelen okuduğum en kötü belgelerden bazıları. MPLab X IDE 5.4'te çalışan montajcıyı elde etmek için birden fazla kaynaktan okuduklarımı birleştirmek zorunda kaldım ve bazı tahminlerle. İşte hata veya uyarı mesajları olmadan birleştirilecek montaj kodu.
PROCESSOR 16F84A
#include <xc.inc>
PSECT code
org 00
loop: clrw
end loop
Tüm okuduğum öğreticiler ve kitaplar , XC8'deki resimdeki gibi, mevcut yerine MPASM assembler'ı kullanıyor. MPASM ve daha eski MPLab ile, saf montaj kodu sadece oluşturulur. Ancak mevcut XC8 ve pic-as ile, / Applications / microchip / xc8 / v2'yi işaret eden bir yönergeye sahip olduğu /Applications/microchip/xc8/v2.20/pic/include/xc.inc'i dahil ederek başlamalısınız. 20 / pic / include / pic.inc sırayla /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc'e işaret eden ve sonunda /Applications/microchip/xc8/v2.20/ PSECT'i tanımlayan pic / include / proc / pic16f84a.inc :
psect udata,class=RAM,space=SPACE_DATA,noexec
psect udata_bank0,class=BANK0,space=SPACE_DATA,noexec
psect code,class=CODE,space=SPACE_CODE,delta=2
psect data,class=STRCODE,space=SPACE_CODE,delta=2,noexec
psect edata,class=EEDATA,space=SPACE_EEPROM,delta=2,noexec
Belirsiz sebep ne olursa olsun psect
, montaj kodunun etrafına sarılması gerekir . Açıklama şu şekilde verilmiştir (ne hakkında konuştuğunu veya neden bir C işlev çağrısını parantez sarma gibi bir derleme kodunu sarmam gerektiğine dair hiçbir fikrim yok):
Psects - program bölümlerinin kısaltması - programın ilgili bölümlerini gruplayan ve tutan kaplardır, bu parçaların kaynak kodu kaynak dosyada fiziksel olarak bitişik olmayabilir veya hatta birkaç modüle yayılmış olabilir. Bağlayıcı tarafından belleğe yerleştirilen en küçük varlıklardır.
Listeleme dosyasına gelince: listeleme dosyasını okuma veya çıktı alma talimatı MPLAB® X IDE Kullanım Kılavuzunda (Bölüm 5.16 sayfa 127) belirtilmiştir: Pencere> Hata Ayıklama> Çıktı> DisassemblyListingFile . Alternatif olarak, listeleme dosya outputted edilebilir /MyProject/disassembly/listing.disasm (değil * içinde .lst ekleyerek Mikroçip forum ya da rehber anlaşılacağı! Olarak formatında) -code=0h -Wa,-a
içinde / pic-asLinker / CustomLinkerOptions ProjectProperties (söz edilmez veya XC8 komut satırı altında derleme örnekleri sunduğu MPLAB® XC8 PIC Assembler Kullanım Kılavuzunu Gömülü Mühendisler için okuyarak nereye yerleştireceğimi tahmin ettim. IDE altında oluşturulan dosyaların hiçbiri tüm ayrıntıları sağlamaz - talimatların vektör adreslerini bile göstermez!
Disassembly Listing for FooProject
Generated From:
/Users/*******/Desktop/Foo/dist/default/production/Foo.production.elf
--- /Users/*******/Desktop/Foo/FooFile.asm ------------------------------------------------------------
1: PROCESSOR 16F84A
2: #include <xc.inc>
3: PSECT code
4: ; a commend
5: org 00
01FF 0103 CLRW 6: loop: clrw
7: end loop
Kendi cevabımı kabul etmeyeceğim. Birisi bulmamı ele alabilir veya psect'in neden orada olduğunu ve vektör adreslerini göstermek için listeleme dosyasını nasıl alacağımı açıklamaya yardımcı olabilirse , cevabını kabul ederim.
[DÜZENLE] -Wa, -a seçeneğini kullanarak MPLabX 5.4 veya X8 (pis-as) CLI ile listeleme dosyasını çıktı almak için.
// Derleyicinin C ön işlemcisini önceden işleyebilmesi için kaynak dosya * .S uzantısı ile bitmelidir $ sudo pic-as -mcpu = 16F84A -Wa, -a SourceFileName.S -o OutputFolderName / OutputFileName
