|
|
  |
Использование asm библиотек в Си |
|
|
|
Oct 15 2009, 07:57
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Ситуация такова. Имеется "библиотека" написанная на асме. Библиотека довольно большая, используется давно и уже отлажена. Сегментирования кода и данных нет, тоесть все привязанно к абсолютным адресам. Написана на mpasm, причем не мной. Очень хотелось бы использовать ее совмесно с С компилятором. Как с наименьшими телодвижениями это сделать? Беглый просмотр доки на aсм Иара и Хайтека определил различия с mpasm. Может проще оформить все в виде настоящей библиотеки используя среду, где она была рождена, т.е Mplab?
Вторая задача состоит в выборе компилятора. Много работал с Иаром, все нравится, но он поддерживает только PIC18 - не универсально(возможно придется еще работать с PIC16). Хотя макроассемблер Иара мне больше понравился, чем Хайтека, да и отладчик там имхо приятней, чем в MPLAB. Также нет информации насчет безглючности, оптимальности и тд. Вроде как Хайтек все хвалят, про Иар ничего не слышал...
Есть еще одна непонятка. Как я понимаю С компилятор при вызове подпрограммы на асме не знает какие регистры могут похерится(STATUS, BSR, FSR и тд), соответственно не заботится о их сохранении. Получается что мне придется ковырять чужую библиотеку и дописывать сохранение контекста чтобы ее можно было полноценно использовать в С?
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Oct 15 2009, 18:03
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
На Си переписывать муторно и потом отлавливать глюки... Решил все же оформить в виде ассемблерного модуля, переменные которые выделялись директивой CBLOCK заменю на секции, пусть линкер поработает. Ну и придется в ручную парсить исходник смотреть где там регистры могут меняться... Или же можно родить библиотеку средствами MPLAB и цеплять ее потом к компилеру? Помогите внести ясность в данный вопрос!
Остается открытым также вопрос о выборе компилятора. IAR али HITECH?
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Oct 15 2009, 19:39
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата Ну и придется в ручную парсить исходник смотреть где там регистры могут меняться... Или же можно родить библиотеку средствами MPLAB и цеплять ее потом к компилеру? Нужно привести в соответствие calling conventions в Вашей библиотеке с соглашениями принятыми в данном компиляторе. Сложно это или нет - решать Вам, универсальностей тут нет. Приведите пример на пару-тройку функций с достаточно большим кол-вом параметров. Есть еще путь - скопипастить потихоньку весь текст в инлайновый ассемблер. В любом случае, самый универсальный путь - это через таблицу вызовов + некоторые действия по согласованию использования регистров Цитата IAR али HITECH? Есть еще SDCC
|
|
|
|
|
Oct 16 2009, 05:46
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Цитата Нужно привести в соответствие calling conventions в Вашей библиотеке с соглашениями принятыми в данном компиляторе. Сложно это или нет - решать Вам, универсальностей тут нет. Код писался абсолютно тупо, с абсолютной адресацией, без учета всяких соглашений, параметры передаются через глобальные переменные. Переделывать передачу параметров через стек я опухну. Вчера покопался часок, оформил код в виде модуля, но не знаю чем заменить директиву mpasm "banksel". В моем случае адреса переменных будут известны только на файле линковки... Как быть?
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Oct 16 2009, 07:44
|

Участник

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

|
Цитата(scout @ Oct 16 2009, 09:46)  Вчера покопался часок, оформил код в виде модуля, но не знаю чем заменить директиву mpasm "banksel". В моем случае адреса переменных будут известны только на файле линковки... Как быть? Код movlb high(variable)
|
|
|
|
|
Oct 17 2009, 07:07
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Всем спасибо за ответы. Ситуация проясняется.  На самом деле это библиотека для работы с CAN. Может есть в сети уже отлаженное, готовое решение для PIC18? На микрочипе находил, только не знаю насколько можно доверять фирменной библиотеке. Кто что может сказать?
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Oct 18 2009, 16:36
|

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

|
Цитата(scout @ Oct 17 2009, 11:07)  Всем спасибо за ответы. Ситуация проясняется.  На самом деле это библиотека для работы с CAN. Может есть в сети уже отлаженное, готовое решение для PIC18? На микрочипе находил, только не знаю насколько можно доверять фирменной библиотеке. Кто что может сказать? Использовал фирменную (из Application Maestro), жалоб не было, помню только что-то правил там в виду того что криво компилировалось под HI-TECH PICC18. Применял на PIC18F4585 и 2680.
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Oct 18 2009, 18:21
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Да собственно практически написал свою. Заодно с CAN подробней разобрался. Есть некоторые вопросы:
1.Непонятно назначение битов WIN в регистре CANCON. Написано, что эти биты позволяют выбрать соответствующий буфер. Зачем что то выбирать, у каждого буфера отдельные регистры данных и управления?
2. Не понятно назначение бита SRR в регистре RXBxSIDL.
3. В чем отличие битов RXRTR и RXRTRRO?
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Nov 1 2009, 15:25
|
Участник

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

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

Участник

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

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

Группа: Участник
Сообщений: 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, что сейчас есть у меня, приведены минимальные сведения. Подскажите, где лежит более-менее толковое описание
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|