Ситуация такова.
Имеется "библиотека" написанная на асме.
Библиотека довольно большая, используется давно и уже отлажена.
Сегментирования кода и данных нет, тоесть все привязанно к абсолютным адресам.
Написана на mpasm, причем не мной.
Очень хотелось бы использовать ее совмесно с С компилятором. Как с наименьшими телодвижениями
это сделать? Беглый просмотр доки на aсм Иара и Хайтека определил различия с mpasm. Может проще
оформить все в виде настоящей библиотеки используя среду, где она была рождена, т.е Mplab?
Вторая задача состоит в выборе компилятора. Много работал с Иаром, все нравится, но
он поддерживает только PIC18 - не универсально(возможно придется еще работать с PIC16).
Хотя макроассемблер Иара мне больше понравился, чем Хайтека,
да и отладчик там имхо приятней, чем в MPLAB. Также нет информации насчет безглючности, оптимальности
и тд. Вроде как Хайтек все хвалят, про Иар ничего не слышал...
Есть еще одна непонятка. Как я понимаю С компилятор при вызове подпрограммы на асме не знает
какие регистры могут похерится(STATUS, BSR, FSR и тд), соответственно не заботится о их сохранении.
Получается что мне придется ковырять чужую библиотеку и дописывать сохранение контекста чтобы ее можно было полноценно использовать в С?
_Pasha
Oct 15 2009, 15:19
Цитата(scout @ Oct 15 2009, 10:57)

Получается что мне придется ковырять чужую библиотеку и дописывать сохранение контекста чтобы ее можно было полноценно использовать в С?
Можно сделать сишную функцию, чтоб вызывала функции из библиотеки по принципу программных прерываний. Т.е по таблице адресов. Только работать будет до-о-о-о-о-о-ольше. Другие варианты - переписывать все на си.
На Си переписывать муторно и потом отлавливать глюки... Решил все же оформить в виде ассемблерного модуля, переменные которые выделялись директивой CBLOCK заменю на секции, пусть линкер поработает. Ну и придется в ручную парсить исходник смотреть где там регистры могут меняться...
Или же можно родить библиотеку средствами MPLAB и цеплять ее потом к компилеру? Помогите внести ясность в данный вопрос!
Остается открытым также вопрос о выборе компилятора. IAR али HITECH?
_Pasha
Oct 15 2009, 19:39
Цитата
Ну и придется в ручную парсить исходник смотреть где там регистры могут меняться...
Или же можно родить библиотеку средствами MPLAB и цеплять ее потом к компилеру?
Нужно привести в соответствие calling conventions в Вашей библиотеке с соглашениями принятыми в данном компиляторе. Сложно это или нет - решать Вам, универсальностей тут нет. Приведите пример на пару-тройку функций с достаточно большим кол-вом параметров. Есть еще путь - скопипастить потихоньку весь текст в инлайновый ассемблер. В любом случае, самый универсальный путь - это через таблицу вызовов + некоторые действия по согласованию использования регистров
Цитата
IAR али HITECH?
Есть еще
SDCC
Цитата
Нужно привести в соответствие calling conventions в Вашей библиотеке с соглашениями принятыми в данном компиляторе. Сложно это или нет - решать Вам, универсальностей тут нет.
Код писался абсолютно тупо, с абсолютной адресацией, без учета всяких соглашений, параметры передаются через глобальные переменные.
Переделывать передачу параметров через стек я опухну.
Вчера покопался часок, оформил код в виде модуля, но не знаю чем заменить директиву mpasm "banksel". В моем случае адреса переменных будут известны только на файле линковки... Как быть?
testerplus
Oct 16 2009, 07:44
Цитата(scout @ Oct 16 2009, 09:46)

Вчера покопался часок, оформил код в виде модуля, но не знаю чем заменить директиву mpasm "banksel". В моем случае адреса переменных будут известны только на файле линковки... Как быть?
Код
movlb high(variable)
Всем спасибо за ответы. Ситуация проясняется.

На самом деле это библиотека для работы с CAN. Может есть в сети уже отлаженное, готовое решение
для PIC18? На микрочипе находил, только не знаю насколько можно доверять фирменной библиотеке.
Кто что может сказать?
zksystem
Oct 18 2009, 16:36
Цитата(scout @ Oct 17 2009, 11:07)

