реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использование asm библиотек в Си
scout
сообщение Oct 15 2009, 07:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Ситуация такова.
Имеется "библиотека" написанная на асме.
Библиотека довольно большая, используется давно и уже отлажена.
Сегментирования кода и данных нет, тоесть все привязанно к абсолютным адресам.
Написана на mpasm, причем не мной.

Очень хотелось бы использовать ее совмесно с С компилятором. Как с наименьшими телодвижениями
это сделать? Беглый просмотр доки на aсм Иара и Хайтека определил различия с mpasm. Может проще
оформить все в виде настоящей библиотеки используя среду, где она была рождена, т.е Mplab?

Вторая задача состоит в выборе компилятора. Много работал с Иаром, все нравится, но
он поддерживает только PIC18 - не универсально(возможно придется еще работать с PIC16).
Хотя макроассемблер Иара мне больше понравился, чем Хайтека,
да и отладчик там имхо приятней, чем в MPLAB. Также нет информации насчет безглючности, оптимальности
и тд. Вроде как Хайтек все хвалят, про Иар ничего не слышал...

Есть еще одна непонятка. Как я понимаю С компилятор при вызове подпрограммы на асме не знает
какие регистры могут похерится(STATUS, BSR, FSR и тд), соответственно не заботится о их сохранении.
Получается что мне придется ковырять чужую библиотеку и дописывать сохранение контекста чтобы ее можно было полноценно использовать в С?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 15 2009, 15:19
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(scout @ Oct 15 2009, 10:57) *
Получается что мне придется ковырять чужую библиотеку и дописывать сохранение контекста чтобы ее можно было полноценно использовать в С?

Можно сделать сишную функцию, чтоб вызывала функции из библиотеки по принципу программных прерываний. Т.е по таблице адресов. Только работать будет до-о-о-о-о-о-ольше. Другие варианты - переписывать все на си.
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 15 2009, 18:03
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



На Си переписывать муторно и потом отлавливать глюки... Решил все же оформить в виде ассемблерного модуля, переменные которые выделялись директивой CBLOCK заменю на секции, пусть линкер поработает. Ну и придется в ручную парсить исходник смотреть где там регистры могут меняться...
Или же можно родить библиотеку средствами MPLAB и цеплять ее потом к компилеру? Помогите внести ясность в данный вопрос!

Остается открытым также вопрос о выборе компилятора. IAR али HITECH?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 15 2009, 19:39
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата
Ну и придется в ручную парсить исходник смотреть где там регистры могут меняться...
Или же можно родить библиотеку средствами MPLAB и цеплять ее потом к компилеру?

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

Цитата
IAR али HITECH?

Есть еще SDCC
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 16 2009, 05:46
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Цитата
Нужно привести в соответствие calling conventions в Вашей библиотеке с соглашениями принятыми в данном компиляторе. Сложно это или нет - решать Вам, универсальностей тут нет.


Код писался абсолютно тупо, с абсолютной адресацией, без учета всяких соглашений, параметры передаются через глобальные переменные.
Переделывать передачу параметров через стек я опухну.

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


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
testerplus
сообщение Oct 16 2009, 07:44
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



Цитата(scout @ Oct 16 2009, 09:46) *
Вчера покопался часок, оформил код в виде модуля, но не знаю чем заменить директиву mpasm "banksel". В моем случае адреса переменных будут известны только на файле линковки... Как быть?


Код
    movlb   high(variable)
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 17 2009, 07:07
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



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

На самом деле это библиотека для работы с CAN. Может есть в сети уже отлаженное, готовое решение
для PIC18? На микрочипе находил, только не знаю насколько можно доверять фирменной библиотеке.
Кто что может сказать?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
zksystem
сообщение Oct 18 2009, 16:36
Сообщение #8


embedder
***

Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911



Цитата(scout @ Oct 17 2009, 11:07) *
Всем спасибо за ответы. Ситуация проясняется. smile.gif

На самом деле это библиотека для работы с CAN. Может есть в сети уже отлаженное, готовое решение
для PIC18? На микрочипе находил, только не знаю насколько можно доверять фирменной библиотеке.
Кто что может сказать?

Использовал фирменную (из Application Maestro), жалоб не было, помню только что-то правил там в виду того что криво компилировалось под HI-TECH PICC18.
Применял на PIC18F4585 и 2680.


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 18 2009, 18:21
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Да собственно практически написал свою. Заодно с CAN подробней разобрался.
Есть некоторые вопросы:

1.Непонятно назначение битов WIN в регистре CANCON.
Написано, что эти биты позволяют выбрать соответствующий буфер. Зачем что то выбирать,
у каждого буфера отдельные регистры данных и управления?

2. Не понятно назначение бита SRR в регистре RXBxSIDL.

3. В чем отличие битов RXRTR и RXRTRRO?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
Zakhar
сообщение Nov 1 2009, 15:25
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 30-07-05
Пользователь №: 7 212



Ребята, добрый день. Здрасте всем. Бодаюсь второй день - очень хочется в MPLAB' е на С18 сделать asm-вставочку. На #asm ....... #endasm говорит : "синтакс ощибка". Чего хочет-то? И подскажите, где почитать про такие вставки? Что-то во всевозможных описаниях С никак не найду правил оформления такой вставки
Go to the top of the page
 
+Quote Post
testerplus
сообщение Nov 1 2009, 15:37
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



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


В файле mcc18\examples\interrupt\main.c есть пример
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Nov 1 2009, 16:32
Сообщение #12


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(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.

На всякий пожарный дополнительно выделил жирным предупреждение о злоупотреблениях.
Go to the top of the page
 
+Quote Post
Zakhar
сообщение Nov 9 2009, 12:01
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 30-07-05
Пользователь №: 7 212



Большое спасибо! Был отключен от сети некоторое время - прошу прощения за позднюю благодарность. Задачка была - реализовать CDC PIC-ПК. Работаю с MPLAB. С последовательными протоколами MPLAB не работает (отладить программу на С18 не удается) Хотел вот частично обойти это - пройти пошагово на asm и посмотреть состояние регистров, чтобы косвенно оценить работоспособность программки. Пробовал смоделировать CDC на PROTEUS. Скачал из сети примерчик на asm передачи 2-байтового числа. Но там два драйвера - для эмулирования COM-порта и для самого примерчика под PROTEUS. Сработало частично - передать в PIC получилось, а принять из PICa - нет, зависал насмерть. И то только в первый день, на следующий день перед опознанием WIN"дом эмулятора COM-порта весь PROTEUS беззвучно отваливается. Похоже, где-то в драйверах ограничитель закопан.
С asm-вставкой вроде-бы частично получилось - но всплыли новые вопросы, неясны инструкции ACSESS, BANKED. В описаниях asm, что сейчас есть у меня, приведены минимальные сведения. Подскажите, где лежит более-менее толковое описание
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 01:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01463 секунд с 7
ELECTRONIX ©2004-2016