Как собрать простейший файл сборки в MPLabX IDE 5.4

Aug 19 2020

Я только начал изучать кодирование сборки в MPLabX IDE 5.4. Без подключения какого-либо оборудования, симулятора или отладчика я просто хочу создать файл объектного кода и сгенерировать файл листинга из файла сборки - просто чтобы проверить, работает ли IDE. Но я продолжал получать непонятные сообщения об ошибках даже при построении простейших сборочных линий.

Как показано на рис. [1–6] , мне нужно правильно установить MPLabX IDE вместе с интеграцией XC8 (который, кажется, включает в себя компилятор сборки pic-as или другое имя для ассемблера MPASM - после того, как я часами боролся, спрашивая и ищу, почему мне нужен компилятор C для кода MPASM, пока я не понял, что они были объединены). Затем я протестировал сборку файла сборки с одной строкой комментария и одной endинструкцией. Сборка была собрана успешно, но я нигде не могу найти файл листинга (ни один файл * .lst не был найден во всех каталогах).

Как только я добавляю какие-либо инструкции end, процесс сборки завершился неудачно, как показано на рисунке [7] .

  1. Почему мой ассемблерный код не строится?
  2. Почему мой процесс сборки (неудачный или успешный) не сгенерировал файл списка, как все

[РЕДАКТИРОВАТЬ]
Вот файл кода сборки. Проект был создан на шаге [1-6]. Я только что создал новый файл сборки ( FooFile.asm ) с тремя строками инструкций - org, clrw и end.

Ответы

7 Dan1138 Aug 21 2020 at 03:59

Компания Microchip сильно усложнила разработку приложений на 8-битном языке ассемблера с использованием последней версии MPLABX v5.40.

Чтобы помочь, я создал пример проекта PIC16F84A, который вы можете найти здесь .

Это исходный код pic-as (v2.20):

    ;
    ; 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

Если вы можете получить копию всего проекта MPLABX из моего репозитория git. Есть некоторые вещи, которые вам нужно узнать о настройке проекта на ассемблере в MPLABX, которые Microchip еще не задокументировала достаточно подробно.

Я не являюсь сотрудником Microchip, и они не могли заплатить мне достаточно, чтобы сделать это за них.

Я ожидаю, что проблемы с инструментами MPLABX станут еще большей проблемой, когда школы начнут преподавать язык ассемблера PIC на осенних сессиях. Моя цель с этим ответом - попытаться помочь большему количеству студентов не разочароваться и не потерпеть неудачу из-за тривиальных проблем с некачественными инструментами.

2 KMC Aug 19 2020 at 23:33

Документация Microchip для MPLab X и XC8, вероятно, одна из худших, что я когда-либо читал. Мне пришлось объединить то, что я прочитал из нескольких источников, и с некоторыми предположениями, просто чтобы заставить ассемблер работать в MPLab X IDE 5.4. Итак, вот код сборки, который собирается без сообщений об ошибках или предупреждениях.

PROCESSOR 16F84A
#include <xc.inc>
PSECT   code
        org     00
loop:   clrw
        end     loop

Все учебники и книги, которые я прочитал, используют ассемблер MPASM вместо его текущей замены, как в XC8. С MPASM и более ранней версией MPLab чистый ассемблерный код будет просто построен. Но с текущим XC8 и pic-as вам нужно начать с включения /Applications/microchip/xc8/v2.20/pic/include/xc.inc, где есть директива, указывающая на / Applications / microchip / xc8 / v2. 20 / pic / include / pic.inc, в котором, в свою очередь, есть директива, указывающая на /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc, которая в конечном итоге указывает на /Applications/microchip/xc8/v2.20/ pic / include / proc / pic16f84a.inc , определяющий PSECT :

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

По какой-то непонятной причине psectкод сборки должен оборачиваться. Объяснение дается следующим образом (я понятия не имею, о чем идет речь или почему мне нужно обернуть код сборки, как я заключаю в скобки вызов функции C):

Псекты - сокращение от программных разделов - представляют собой контейнеры, которые группируют и содержат связанные части программы, даже если исходный код для этих частей может физически не примыкать к исходному файлу или даже может быть распределен по нескольким модулям. Это самые маленькие объекты, помещаемые компоновщиком в память.

Что касается файла листинга: инструкция по чтению или выводу файла листинга отчасти упоминается в Руководстве пользователя MPLAB® X IDE (раздел 5.16 на стр. 127): Window> Debugging> Output> DisassemblyListingFile . В качестве альтернативы файл листинга можно вывести в /MyProject/disassembly/listing.disasm (не в формате * .lst , как предлагает форум Microchip или их руководство!), Вставив-code=0h -Wa,-a в ProjectProperties / pic-asLinker / CustomLinkerOptions (нет упоминания или инструкции в любом из их руководств пользователя, и я просто случайно угадаю, где что вставить, из чтения MPLAB® XC8 PIC Assembler User's Guide for Embedded Engineers ), где приведены примеры компиляции из командной строки XC8. Ни один из файлов листинга, сгенерированных в среде IDE, не предоставляет всех подробностей - он даже не показывает векторные адреса инструкций!

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
 

Я не приму своего ответа. Если кто-то может помочь решить мою находку или объяснить, почему существует psect и как получить файл листинга для отображения векторных адресов, я приму его / ее ответ.

[РЕДАКТИРОВАТЬ] Для вывода файла листинга на MPLabX 5.4 или с X8 (pis-as) CLI с использованием опции -Wa, -a.

// Исходный файл должен заканчиваться расширением * .S, чтобы компилятор мог предварительно обработать препроцессор C $ sudo pic-as -mcpu = 16F84A -Wa, -a SourceFileName.S -o OutputFolderName / OutputFileName