Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование асмовых вставок в Keil uVision 3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
alvol
Появилась необходимость сделать асмовую вставку в сишный код.
Для этого предлагается использовать директивы:
#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


Как должно быть?
rezident
В подавляющем количестве случаев нет особой необходимости в асмовых вставках. Если у вас есть критические по времени выполнения функции пишите их полностью на асм. Как вызывать асм-овые функции из си-шных и наоборот читайте в User's Manual, он у Keil довольно неплохой.
http://www.keil.com/support/man/docs/c51/c51_ap_ctoasm.htm
alvol
Цитата(rezident @ Nov 26 2007, 05:36) *
В подавляющем количестве случаев нет особой необходимости в асмовых вставках. Если у вас есть критические по времени выполнения функции пишите их полностью на асм. Как вызывать асм-овые функции из си-шных и наоборот читайте в User's Manual, он у Keil довольно неплохой.
http://www.keil.com/support/man/docs/c51/c51_ap_ctoasm.htm

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

http://electronix.ru/forum/index.php?showtopic=29192
alvol
Цитата(repairDV @ Nov 26 2007, 14:30) *
В этом разделе 51 уже есть ответ на этот вопрос. Пролистайте все страницы. Там всё конкретно расписано: соответствующие коды в Си и Асм.

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

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

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

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


А нельзя ли все-таки посмотреть конкретный пример, зачем это надо? Просто я знаю две причины когда необходимы асм-вставки в сишный код: неэффективность компилятора и необходимость работы с регистрамии и переносом (например для вычисления контрольных сумм иногда требуется циклический сдвиг). В первом случае всегда можно вынести нужный кусок в отдельную функцию, а ее - в отдельный файл .a51, а для второго случая в самом сишном компиляторе есть все необходимое.
repairDV
Цитата(alvol @ Nov 27 2007, 00:29) *
меня все же интересует как использовать вставку "на лету", нежели заранее описанные функции, т.е. выполнить только отдельные операции на асме, вместо СИшного синтаксиса

Такое есть только в Мотороловском CodeWarrior.
int main(void)
{
Y=a/b;
asm (inc Y);
}
alvol
Цитата(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
777777
Цитата(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);

Читайте хелпы, они - рулез!
alvol
Цитата(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);

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

хм, очень интересно, воистину рулез ))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.