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

 
 
> WinAVR: Cовмещение Си и ассемблера
MaxiMuz
сообщение Feb 9 2012, 11:23
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Здраствуйте !
Использовал пример из статьи: http://we.easyelectronics.ru/AVR/avr-gcc-s...om-proekte.html
"AVR-GCC: Совмещение C и ассемблера в одном проекте ". Начал править makefile, которым я обычно пользуюсь, но при указании Assembler source files... получил error: Oops, ASRC not found !
Не понимаю что не так делаю ! В чем может быть проблема ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MaxiMuz
сообщение Feb 19 2012, 14:58
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Непонимаю смысл вставки:
Код
asm volatile("" : "+r" (Cnt_Dl));

В конкретном случае проблема "заоптимизации" решается вставкой volatile перед register uint16_t Cnt_Dl asm("r18");
Так что в данном случае квалификатор работает, посмотрю как будет дальше ...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 19 2012, 17:51
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (MaxiMuz @ Feb 19 2012, 16:58) *
Непонимаю смысл вставки:
CODE
asm volatile("" : "+r" (Cnt_Dl));
Она говорит о том, что в результате этой вставки значение Cnt_Dl изменится и, следовательно, компилятор должен использовать новое значение, а не полагаться на знание старого.
QUOTE (MaxiMuz @ Feb 19 2012, 16:58) *
В конкретном случае проблема "заоптимизации" решается вставкой volatile перед register uint16_t Cnt_Dl asm("r18");
Удивительный человек. В документации ясно сказано - volatile совместно с register работает непредсказуемо, использовать такую связку нельзя. Нет же, мы аккуратно разложим грабли и любовно отполируем ручку, видимо, чтобы получить по лбу побольнее.

Добавлено: извиняюсь, полистал документацию и не нашел явного упоминания запрета связки register volatile. Гугля по фразе "gcc register volatile" выдает кучу ссылок на формы и баг-репорты gcc, но ни одной ссылки на документацию. Пройдя по этим ссылкам можно узнать, что эта связка не работает, что компилятор по -Wall и/или -Wextra должен на такую конструкцию выдавать проедупреждение "volatile register variables don%'t work as you might wish" и что лечить это не собираются.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 19 2012, 18:19
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(Сергей Борщ @ Feb 19 2012, 20:13) *
Удивительный человек. В документации ясно сказано - volatile совместно с register работает непредсказуемо, использовать такую связку нельзя. Нет же, мы аккуратно разложим грабли и любовно отполируем ручку, видимо, чтобы получить по лбу побольнее.

Где именно это сказанно в документации ??
Согласитесь что применительно к программе-компилятору слово "непредсказуемо" имеет условный смысл! Программа работает по определенному алгоритму , и пусть этот работа этого алгоритма не задокументирована. Но нельзя сказать что здесь имеет место случайность sm.gif ..
Так вот я сейчас провожу исследование sm.gif , как именно влияет на задействование (оптимизацию ) регистровых переменных применение или неприменение volatile . За что конечно не могу сказать спасибо создателям этого компилятора. Но тем не менее уже проследил некоторые закономерности работы. Испробованы пока не все случаи... Хочу потом все это оформить в удобочитаемую форму. Если вам будет интересно , я первому сообщу как будет готово.

п.с. Да действительно соглашусь , volatile применительно к регис.перем. не хрена ни работает так, как описано в официальной документации. Пока единственное что могу добавить что его применение здесь всеже в некоторых случаях оправданно.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 20 2012, 08:54
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (MaxiMuz @ Feb 20 2012, 02:19) *
Где именно это сказанно в документации ??
Согласитесь что применительно к программе-компилятору слово "непредсказуемо" имеет условный смысл! Программа работает по определенному алгоритму , и пусть этот работа этого алгоритма не задокументирована. Но нельзя сказать что здесь имеет место случайность sm.gif ..

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 21 2012, 19:40
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(haker_fox @ Feb 20 2012, 11:54) *
Она может принимать решения в зависимости от контекста - Вашей программы. Вот и получается случайность.

Контекста какого ? названия переменных, количество их упоминания, или всеже использование р.п. в стандартных конструкциях (for, if, case, и т.д.) , в выражениях присваивания или же в мат.выражениях ?

Сейчас столкнулся с следующей проблемой!
в заголовочном файле пишу:
Код
#ifdef __ASSEMBLER__
......
#  define GenCnt    r19
......
#else  /* !ASSEMBLER */
......
register uint8_t GenCnt asm("r19");
......
#endif /* ASSEMBLER */