Всем спасибо за ответы. Ситуация проясняется.

На самом деле это библиотека для работы с CAN. Может есть в сети уже отлаженное, готовое решение
для PIC18? На микрочипе находил, только не знаю насколько можно доверять фирменной библиотеке.
Кто что может сказать?
Использовал фирменную (из Application Maestro), жалоб не было, помню только что-то правил там в виду того что криво компилировалось под HI-TECH PICC18.
Применял на PIC18F4585 и 2680.
Да собственно практически написал свою. Заодно с CAN подробней разобрался.
Есть некоторые вопросы:
1.Непонятно назначение битов WIN в регистре CANCON.
Написано, что эти биты позволяют выбрать соответствующий буфер. Зачем что то выбирать,
у каждого буфера отдельные регистры данных и управления?
2. Не понятно назначение бита SRR в регистре RXBxSIDL.
3. В чем отличие битов RXRTR и RXRTRRO?
Ребята, добрый день. Здрасте всем. Бодаюсь второй день - очень хочется в MPLAB' е на С18 сделать asm-вставочку. На #asm ....... #endasm говорит : "синтакс ощибка". Чего хочет-то? И подскажите, где почитать про такие вставки? Что-то во всевозможных описаниях С никак не найду правил оформления такой вставки
testerplus
Nov 1 2009, 15:37
Цитата(Zakhar @ Nov 1 2009, 19:25)

Ребята, добрый день. Здрасте всем. Бодаюсь второй день - очень хочется в MPLAB' е на С18 сделать asm-вставочку. На #asm ....... #endasm говорит : "синтакс ощибка". Чего хочет-то? И подскажите, где почитать про такие вставки? Что-то во всевозможных описаниях С никак не найду правил оформления такой вставки
В файле mcc18\examples\interrupt\main.c есть пример
Прохожий
Nov 1 2009, 16:32
Цитата(Zakhar @ Nov 1 2009, 18:25)

Ребята, добрый день. Здрасте всем. Бодаюсь второй день - очень хочется в MPLAB' е на С18 сделать asm-вставочку. На #asm ....... #endasm говорит : "синтакс ощибка". Чего хочет-то? И подскажите, где почитать про такие вставки? Что-то во всевозможных описаниях С никак не найду правил оформления такой вставки
Вот цитата из документа DS51288J пункт 2.8.2.
Цитата
For example:
_asm
/* User assembly code */
MOVLW 10 // Move decimal 10 to count
MOVWF count, 0
/* Loop until count is 0 */
start:
DECFSZ count, 1, 0
GOTO done
BRA start
done:
_endasm
It is generally recommended to limit the use of inline assembly to a minimum. Any
functions containing inline assembly will not be optimized by the compiler. To write large
fragments of assembly code, use the MPASM assembler and link the modules to the C
modules using the MPLINK linker.
На всякий пожарный дополнительно выделил жирным предупреждение о злоупотреблениях.
Большое спасибо! Был отключен от сети некоторое время - прошу прощения за позднюю благодарность. Задачка была - реализовать CDC PIC-ПК. Работаю с MPLAB. С последовательными протоколами MPLAB не работает (отладить программу на С18 не удается) Хотел вот частично обойти это - пройти пошагово на asm и посмотреть состояние регистров, чтобы косвенно оценить работоспособность программки. Пробовал смоделировать CDC на PROTEUS. Скачал из сети примерчик на asm передачи 2-байтового числа. Но там два драйвера - для эмулирования COM-порта и для самого примерчика под PROTEUS. Сработало частично - передать в PIC получилось, а принять из PICa - нет, зависал насмерть. И то только в первый день, на следующий день перед опознанием WIN"дом эмулятора COM-порта весь PROTEUS беззвучно отваливается. Похоже, где-то в драйверах ограничитель закопан.
С asm-вставкой вроде-бы частично получилось - но всплыли новые вопросы, неясны инструкции ACSESS, BANKED. В описаниях asm, что сейчас есть у меня, приведены минимальные сведения. Подскажите, где лежит более-менее толковое описание
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.