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

 
 
 
Reply to this topicStart new topic
> Использование асмовых вставок в Keil uVision 3, как првильно подключать модули
alvol
сообщение Nov 25 2007, 22:10
Сообщение #1


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

Группа: Свой
Сообщений: 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


Как должно быть?
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 26 2007, 03:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В подавляющем количестве случаев нет особой необходимости в асмовых вставках. Если у вас есть критические по времени выполнения функции пишите их полностью на асм. Как вызывать асм-овые функции из си-шных и наоборот читайте в User's Manual, он у Keil довольно неплохой.
http://www.keil.com/support/man/docs/c51/c51_ap_ctoasm.htm
Go to the top of the page
 
+Quote Post
alvol
сообщение Nov 26 2007, 11:11
Сообщение #3


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

Группа: Свой
Сообщений: 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

спасибо
Go to the top of the page
 
+Quote Post
repairDV
сообщение Nov 26 2007, 12:30
Сообщение #4


Знающий
****

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



В этом разделе 51 уже есть ответ на этот вопрос. Пролистайте все страницы. Там всё конкретно расписано: соответствующие коды в Си и Асм.

http://electronix.ru/forum/index.php?showtopic=29192


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
alvol
сообщение Nov 26 2007, 14:29
Сообщение #5


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

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



Цитата(repairDV @ Nov 26 2007, 14:30) *
В этом разделе 51 уже есть ответ на этот вопрос. Пролистайте все страницы. Там всё конкретно расписано: соответствующие коды в Си и Асм.

http://electronix.ru/forum/index.php?showtopic=29192

спасибо
меня все же интересует как использовать вставку "на лету", нежели заранее описанные функции, т.е. выполнить только отдельные операции на асме, вместо СИшного синтаксиса
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 26 2007, 14:54
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(alvol @ Nov 26 2007, 19:29) *
т.е. выполнить только отдельные операции на асме, вместо СИшного синтаксиса

Своими асм-вставками вы можете сильно затруднить компилятору оптимизацию исходного кода и свести на "нет" эффект от их использования.
Go to the top of the page
 
+Quote Post
alvol
сообщение Nov 26 2007, 16:23
Сообщение #7


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

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



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

и все же меня интересует именно эта возможность, раз она есть и как ей пользоваться так, чтоб она работала, не зависимо от результатов компилирования... да и листинг просмотреть, сравнить и проследить за эффектом--это не сложно ведь
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 27 2007, 06:52
Сообщение #8


Профессионал
*****

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



Цитата(alvol @ Nov 26 2007, 19:23) *
и все же меня интересует именно эта возможность, раз она есть и как ей пользоваться так, чтоб она работала, не зависимо от результатов компилирования...


А нельзя ли все-таки посмотреть конкретный пример, зачем это надо? Просто я знаю две причины когда необходимы асм-вставки в сишный код: неэффективность компилятора и необходимость работы с регистрамии и переносом (например для вычисления контрольных сумм иногда требуется циклический сдвиг). В первом случае всегда можно вынести нужный кусок в отдельную функцию, а ее - в отдельный файл .a51, а для второго случая в самом сишном компиляторе есть все необходимое.
Go to the top of the page
 
+Quote Post
repairDV
сообщение Nov 27 2007, 07:10
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
alvol
сообщение Nov 27 2007, 12:53
Сообщение #10


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 28 2007, 07:54
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 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);

Читайте хелпы, они - рулез!
Go to the top of the page
 
+Quote Post
alvol
сообщение Nov 28 2007, 19:18
Сообщение #12


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

Группа: Свой
Сообщений: 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);

Читайте хелпы, они - рулез!

хм, очень интересно, воистину рулез ))
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 14:58
Рейтинг@Mail.ru


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