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

 
 
 
Reply to this topicStart new topic
> Keil + Ассемблер, Как сделать ассемблерную вставку в С-файле?
whiteTigr
сообщение Aug 4 2011, 08:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 25-07-11
Пользователь №: 66 407



Собственно, топик.

Для организации задержек в некоторых процедурах записи хотелось бы использовать несколько Nop'ов или простенький цикл, в котором точно известно количество тактов.
Проблема в том, что компилятор при разных настройках оптимизации по разному делает циклы, написаные на С, и задержки получаются разными, и поэтому не хотелось бы полагаться на этот вариант.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 4 2011, 08:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Вы бы, что ли, указали тип МК...

Если считать, что Вы используете МК51, то
1. Если необходимо вставить 1-2 пустых оператора, то: _nop_() (см. файл intrins.h)
2. При больших задержках - использовать таймер или, может быть, имеет смысл написать функцию на ассемблере с передачей ей параметра задержки. См. "Cx51 User's Guide" -> "Advanced Programming" -> "Interfacing C to Assembler"
Go to the top of the page
 
+Quote Post
whiteTigr
сообщение Aug 4 2011, 09:42
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 25-07-11
Пользователь №: 66 407



Цитата(Палыч @ Aug 4 2011, 12:47) *
Вы бы, что ли, указали тип МК...

Если считать, что Вы используете МК51, то
1. Если необходимо вставить 1-2 пустых оператора, то: _nop_() (см. файл intrins.h)


Совсем забыл. Програмирую чип lpc2367.

Спасибо за ответ, покопал немножко и нашелся __nop(); sm.gif
Go to the top of the page
 
+Quote Post
whiteTigr
сообщение Aug 5 2011, 07:11
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 25-07-11
Пользователь №: 66 407



После еще одного дня раскопок нашлось сразу 2 варианта ассемблерных вставок.

Вариант1:
Код
__asm("MOV R0, #0x0A");

Вариант2:
Код
__asm{
    MOV R0, #0x0A
    label0:
    SUBS R0, R0, #0x1
    BNE label0
}


П.С.: у себя проблемы вроде бы решил, но захотелось закрыть этот топик, а не оставлять вопрос нерешенным.

Сообщение отредактировал whiteTigr - Aug 5 2011, 08:24
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 5 2011, 08:04
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(whiteTigr @ Aug 5 2011, 11:11) *
После еще одного дня раскопок нашлось сразу 2 варианта ассемблерных вставок.
Странно, что Keil в расширении языка С в части ассемблерных вставок для разных типов микроконтроллеров не ввел унификацию. Предложенные Вами два варианта таких вставок в трансляторе для МК51 не "проходят". Зато есть
Код
#pragma asm
  JMP   $ ; endless loop
#pragma endasm
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 5 2011, 09:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (whiteTigr @ Aug 5 2011, 09:11) *
После еще одного дня раскопок нашлось сразу 2 варианта ассемблерных вставок.

Ассемблерные вставки есть зло сбивающее оптимизацию компилятору. Использовать только если наплевать на результат. Единственное известное мне исключение это GCC компилятор, где приняты меры по органичному их встраиванию. Для остальных компиляторов, либо то, что предоставляется через intrinsics, либо нормальные ASM функции.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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