2014 dxdy logo

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

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




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


20/08/14
11776
Россия, Москва
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
11776
Россия, Москва
А Вы 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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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