Перейти к содержанию
    

WinAVR + asm

Как можно вставить в исходник на Си asm вставку в несколько строк?

Получилось только по одной команде в стиле asm ("nop"), а мне нужно написать целый цикл опроса датчиков, по одной команде оч некрасиво и неудобно, как сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В докуменации на avr-libc есть достаточно подробное описние.

Правда юниксовый формат асма не очень удобен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В книге Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006 есть перевод этой главы. А книжка есть на http://lord-n.narod.ru/walla.html.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ссылки.

 

Еще два вопросика:

1 - нужно ли восстанавливать "попорченные" регистры при выходе из asm вставки или компилятор сам за этим следит

2 - а можно ли написать нужный мне кусок кода на asm'e отдельно, в другом файле, а потом при компиляции файлы слинковать и юзать extern объявление в Си?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1.Тут надо смотреть, чтобы не зацепить регистры уже используемые компилятором. В доке есть описание, какие и как используються.

Поэому наиболее безопасно пойти путем (2).

Как компромис можно сделать функии с С вызовом и ассемблерным телом

int foo(char)
{
asm{.......}
}

Тогда работу со стеком берет на себя компилятор, а логику работы программист.

Впрочем напоследок скажу - gcc оптимизирует достаточно хорошо, и ввязываться в изыски с асмом особой надобности нет. Напишите функцию на С, скомпилируйте и просмотрите листинг - в 90% случаев выкинуть оттуда будет нечего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в 90% случаев выкинуть оттуда будет нечего.

Начнем хотябы с этого:

Bitwise operations in Standard C will automatically promote their operands to an int, which is (by default) 16 bits in avr-gcc.

и зачем мне 16 битная логика когда мне и 8и с головой хватает?...

Изменено пользователем Labinskiy Nikolay

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скомпилируйте и посмотрите.Стазу отпадет масса вопросов.

 

Вдогонку:

 

Bitwise operations in Standard C will automatically promote their operands to an int, which is (by default) 16 bits in avr-gcc.

 

Use (u)intN_t if you need exactly N bits.

 

Since these typedefs are mandated by the C99 standard, they are preferred over rolling your own typedefs.

 

Note:

If avr-gcc's -mint8 option is used, no 32-bit types will be available for all versions of GCC below 3.5.

Изменено пользователем beer_warrior

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...