компилятор мне говорит что переменная, обьявленная в Си, может быть затерта. Но я так понимаю это относится именно к Сишному куску программы.
Заглянул в код , а там в Ассемблерном куске регистор r19 везде заменен на r16 , который уже используется совместно в другом месте!
После того как я заменил Makefile на файл из стандарт.папки asmdemo все нормально скомпилировалось. На что следует обратить внимание в этом файле ? Что может влиять на использование регистровых переменных в асме ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   WinAVR: Cовмещение Си и ассемблера   Feb 9 2012, 11:23
- - demiurg_spb   Makefile в студию...   Feb 9 2012, 11:35
- - haker_fox   QUOTE (MaxiMuz @ Feb 9 2012, 19:23) Здрас...   Feb 9 2012, 12:35
|- - MaxiMuz   Цитата(haker_fox @ Feb 9 2012, 15:35) А В...   Feb 9 2012, 16:06
||- - demiurg_spb   Это ваш реальный мейкфайл из проекта? В вашем теку...   Feb 9 2012, 16:15
|||- - MaxiMuz   Цитата(demiurg_spb @ Feb 9 2012, 19:15) Э...   Feb 9 2012, 16:20
|||- - demiurg_spb   Цитата(MaxiMuz @ Feb 9 2012, 19:20) Да, в...   Feb 10 2012, 05:40
|||- - Сергей Борщ   QUOTE (demiurg_spb @ Feb 10 2012, 07:40) ...   Feb 10 2012, 12:00
||- - haker_fox   QUOTE (MaxiMuz @ Feb 10 2012, 00:06) Счит...   Feb 12 2012, 06:05
||- - MaxiMuz   Цитата(haker_fox @ Feb 12 2012, 09:05) Эт...   Feb 12 2012, 16:45
||- - MaxiMuz   Цитата(haker_fox @ Feb 12 2012, 09:05) Эт...   Feb 14 2012, 11:50
|- - MaxiMuz   Цитата(haker_fox @ Feb 9 2012, 15:35) Здр...   Feb 14 2012, 11:05
|- - demiurg_spb   потому что по умолчанию всё берётся из текущего ка...   Feb 14 2012, 11:39
||- - MaxiMuz   Цитата(demiurg_spb @ Feb 14 2012, 14:39) ...   Feb 14 2012, 11:44
||- - demiurg_spb   Что задаётся? Чтобы искалось в других каталогах? И...   Feb 14 2012, 11:46
|- - haker_fox   QUOTE (MaxiMuz @ Feb 14 2012, 19:05) в AS...   Feb 15 2012, 00:49
- - MaxiMuz   Да, вручную все добавляется и успешно собирается д...   Feb 10 2012, 08:39
- - MaxiMuz   В демо-проекте "совмещение Си и ассемблера...   Feb 11 2012, 18:18
|- - Сергей Борщ   QUOTE (MaxiMuz @ Feb 11 2012, 20:18) Где ...   Feb 11 2012, 21:06
- - ReAl   Я давно в makefile проекта перестал вписывать отде...   Feb 12 2012, 11:16
|- - haker_fox   QUOTE (ReAl @ Feb 12 2012, 19:16) Я давно...   Feb 13 2012, 13:58
|- - ReAl   Цитата(haker_fox @ Feb 13 2012, 15:58) Мн...   Feb 14 2012, 16:45
- - MaxiMuz   новый вопрос: Для обращения к байтовой регистрово...   Feb 12 2012, 18:03
|- - demiurg_spb   Цитата(MaxiMuz @ Feb 12 2012, 21:03) А ка...   Feb 13 2012, 05:19
- - _Ivana   Спасибо за упоминание про Makefile. Только что пыт...   Feb 13 2012, 19:01
|- - haker_fox   QUOTE (_Ivana @ Feb 14 2012, 03:01) пропи...   Feb 14 2012, 02:12
- - MaxiMuz   Всем спасибо за разьяснение в особенности haker_fo...   Feb 15 2012, 17:58
|- - Сергей Борщ   QUOTE (MaxiMuz @ Feb 15 2012, 19:58) В че...   Feb 15 2012, 20:42
|- - MaxiMuz   Цитата(Сергей Борщ @ Feb 15 2012, 23:42) ...   Feb 16 2012, 08:20
|- - Сергей Борщ   QUOTE (MaxiMuz @ Feb 16 2012, 10:20) поче...   Feb 16 2012, 09:31
|- - Сергей Борщ   Я никогда не использовал регистровые переменные, н...   Feb 21 2012, 23:53
- - slavik.ksu   здравствуй те уважаемые форумчане! Перехожу н...   Feb 22 2012, 06:08
|- - demiurg_spb   КодISR ( USART_RX_vect ) { switch ...   Feb 22 2012, 06:36
|- - slavik.ksu   Оказывается в конструкции switch строка выполняетс...   Feb 22 2012, 06:42
|- - slavik.ksu   Оказывается в конструкции switch строка выполняетс...   Feb 22 2012, 06:43
- - ReAl   Смотря что имеется ввиду под словом «выполняется» ...   Feb 22 2012, 07:49
- - MaxiMuz   Цитата(Сергей Борщ @ Feb 22 2012, 02:53) ...   Feb 22 2012, 07:50
- - MaxiMuz   Цитата(MaxiMuz @ Feb 22 2012, 10:50) Так ...   Feb 22 2012, 10:02
- - ReAl   Кстати, да. Если кто-то из модераторов перенесёт в...   Feb 22 2012, 11:16


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

 


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


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