|
|
  |
Использование асмовых вставок в Keil uVision 3, как првильно подключать модули |
|
|
|
Nov 25 2007, 22:10
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Появилась необходимость сделать асмовую вставку в сишный код. Для этого предлагается использовать директивы: #pragma asm ... #pragma endasm
Когда делаешь что-то подобное в проекте, необходимо в Source Group на файле в опциях указать галочки Generate Assembler SCR files Assemble SCR files тогда начинает компилировать код, но делать вставки в подключаемых файлах через #include не разрешает.. если файл принудительно добавить в проект как файл main.c и указать єти же опции галочками, то вроде тоже компилирует, но при этом переменные, которые были объявлены в этом файле не видны в других инклудах, как это было раньше
Расскажите ненмого подробней, как правильно делать асмовые вставки, чтоб их можно было компилировать в любом файле или же как правильно подключать модули, чтоб можно было корректно дергать из них функции и переменные и использовать в других модулях. Насколько я понял функции в других инклудах можно использовать если описать их прототип в файле, где и собираюсь использовать, но как быть с перменными? Их так просто использовать не хочет, если они описаны в файлах, добавленных к Source Group. Писать все в одном файле не хочется.
Каждый подключаемый файл описываю в виде:
// FILE.C --имя файла // тут описываю прототипы функций из других модулей void XXX();
//*****************************************************************************
#ifndef FILEС #define FILEС
#include "main.h" #include "ХХХХ.c" // для использования функций из других модулей
..... #endif
Как должно быть?
|
|
|
|
|
Nov 26 2007, 11:11
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(rezident @ Nov 26 2007, 05:36)  В подавляющем количестве случаев нет особой необходимости в асмовых вставках. Если у вас есть критические по времени выполнения функции пишите их полностью на асм. Как вызывать асм-овые функции из си-шных и наоборот читайте в User's Manual, он у Keil довольно неплохой. http://www.keil.com/support/man/docs/c51/c51_ap_ctoasm.htmспасибо
|
|
|
|
|
Nov 26 2007, 14:29
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(repairDV @ Nov 26 2007, 14:30)  В этом разделе 51 уже есть ответ на этот вопрос. Пролистайте все страницы. Там всё конкретно расписано: соответствующие коды в Си и Асм. http://electronix.ru/forum/index.php?showtopic=29192спасибо меня все же интересует как использовать вставку "на лету", нежели заранее описанные функции, т.е. выполнить только отдельные операции на асме, вместо СИшного синтаксиса
|
|
|
|
|
Nov 26 2007, 16:23
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(rezident @ Nov 26 2007, 16:54)  Своими асм-вставками вы можете сильно затруднить компилятору оптимизацию исходного кода и свести на "нет" эффект от их использования. и все же меня интересует именно эта возможность, раз она есть и как ей пользоваться так, чтоб она работала, не зависимо от результатов компилирования... да и листинг просмотреть, сравнить и проследить за эффектом--это не сложно ведь
|
|
|
|
|
Nov 27 2007, 07:10
|

Знающий
   
Группа: Свой
Сообщений: 578
Регистрация: 7-11-06
Из: Хабаровск
Пользователь №: 22 044

|
Цитата(alvol @ Nov 27 2007, 00:29)  меня все же интересует как использовать вставку "на лету", нежели заранее описанные функции, т.е. выполнить только отдельные операции на асме, вместо СИшного синтаксиса Такое есть только в Мотороловском CodeWarrior. int main(void) { Y=a/b; asm (inc Y); }
Сообщение отредактировал repairDV - Nov 27 2007, 07:14
--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
|
|
|
|
|
Nov 27 2007, 12:53
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(777777 @ Nov 27 2007, 08:52)  А нельзя ли все-таки посмотреть конкретный пример, зачем это надо? Просто я знаю две причины когда необходимы асм-вставки в сишный код: неэффективность компилятора и необходимость работы с регистрамии и переносом (например для вычисления контрольных сумм иногда требуется циклический сдвиг). В первом случае всегда можно вынести нужный кусок в отдельную функцию, а ее - в отдельный файл .a51, а для второго случая в самом сишном компиляторе есть все необходимое. как раз меня и интересует циклический сдвиг двойного слова, стнадартным Си эт очень громоздко по тактам на асме это решается очень просто в три-четыре строчки для каждого 8-ми битного блока иногда еще протоколы какие-то хотелось бы вправить именно в каком-то конкретном месте согласен, все задачи можно разрешить, раздробить на более мелкие и сделать иначе пусть это будет причуда, но есть же инструмент который я описал в первом посте, и меня интересует как пользоваться именно им. Причем проблема не в том, что не получается им пользоваться вообще, а получается использовать его только в файле с процедурой main(), что неуддобно из соображения разбиения проекта на отдельные модули. Вот. Если кто знает как это делать или делал и объяснит ка кэто сделать--буду благодарен. Цитата(repairDV @ Nov 27 2007, 09:10)  Такое есть только в Мотороловском CodeWarrior. int main(void) { Y=a/b; asm (inc Y); } В Кеиле предлагается использовать... #pragma asm ... #pragma endasm
|
|
|
|
|
Nov 28 2007, 07:54
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(alvol @ Nov 27 2007, 15:53)  как раз меня и интересует циклический сдвиг двойного слова, стнадартным Си эт очень громоздко по тактам на асме это решается очень просто в три-четыре строчки для каждого 8-ми битного блока В Си - громоздко, поэтому в Кейле в файле INTRINS.H описаны псевдо-функции, позволяющие сделать это просто. extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long, unsigned char); extern unsigned char _crol_ (unsigned char, unsigned char); extern unsigned int _irol_ (unsigned int, unsigned char); extern unsigned long _lrol_ (unsigned long, unsigned char); extern unsigned char _chkfloat_(float); extern void _push_ (unsigned char _sfr); extern void _pop_ (unsigned char _sfr); Читайте хелпы, они - рулез!
|
|
|
|
|
Nov 28 2007, 19:18
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(777777 @ Nov 28 2007, 09:54)  В Си - громоздко, поэтому в Кейле в файле INTRINS.H описаны псевдо-функции, позволяющие сделать это просто.
extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long, unsigned char); extern unsigned char _crol_ (unsigned char, unsigned char); extern unsigned int _irol_ (unsigned int, unsigned char); extern unsigned long _lrol_ (unsigned long, unsigned char); extern unsigned char _chkfloat_(float); extern void _push_ (unsigned char _sfr); extern void _pop_ (unsigned char _sfr);
Читайте хелпы, они - рулез! хм, очень интересно, воистину рулез ))
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|