Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR + asm
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Labinskiy Nikolay
Как можно вставить в исходник на Си asm вставку в несколько строк?
Получилось только по одной команде в стиле asm ("nop"), а мне нужно написать целый цикл опроса датчиков, по одной команде оч некрасиво и неудобно, как сделать?
beer_warrior
В докуменации на avr-libc есть достаточно подробное описние.
Правда юниксовый формат асма не очень удобен.
_Diman_
В книге Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006 есть перевод этой главы. А книжка есть на http://lord-n.narod.ru/walla.html.
Labinskiy Nikolay
Спасибо за ссылки.

Еще два вопросика:
1 - нужно ли восстанавливать "попорченные" регистры при выходе из asm вставки или компилятор сам за этим следит
2 - а можно ли написать нужный мне кусок кода на asm'e отдельно, в другом файле, а потом при компиляции файлы слинковать и юзать extern объявление в Си?
beer_warrior
1.Тут надо смотреть, чтобы не зацепить регистры уже используемые компилятором. В доке есть описание, какие и как используються.
Поэому наиболее безопасно пойти путем (2).
Как компромис можно сделать функии с С вызовом и ассемблерным телом
Код
int foo(char)
{
asm{.......}
}

Тогда работу со стеком берет на себя компилятор, а логику работы программист.
Впрочем напоследок скажу - gcc оптимизирует достаточно хорошо, и ввязываться в изыски с асмом особой надобности нет. Напишите функцию на С, скомпилируйте и просмотрите листинг - в 90% случаев выкинуть оттуда будет нечего.
Labinskiy Nikolay
Цитата
в 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и с головой хватает?...
beer_warrior
Скомпилируйте и посмотрите.Стазу отпадет масса вопросов.

Вдогонку:

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.
Labinskiy Nikolay
Спасибо, не знал
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.