Перемещение элементов инициализации в MPLABX с помощью компилятора XC8 - PullRequest
1 голос
/ 07 апреля 2020

Я разрабатываю загрузчик (в C, с несколькими операторами asm благодаря встроенной сборке) для PIC16F876, используя MPLABXv5.15 в качестве IDE и XC8v2.10 в качестве компилятора.

Мне нужен код загрузчика в конце, за исключением его вектора сброса, который остается в 4 первых инструкциях. Чтобы компоновщик не размещал код в начале, я добавил параметр по умолчанию, -4-FFF в поле диапазонов ПЗУ ( Свойства проекта> Глобальные параметры XC8> Линкер XC8> Модель памяти > ПЗУ ), что приводит к дополнительной опции -mrom = default, -4-FFF и работает до сих пор ...

За исключением трех командных слов, которые помещаются в псевдониме end_init, который расположен в 0x4. Погрузившись в сгенерированный файл .map, я обнаружил проблему в сгенерированной команде связывания:

-W-3 --edf=C:\Program Files (x86)\Microchip\xc8\v2.10\pic\dat\en_msgs.txt \   
-cs -h+dist/default/production\PJP_BLDR.X.production.sym \   
--cmf=dist/default/production\PJP_BLDR.X.production.cmf -z -Q16F76 \   
-oC:\Users\ALLART~1\AppData\Local\Temp\sj40.2 --defsym=__MPLAB_BUILD=1 \   
-Mdist/default/production/PJP_BLDR.X.production.map -E1 -ver=XC8 \
--acfsm=1493 -ASTACK=0110h-016Fh -pstack=STACK -p_entryTrap_text=FFFh \   
-ACODE=00h-03h,01000h-017FFhx2 -ASTRCODE=00h-03h,01000h-01FFFh \  
-ASTRING=00h-03h,01000h-010FFhx16 -ACONST=00h-03h,01000h-010FFhx16 \   
-AENTRY=00h-03h,01000h-010FFhx16 -ACOMMON=070h-07Fh -ABANK0=020h-06Fh \   
-ABANK1=0A0h-0EFh -ABANK2=0110h-016Fh -ABANK3=0190h-01EFh \  
-ARAM=020h-06Fh,0A0h-0EFh,0110h-016Fh,0190h-01EFh \   
-AABS1=020h-07Fh,0A0h-0EFh,0110h-016Fh,0190h-01EFh -ASFR0=00h-01Fh \   
-ASFR1=080h-09Fh -ASFR2=0100h-010Fh -ASFR3=0180h-018Fh \   
-preset_vec=00h,intentry=04h,init,end_init -ppowerup=CODE -pcinit=CODE \   
-pfunctab=ENTRY -ACONFIG=02007h-02007h -pconfig=CONFIG -DCONFIG=2 \   
-AIDLOC=02000h-02003h -pidloc=IDLOC -DIDLOC=2 -DCODE=2 -DSTRCODE=2 \   
-DSTRING=2 -DCONST=2 -DENTRY=2 -k dist/default/production\startup.o \
dist/default/production\PJP_BLDR.X.production.o

Где вы можете найти следующий аргумент:

-preset_vec=00h,intentry=04h,init,end_init

Это означает, что согласно В руководстве по XC8 ( здесь ) ISR, если он присутствует, будет помещен в 0x4 (поскольку это вектор прерывания), а psects init и end_init будут размещены сразу после него (см. Раздел ). 7.2.18 руководства), независимо от того, какие диапазоны ПЗУ были указаны ранее, так как указано, что psect явно имеет приоритет над диапазонами ПЗУ (см. раздел 4.8.53 руководства). Пока все хорошо, все логично, и мне нужно только найти способ изменить это! Оказывается, есть один! Brilliant!

Как указано в Руководстве XC8 (см. раздел 4.8.6 руководства, в котором подробно рассматривается ТОЧНО мой вопрос), мне нужно только указать -L-pend_init = в дополнительных параметрах компоновщика ( Свойства проекта> Глобальные параметры XC8> Компоновщик XC8> Дополнительные параметры> Дополнительные параметры компоновщика ) (см. раздел 4.9.3.4 руководства).

И тут возникает проблема. Что бы я ни делал, ничего не меняется. Команда компоновщика в файле .map остается прежней, и этот psect end_init остается расположенным в 0x4, несмотря ни на что. Команда, переданная компоновщику, выглядит следующим образом:

C:\Program Files (x86)\Microchip\xc8\v2.10\bin\xc8-cc.exe"  -mcpu=16F76 -Wl,-Map=dist/default/production/PJP_BLDR.X.production.map  -DXPRJ_default=default  -Wl,--defsym=__MPLAB_BUILD=1  -fno-short-double -fno-short-float -mrom=default,-4-FFF -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -I"./inc" -mext=cci -Wa,-a -msummary=+psect,+class,+mem,+hex,-file -L-pend_init=200h  -ginhx032 -Wl,--data-init -mkeep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mdownload -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto      -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/PJP_BLDR.X.production.elf  build/default/production/src/main.p1 build/default/production/src/serial.p1 build/default/production/src/nsp.p1 build/default/production/src/rs485slave.p1 build/default/production/src/slip.p1

Таким образом, кажется, что компоновщик хорошо получает эту дополнительную команду. Однако файл .map не изменился, поэтому я не очень хорошо понимаю, как это должно продолжаться. Но это путь к go согласно инструкции. Вы можете заметить, что дополнительная команда, переданная компоновщику, имеет вид -L-pend_init = 200h , потому что из отчаяния я просто перепробовал множество комбинаций, даже помещая эти аргументы в класс CODE и помещая дополнительную введите команду в поле Дополнительные параметры глобальных параметров XC8, параметров компоновщика XC8 и подменю параметров компилятора XC8. Ничего не помогло ...

Я нашел эту ветку, но она мне не помогает ( здесь ).

Я бы разместил сообщение на форумах по микрочипам , но прошло уже 3 часа, и они еще не одобрили мою регистрацию (без обид, значит, я просто хочу опубликовать, прежде чем прекратить сегодняшнюю работу;))

Спасибо всем, кто собирается читать до конца! Спасибо заранее и хорошего дня!

PS: Я знаю, что вы можете заметить, что команда, передаваемая компоновщику, задает -mcpu = 16F76 и что я сказал PIC16F876 (и что 16F76 не позволяет использовать загрузчик, так как он не может изменять свой собственный флаг sh), но это единственное устройство, которое у меня дома, и я только экспериментирую с размещением кода там, где я хочу. Я не думаю, что это вообще связано с моей проблемой.

PPS: Кажется, я не могу сказать привет, каждый раз, когда я редактирую этот пост, чтобы добавить его в начале, ничего не происходит ... Извините, что не поздоровался в самом начале;)

Редактировать 1: Кажется, это ошибка в пакете xc8 (я не знаю, исходит ли он от компоновщика Hlink или от самого драйвера xc8). Я попытался с xc8v1.45, и он работает как ожидалось.

...