2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение30.12.2023, 17:37 
Заслуженный участник


20/08/14
11760
Россия, Москва
Alex-Yu в сообщении #1624436 писал(а):
А программа называется __sdcc_gsinit_startup . Написан ее вызов в точке старта. Правда, ее текст я вижу только в дизассемблере.
Для PIC14 это имя присутствует в файлах SDCC\lib\pic14\libsdcc.lib и libsdcce.lib. Видимо оттуда код и подлинковывается.
Рекомендую пошариться по каталогу SDCC\lib\src\pic16\startup, там есть процедуры инициализации в исходном коде.
Да, это по версии от сентября 2018, в более новых могло что-то измениться.
С самим компилятором не работал, так что по теме подсказать нечего.

-- 30.12.2023, 17:49 --

По конфигурационному слову, подробное описание как надо делать есть в SDCC\doc\sdccman.txt в разделе 4.5.4 (PIC14) и в 4.6.17 (для PIC16+).
Думаю в этом файле ещё куча интересных вопросов освещено ...

-- 30.12.2023, 17:56 --

А вот здесь кажется описано как подменять стартовую процедуру на свою (для другого МК, но суть-то одна): https://sourceforge.net/p/sdcc/discussi ... /a2ed0dd5/

-- 30.12.2023, 18:00 --

В доступном онлайн sdccman.pdf свежей версии нумерация разделов чуть другая, 4.6.4 для PIC14 и 4.7.17 для PIC16.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение30.12.2023, 18:14 
Заслуженный участник


