Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С + ASM прерывание
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
SasaVitebsk
Касается IAR для AVR.
Как мне подключить ASM файл к проекту? Можно просто добавить его. Компилятор поймёт?
zltigo
Цитата(SasaVitebsk @ May 21 2007, 15:38) *
Компилятор поймёт?

Конечно.
IgorKossak
Цитата(SasaVitebsk @ May 21 2007, 15:38) *
Касается IAR для AVR.
Как мне подключить ASM файл к проекту? Можно просто добавить его. Компилятор поймёт?

Специфические ключевые слова для определения сегментов описаны подробно в AVR Assembler Reference Guide.
SasaVitebsk
Спасибо за быстрый ответ. Хотелось бы ещё уточнений. Я перечитал документы и примеры приведённые на Atmel и в составе IAR и некоторые моменты всётаки не понял. Не бейте больно.

1) На сколько я понял соглашение о передаваемых параметрах (в смысле их привязки к регистрам) действует только на extern функции? Внутри одного файла сам компилятор может поступать как ему заблагорассудится?
2) В приведенных примерах написания функций на асме не видно чтобы сохранялись какие либо регистры. Компилятор что анализирует прогу асм на предмет использования регистров? Вроде бы так не должно быть, так как ассемблирование осуществляется после компиляции, а регистры должны быть определены до линковки? sad.gif Или, что более правдоподобно, определены регистры, которыми я могу пользоваться? Очень похоже, что это регистры R0-R3,R16-R23,R30,R31 вне зависимости от числа вызываемых параметров. Не пинайте пожалуйста, подтвердите или опровергните.

Да, здесь идёт речь не о прерывании, а о функции на ассемблере.
IgorKossak
Цитата(SasaVitebsk @ May 21 2007, 21:45) *
Спасибо за быстрый ответ. Хотелось бы ещё уточнений. Я перечитал документы и примеры приведённые на Atmel и в составе IAR и некоторые моменты всётаки не понял. Не бейте больно.

1) На сколько я понял соглашение о передаваемых параметрах (в смысле их привязки к регистрам) действует только на extern функции? Внутри одного файла сам компилятор может поступать как ему заблагорассудится?
2) В приведенных примерах написания функций на асме не видно чтобы сохранялись какие либо регистры. Компилятор что анализирует прогу асм на предмет использования регистров? Вроде бы так не должно быть, так как ассемблирование осуществляется после компиляции, а регистры должны быть определены до линковки? sad.gif Или, что более правдоподобно, определены регистры, которыми я могу пользоваться? Очень похоже, что это регистры R0-R3,R16-R23,R30,R31 вне зависимости от числа вызываемых параметров. Не пинайте пожалуйста, подтвердите или опровергните.

Да, здесь идёт речь не о прерывании, а о функции на ассемблере.

1. И внутри одного файла компилятор следует указанному правилу.
2. Смотря какие регистры. Рабочие регистры (Вы их привели) не сохраняются, об этом заботится участок кода, вызывающий данную функцию. Остальные используемые регистры должны сохраняться в стеке данных. Параметры передаются через R16-R23, через пары X и Z(при вызове функций с аттрибутами __x_z) и через стек данных если регистров оказалось мало. Но если до этого уже дошло, то уж лучше на С писать.
SasaVitebsk
Цитата(IgorKossak @ May 21 2007, 21:58) *
1. И внутри одного файла компилятор следует указанному правилу.
2. Смотря какие регистры. Рабочие регистры (Вы их привели) не сохраняются, об этом заботится участок кода, вызывающий данную функцию. Остальные используемые регистры должны сохраняться в стеке данных. Параметры передаются через R16-R23, через пары X и Z(при вызове функций с аттрибутами __x_z) и через стек данных если регистров оказалось мало. Но если до этого уже дошло, то уж лучше на С писать.


Простите что отрываю, но хотелось бы разобраться по лучше, так как к асму перешёл для повышения эффективности и было бы глупо вылизывать не разобравшись. sad.gif

По поводу п.1. разобрался. Там почему-то приведено две таблицы размещения параметров и я в них подзапутался.

Далее вопрос, возникший в связи с Вашим ответом 2. Значит ли это, что чем больше регистров я использую, тем больше их сохраняется или это означает, что сохраняются все перечисленные регистры вне зависимости от использования?

И последний мелкий вопрос. На Си объявлен след. массив:
uint8_t static Ekr[2][SIZE_EKR];
На асме я его объявляю как
EXTERN SizeXb, Ekr, NEkr
И пытаюсь использовать типа
Код
    add        R30,LOW(Ekr)    // Сместить от начала экранной области
    adc        R31,HIGH(Ekr)

Возникает ошибка
Error[43]: Illegal effective address D:\work\AVR IAR C\Panno\driv_graf.asm 49

Что я сделал неверно?
IgorKossak
Цитата(SasaVitebsk @ May 21 2007, 23:04) *
...к асму перешёл для повышения эффективности ...

Спорное поползновение.
Цитата(SasaVitebsk @ May 21 2007, 23:04) *
Далее вопрос, возникший в связи с Вашим ответом 2. Значит ли это, что чем больше регистров я использую, тем больше их сохраняется или это означает, что сохраняются все перечисленные регистры вне зависимости от использования?

Сохранять следует только то, что используется. Но чем больше используется, тем легче запутаться, а ошибку ассемблер не покажет, т. к. ему всё равно.
Цитата(SasaVitebsk @ May 21 2007, 23:04) *
Error[43]: Illegal effective address D:\work\AVR IAR C\Panno\driv_graf.asm 49

Ошибка в строке 49. По моему вместо HIGH(Ekr) рекомендуется писать Ekr>>8 или что-то в этом роде. в одном из мануалов об этом писалось.
SasaVitebsk
Цитата(IgorKossak @ May 22 2007, 00:28) *
Спорное поползновение.

Сохранять следует только то, что используется. Но чем больше используется, тем легче запутаться, а ошибку ассемблер не покажет, т. к. ему всё равно.

Ошибка в строке 49. По моему вместо HIGH(Ekr) рекомендуется писать Ekr>>8 или что-то в этом роде. в одном из мануалов об этом писалось.


Спасибо во всём разобрался. Вместо add r,LOW(xxx) надо было конечно использовать subi r,low(-xxx), а иначе никак. smile.gif

Называется "давно не брал я в руки шашек". Подразучился ассемблить. smile.gif

А вылизывать данный кусок - можно. Это вывод точки. За кадр может вызываться пару тысяч раз. И от её эффективности напрямую зависит загруженность проца. Почему то Си не совсем так генерит, как я хочу.

Ну например я пишу ему:
Код
maska =3;
if((X & (1<<1))!=0)
{
   __swap_nibbles(maska);
   __swap_nibbles(Color);
}


Так он вообще выкидывает эту конструцию.
Пришлось написать следующее.

Код
maska =3;
if((X & (1<<1))!=0)
{
   maska = 0x30;
   Color <<= 4;
}


Ну и так далее.
Но в общем переписыванием добился почти двухкратной оптимизации. Хотелось бы конечно попробовать так прогу написать, чтобы сразу несколько точек обрабатывалось, но тут сравнения пойдут и программа будет совсем нелинейная. Не красивая. С другой стороны сейчас у меня в байте 4 точки (по два бита), а если перейти на ARM, то там выигрыш от такого алгоритма будет очень существенный. Надо покумекать.

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