2014 dxdy logo

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

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




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


21/08/10
2404
Микроконтроллеры (обычно PIC) я всегда программировал на ассемблере. Но тут понадобилось написать программку, где много арифметики с длинными числами. Можно, конечно, и на ассемблере, тем более, что в моем привычном gpasm есть макросредства. Но что-то захотелось на С. MPLAB я терпеть не могу (за его интегрированость всего со всем), поставил SDCC. Ну что работает, программу писать можно. Одна только "мелочь": а как записать конфигурационное слово? Которое по адресу 2007Н... Тип генератора, режим вочдог и пр. Я уж и инлайнассемблер пробовал и так и эдак. Ну никак (проверяю, дизассемблируя полученный нех-код, нету там адреса 2007H, хотя в инлайнассемблере org 0x2007 и далее я писал). И что делать? Я, конечно, могу поправить и нех-код, в конце-концов можно взять ассемблерный код, сгенерированный С-компилятором и текстовым редактором вставить его в "честную" ассемблерную программу, но как-то это не камильфо...

Кстати, первоначальную инициализацию, которую он вставляет по умолчанию, тоже хотелось бы чтобы компилятор не делал, генерировал только тот код, что я написал. Тоже никак и чтение документации не помогает. И вообще, как средствами инлайнассемблера делать куски кода, не относящиеся к какой-либо С-функции (в т.ч. main)? С абсолютными адресами. У меня не получается. Может есть и на эту тему идеи?

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


02/08/11
6893
Я не знаю почему не работает то, что вы делаете, но может сделать что-то вроде
Используется синтаксис C
uint16_t volatile *p = (uint16_t volatile *)0x2007;
*p = ...
 

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


21/08/10
2404
warlock66613 в сообщении #1624400 писал(а):
но может сделать что-то вроде


Если я правильно понимаю, то это запись по этому адресу на этапе исполнения. Это, конечно, работать не будет (если так). Нет такого адреса на этапе исполнения! По этому адресу надо записать на этапе прошивки контроллера. Это спецадрес управления режимом работы контроллера. А в "нормальном" адресном пространстве его просто нету.

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


02/08/11
6893
Alex-Yu, тогда совершенно непонятно как вы хотели сделать это с помощью инлайн ассемблера.

Попробуйте вставить в программу

Используется синтаксис C
volatile __xdata uint16_t __at(0x2007) XXX = ...;


-- 30.12.2023, 15:25 --

Alex-Yu в сообщении #1624382 писал(а):
Кстати, первоначальную инициализацию, которую он вставляет по умолчанию, тоже хотелось бы чтобы компилятор не делал
Попробуйте опцию --no-std-crt0.

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


21/08/10
2404
В принципе я проблему победил. Можно напсисать такую как бы функцию:

void cf(void)
{
__asm
org 0x2007
dw 0x1a
__endasm
}

Естественно, никакого обращения к этой функции не должно быть. Но в нех-файле нужный код появится. Правда, этот слишком умный компилятор (ох уж этот ум, которого никто не просил!) добавит еще и return по адресу 2008. В принципе, адреса 2008 вообще нет (хотя кто их знает, неописанные функции!), должно работать. В общем тоже не камильфо. Можно написать на ассемблере коротенький модуль

org 2007h
dw 1ah
end

оттранслировать его в перемещаемом режиме и прилинковать к С-программе. Тоже, судя по дизасемблерному листингу, все получается (и уже без лишнего адреса 2008). Хотя директива org, абсолютная адресация в перемещаемом модуле.... Черт знает что! Но работает :) Хочется полностью добропорядочного решения, которого я пока не знаю.

-- Сб дек 30, 2023 18:26:22 --

warlock66613 в сообщении #1624407 писал(а):
Попробуйте опцию --no-std-crt0.


ОК, попробую, спасибо.

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


02/08/11
6893
Alex-Yu в сообщении #1624382 писал(а):
Может есть и на эту тему идеи?
Сделать naked функцию, помещённую в отдельный сегмент, и затем опциями определить этот сегмент по желаемому адресу.

-- 30.12.2023, 15:30 --

Alex-Yu в сообщении #1624410 писал(а):
Можно напсисать такую как бы функцию:
Сделайте её naked. Naked функции — это функции без пролога и эпилога. Поищите в документации как это делается. (Конечно это всё равно довольно странный способ и бы обеспокоился как минимум областью действия директивы org.)

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


21/08/10
2404
warlock66613 в сообщении #1624407 писал(а):
Попробуйте опцию --no-std-crt0.


Не знает он такой опции.

-- Сб дек 30, 2023 18:40:55 --

warlock66613 в сообщении #1624412 писал(а):
Сделайте её naked. Naked функции — это функции без пролога и эпилога. Поищите в документации как это делается.