21/08/10
2462
Вроде сделал я все, что хотел. Никакого лишнего кода. Небольшая головная ассемблерная программа и на С функции. В головной программе можно написать сколько хочешь перемещаемых программных секций (но надо давать им имена, если не одна) и сколько хочешь абсолютных секций (лучше их делать дерективой org, хотя code тоже можно, только адрес указать). В т.ч. секцию, содержащую единственное конфигурационное слово по адресу 2007. Забавно (думаю, полезно знать другим), что в качестве линкера надо использовать сам sdcc, хотя головная программа написана на ассемблере и транслировалась с помощью gpasm. Просто подставляем на вход sdcc перемещаемые .o файлы (головной, полученный из-под ассемблера и функции из-под С) и все. Не забыть ключи -с при трансляции. Никак иначе не работает. Довольно странно (я долго ничего понять не мог!), что файл .lst при этом переписывается, в него добавляются и функции тоже, хотя первоначально он создается ассемблером и никаких функций в нем, естественно, нет. В общем без некоторой интегрированости (которую я терпеть не могу!) и тут не обошлось. Но ничего, ее тут совсем немного, стерплю. Хотя, убей бог, не могу понять людей, которые так делают! Компилятор -- это одно, линкер -- другое. Нет же, надо совместить зачем-то... :( Ну да этот бред еще с gcc пошел...

-- Сб дек 30, 2023 22:19:10 --

Dmitriy40 в сообщении #1624450 писал(а):
По конфигурационному слову, подробное описание как надо делать есть в SDCC\doc\sdccman.txt в разделе 4.5.4 (PIC14)


Да, действительно. Только у меня это раздел 4.6.4. Ну да с головной программой на ассемблере это не надо. Хотя знать полезно, спасибо.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение31.12.2023, 00:18 
Заслуженный участник


21/08/10
2462
Есть одна особенность для случая, когда головная программа на ассемблере. Если мы хотим использовать типы длиннее 1 байта, то в головной программе в блоке udata_ovr надо определить глобальные переменные STK00, STK01 и т.д. Всего столько, сколько максимальная длина переменных минус один (один байт -- аккумулятор). Это как бы расширения аккумулятора, как я понял.

В целом все получается простенько (если разобраться) и компактненько, без всяких там не вразумительных модулей инициализации.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение03.01.2024, 14:10 
Заслуженный участник


21/08/10
2462
Dmitriy40 в сообщении #1624450 писал(а):
А вот здесь кажется описано как подменять стартовую процедуру на свою (для другого МК, но суть-то одна): https://sourceforge.net/p/sdcc/discussi ... /a2ed0dd5/


То, что там написано, оказалось довольно бесполезно без некоторого добавления (во всяком случае для PIC). В принципе, можно в С определить функцию _sdcc_gsinit_startup() и тогда библиотечная такая функция прилинковываться не будет. На первый взгляд все хорошо: управление изначально передается на _sdcc_gsinit_startup, которую мы сами написали, ничего лишнего не вставляется. Но делать почти ничего при этом нельзя (но лишь почти, мелочи можно). Дело в том, что для передачи аргументов длиннее 1 байта надо определить глобальные символы STK00, STK01 и т.д. Это, вместе с аккумулятором w, составляет стек передачи аргументов. А эти STK00, STK01 и т.д. средствами С определить никак не получается. Т.е. определить-то можно, но компилятор их переделает (в объектном модуле) в _STK00 и т.д. Он ко всем символам добавляет _ в начало (кстати, это надо иметь в виду при обращении к Сишным символам из ассемблера, например при вызове С-функций). И хоть тресни, ничего не получается, линковка не проходит, приходится ассемблерный модуль все равно добавлять. Хотя бы для того, чтобы определить эти STK00 и пр. (они, кстати, нужны даже тогда, когда мы сами не описываем передачу длинных аргументов, обращение к подпрограммам умножения и т.п. все равно обычно генерируется, а там эти символы тоже нужны). А если ассемблерный модуль добавлять, то там и начальную передачу управления можно сделать, я выше писал как.

Мне пока не удается обойтись без ассемблерного объектного модуля, если хотеть, чтобы не добавлялся библиотечный стартап, но при этом был стек аргументов длиннее 1 байта (который нужен в т.ч. для умножения и т.п.). Есть идеи как? Хотя, конечно, это уже чисто "академический" вопрос, прилинковать небольшую ассемблерную программку не составляет никакой практической проблемы.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение03.01.2024, 15:16 
Заслуженный участник


20/08/14
11760
Россия, Москва
А Вы libsdcc.lib подключаете к проекту? В разделе 4.6.8.4 (error: missing definition for symbol “__gptrget1”) сказано что это нужно делать для процедур умножения/деления/прочих, может как раз STK0X в частности и подключатся?
Или добавлять ключик --use-non-free (раздел 4.6.5) для использования версии библиотек SDCC\non-free\lib\pic14, где возможно и определены некоторые нужные имена?
В любом случае я этим компилятором не пользуюсь, так что реально помочь не могу.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение03.01.2024, 15:46 
Заслуженный участник


21/08/10
2462
Dmitriy40 в сообщении #1624789 писал(а):
А Вы libsdcc.lib подключаете к проекту? В разделе 4.6.8.4 (error: missing definition for symbol “__gptrget1”) сказано что это нужно делать для процедур умножения/деления/прочих, может как раз STK0X в частности и подключатся?
Или добавлять ключик --use-non-free


libsdcc не подключал, думал, что по умолчанию стандартная библиотека. --use-non-free стоит. Попробовал подключать явно, причем все библиотеки по очереди, не помогло.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение03.01.2024, 17:52 
Заслуженный участник


21/08/10
2462
И с gplink я тоже разобрался. Запишу здесь, а то забуду же. Да и другим может быть полезно. Все просто: не хватало ключей -i задающих директории для поиска. И библиотеки тоже надо указать. Какие именно директории и библиотеки? Легко определить: делаем линковку с помощью sdcc, но с ключом -V (также надо указать файл для вывода сообщений, по умолчанию на стандартный не выводит). Тогда sdcc показывает, как именно он вызывает gplink. Кое-что там можно убрать, повторы. Но зато, делая вызов gplink непосредственно, а не через sdcc, можно получить карту загрузки, полезная вещь. Просто даем ключ -m, sdcc такой ключ игнорирует.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение06.01.2024, 07:52 
Аватара пользователя


28/10/21
100
Alex-Yu в сообщении #1624802 писал(а):
Но зато, делая вызов gplink непосредственно, а не через sdcc, можно получить карту загрузки, полезная вещь. Просто даем ключ -m, sdcc такой ключ игнорирует.


В смысле "игнорирует"? В sdcc ключ -m может просто знaчить что-то другое. Передать ключи линкеру через sdcc можно при помощи ключа -Wl, то есть в данном случае -Wl-m.

 Профиль  
                  
 
 Re: компилятор SDCC и микроконтроллеры PIC
Сообщение06.01.2024, 18:02 
Заслуженный участник


21/08/10
2462
TheRuinedMap в сообщении #1624993 писал(а):
В смысле "игнорирует"? В sdcc ключ -m может просто знaчить что-то другое.


Именно игнорирует. Пишет что-то вроде unknown, ignored. Про -Wl буду знать, спасибо. Хотя теперь такой проблемы нет, линковать через sdcc я не буду, к любой интегрированости отношусь очень плохо и по возможности ее избегаю. Хотя избегать не всегда получается.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Yustas


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group