ОК, почитаю, спасибо. Я в С вообще не силен, никогда на нем не писал, ну разве что маленькие подпрограмки обращения к системным функциям, которые прилинковывал к паскалю.

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


02/08/11
6893
Alex-Yu, а --no-crt?

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


21/08/10
2404
warlock66613 в сообщении #1624412 писал(а):
Сделайте её naked.



Хм... По описанию, вроде, как раз что надо. Не ругается, но return все равно вставляет. В любом случае полезная опция, мне же еще обработчики прерываний писать. Посмотрим как там будет.

А это общая Сишная опция, или специально для этого компилятора?

-- Сб дек 30, 2023 18:55:24 --

warlock66613 в сообщении #1624416 писал(а):
а --no-crt?


Тоже unknown, ignored.

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


02/08/11
6893
Alex-Yu в сообщении #1624419 писал(а):
А это общая Сишная опция, или специально для этого компилятора?
В стандарте этого не предусмотрено, но само понятие голой функции и соответствующий термин — общие и не только для Си. Так что для другого компилятора синтаксис будет несколько иной, но он будет почти наверняка.

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


21/08/10
2404
warlock66613 в сообщении #1624412 писал(а):
Сделать naked функцию, помещённую в отдельный сегмент,


А вот об этом поподробнее: как сделать отдельный сегмент? Я в общем С-файле ее определял.

-- Сб дек 30, 2023 18:58:41 --

warlock66613 в сообщении #1624420 писал(а):
Так что для другого компилятора синтаксис будет несколько иной, но он будет почти наверняка.


О! это хорошо. Синтаксис -- дело десятое, разберемся, знать бы только с чем разбираться :)

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


02/08/11
6893
Alex-Yu в сообщении #1624421 писал(а):
как сделать отдельный сегмент?
Не могу найти что-то. Зато нашёл вот такую прагму в документации:
Используется синтаксис C
#pragma code test_func 0x400

По описанию это должно поместить соответствующую функцию (test_func) по указанному адресу.

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


21/08/10
2404
warlock66613 в сообщении #1624412 писал(а):
Сделайте её naked.


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

-- Сб дек 30, 2023 19:20:06 --

warlock66613 в сообщении #1624424 писал(а):
По описанию это должно поместить соответствующую функцию (test_func) по указанному адресу.


Ну это и инлайнассемблером можно, директивой org. Но полезно знать. Вообще ассемблером без нужды злоупотреблять -- дело не совсем хорошее. Уж коли на С, то на С по возможности. Хотя ассемблер я люблю :)

-- Сб дек 30, 2023 19:28:06 --

Попробовал main() сделать naked. Надеялся исчезнет инициализация. Нет, осталось все как было. Хотя компилятор не ругнулся, "скушал" это дело.

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


02/08/11
6893
Alex-Yu в сообщении #1624426 писал(а):
Надеялся исчезнет инициализация.
Нет, инициализация иначе устроена в Си. В main нет добавочного кода по сравнению с тем, что написано. Но main не является истинной точкой входа, она вызывается из модуля (объектного файла) инициализации, который обычно называется crt или crt0 (то есть C Run-Time), в котором уже содержится истинная точка входа (обычно называется _start или вроде того). И обычно компилятор предоставляет опцию командной строки либо прагму чтобы не линковать эту инициализацию (одновременно эта опция убирает особый статус функции main, в том числе необходимость её определения — ведь её никто не вызывает больше) или линковать свой кастомный модуль стартовой инициализации вместо стандартного.

-- 30.12.2023, 17:01 --

Кстати попробуйте всё-таки использовать volatile переменную для записи конфигурационного слова. Для вашей архитектуры вместо _xdata должно быть видимо _code:
Код:
volatile __code uint16_t __at(0x2007) XXX = 0x1a;


-- 30.12.2023, 17:11 --

Если для вашей архитектуры опции отключения линковки crt нет (на что похоже), то возможно надо убрать функцию main, чтобы скомпилировалось в объектный файл, а линковать потом ручным вызовом sdld с нужными параметрами.

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


21/08/10
2404
warlock66613 в сообщении #1624432 писал(а):
. В main нет добавочного кода по сравнению с тем, что написано. Но main не является истинной точкой входа, она вызывается из модуля (объектного файла) инициализации, который обычно называется crt или crt0 (то есть C Run-Time),



Да, я это вижу по ассемблерному листингу. А программа называется __sdcc_gsinit_startup . Написан ее вызов в точке старта. Правда, ее текст я вижу только в дизассемблере.

Вообще я что-то склоняюсь к тому, чтобы головной модуль написать вообще на ассемблере и к нему прилинковать Сишную функцию (возможно не одну). Но кроме чисто утилитарной проблемы написать программу, есть еще и более интересная для меня задача понять, как это все работает.

С volatile поразбираюсь.

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

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



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

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


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

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