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

 
 
> Рассуждения о _regvar и register, Вынесено из темы "Глюки компилятора.."
kamedi_clab
сообщение Jan 26 2008, 14:00
Сообщение #1


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



IAR 4.21A помогите - что за ошибка ?

Error[Pa043]: the keyword "__regvar" is not available with the current settings. Registers must be locked with --lock_regs C:\_AN447 my\_bldc_iar\main.c 55
before __regvar can be used

Total number of errors: 1
Total number of warnings: 0

вот проект прицепил - http://slil.ru/25402589 (20 Кб)

Сообщение отредактировал kamedi_clab - Jan 26 2008, 14:08
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Qwertty
сообщение Jan 26 2008, 15:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



А что спецификатор типа памяти register ИАР не понимает? Зачем еще __regvar изобретать?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 15:59
Сообщение #3


Гуру
******

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



Цитата(Qwertty @ Jan 26 2008, 18:50) *
А что спецификатор типа памяти register ИАР не понимает?

Понимает, точнее, как и подавляющее большинство нынешних компиляторов молча игнорирует.
Цитата
Зачем еще __regvar изобретать?

Это совсем другое - если прочитаете сообщение об ошибке - поймете, что речь идет о глобально зарезервированном для каких-то нужд регистре.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 26 2008, 16:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(zltigo @ Jan 26 2008, 18:59) *
Понимает, точнее, как и подавляющее большинство нынешних компиляторов молча игнорирует.

Ну не совсем игнорируют. Просто компилятор обычно сам решает размещать переменную в регистре или нет. Но если все переменные в доступные регистры не влезают, то объявленные с register будут иметь приоритет.
Цитата(zltigo @ Jan 26 2008, 18:59) *
Это совсем другое - если прочитаете сообщение об ошибке - поймете, что речь идет о глобально зарезервированном для каких-то нужд регистре.

Спасибо, понял. Это типа как в ГЦЦ регистр для хранения 0. Хотя не понятен смысл объявления глобальных переменных в регистрах. Слишком много это вызовет ограничений, у таких переменных даже адрес взять нельзя, возможность работы посредством указателя теряется.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 17:42
Сообщение #5


Гуру
******

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



Цитата(Qwertty @ Jan 26 2008, 19:21) *
Ну не совсем игнорируют.

Поверьте моему опыту - игнорирут. Посмотрите документацию на любимый компилятор и увидете чего-нибудь типа User requests for register variables are ignored.
Цитата(Qwertty @ Jan 26 2008, 19:21) *
Спасибо, понял. Это типа как в ГЦЦ регистр для хранения 0.

Ну очень ограниченое сравнение. В частности полный аналог описанного это --zero_register


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2008, 18:49
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2008, 20:42) *
Поверьте моему опыту - игнорирут. Посмотрите документацию на любимый компилятор и увидете чего-нибудь типа User requests for register variables are ignored.
А если любимый gcc ?
Он не игнорирует и я этим иногда пользуюсь,
только нужно проявлять осторожность при использовании библиотек в случае
объявления большого количества регистровых переменных(ну или листинг смотреть...).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 19:21
Сообщение #7


Гуру
******

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



Цитата(singlskv @ Jan 26 2008, 21:49) *
А если любимый gcc ?
Он не игнорирует и я этим иногда пользуюсь,

Исключения, только подтверждают правила smile.gif.
Цитата
только нужно проявлять осторожность при использовании библиотек в случае
объявления большого количества регистровых переменных(ну или листинг смотреть...).

Да ну? У Вас совершенно ошибочные sad.gif представления о квалификаторе register, даже в случаях если он не игнорируется в принципе, он носит только рекомендательный характер.
Цитата(Qwertty @ Jan 26 2008, 22:05) *
А можете поподробнее про осторожность? Чего опасаться?

Абсолютно нечего - безопасно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2008, 19:46
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2008, 22:21) *
Да ну? У Вас совершенно ошибочные sad.gif представления о квалификаторе register, даже в случаях если он не игнорируется в принципе, он носит только рекомендательный характер.
Абсолютно нечего - безопасно.
Эксперименты ставить будем ? smile.gif
Для затравки, предлагаю объявить регистры R0,R1 байтовыми переменными и присвоить
им значение например 255 ...
Если не убедит, подгоню примеры повеселее.... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 20:03
Сообщение #9


Гуру
******

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



Цитата(singlskv @ Jan 26 2008, 22:46) *
Эксперименты ставить будем ? smile.gif

Нет для начала будем читать (пост #69) о чем идет речь речь идет о квалификаторе register.
Цитата
Для затравки, предлагаю объявить регистры R0,R1 байтовыми переменными...

Давайте - есть квалификатор register описанный в стандарте языка. Давайте попробуйте с его помощью сделать вышеобещанное. Готов внимать.
Цитата
Если не убедит, подгоню примеры повеселее.... smile.gif

Да и так уже не скучно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2008, 20:09
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2008, 23:03) *
Нет для начала будем читать (пост #69) о чем идет речь речь идет о квалификаторе register.
Давайте - есть квалификатор register описанный в стандарте языка. Давайте попробуйте с его помощью сделать вышеобещанное. Готов внимать.

register unsigned char mynull asm("r0");
......

mynull=255;

попробуйте, не пожалеете... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 20:22
Сообщение #11


Гуру
******

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



Цитата(singlskv @ Jan 26 2008, 23:09) *
попробуйте

Если Вы это срьезно, то ну и каша у Вас в голове sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2008, 20:47
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2008, 23:22) *
Если Вы это срьезно, то ну и каша у Вас в голове sad.gif.
Ну кашу я вобще не ем, кроме разьве что гречневой, так что в
голове она у меня редкая гостья smile.gif

ну перечитываем тогда что ли пост №68 с которого и началась дискуссия:
Цитата(Qwertty @ Jan 26 2008, 18:50) *
А что спецификатор типа памяти register ИАР не понимает? Зачем еще __regvar изобретать?


так вот gcc его понимает и пользуется им для размещения переменных в регистрах...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 26 2008, 21:06
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ Jan 26 2008, 23:47) *
ну перечитываем тогда что ли пост №68 с которого и началась дискуссия:
так вот gcc его понимает и пользуется им для размещения переменных в регистрах...

Это просто я тогда не понял, о чем идет речь. Вот и спросил о register и IAR. Я тоже сижу на ГЦЦ, и проблем с размещением в регистрах не испытывал. Правда номер регистра жестко не задаю. В документации к avr-libs указывается, что компилятор не контролирует конфликты в случае жесткого указания номера регистра. Документированные грабли и не грабли вовсе, а так, особенности реализации smile.gif
Go to the top of the page
 
+Quote Post
SIA
сообщение Jan 26 2008, 21:17
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(Qwertty @ Jan 27 2008, 00:06) *
Это просто я тогда не понял, о чем идет речь. Вот и спросил о register и IAR. Я тоже сижу на ГЦЦ, и проблем с размещением в регистрах не испытывал. Правда номер регистра жестко не задаю. В документации к avr-libs указывается, что компилятор не контролирует конфликты в случае жесткого указания номера регистра. Документированные грабли и не грабли вовсе, а так, особенности реализации smile.gif

Вообще говоря, не понимаю, зачем вообще при написании кода самим создавать себе проблемы - жестко указывать номера регистров для размещения переменных компилятору ? Выгоды практически никакой, а переносимость и надежность могут конкретно пострадать. Можно понять, если регистр особенный и с этой переменной надо что-то специфичное делать, но такой кусочек кода надо бы оформлять маленькой препроцессорной вставочкой/подпрограммкой, и подробно комментить.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2008, 21:34
Сообщение #15


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SIA @ Jan 27 2008, 00:17) *
Вообще говоря, не понимаю, зачем вообще при написании кода самим создавать себе проблемы - жестко указывать номера регистров для размещения переменных компилятору ? Выгоды практически никакой, а переносимость и надежность могут конкретно пострадать.
Выгода может быть в разы, в 2-3 раза легко...
О переносимости такого кода речи нет, это используется только на самом низком уровне и только
при условии что ты знаешь что делаешь.
Цитата
Можно понять, если регистр особенный и с этой переменной надо что-то специфичное делать, но такой кусочек кода надо бы оформлять маленькой препроцессорной вставочкой/подпрограммкой, и подробно комментить.
Вот пример моих коментариев из реального проекта:
Код
//-------------------------------------------------------------------
// Прерывание системного таймера
//   используются только регистровые переменные
//   никакие регистры не сохраняются
//   SREG не сохраняется
//   ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ СГЕНЕРИРОВАННЫЙ КОД !!!!!!!!!!!!!!!!!!!!!
//-------------------------------------------------------------------

там всего 8 команд + reti
Но я точно знаю что я делаю.

Вы можете спросить почему это не написано на асм.
Потому что в качестве бонуса я получаю возможность обращаться к регистровым переменным
как к обычным С переменным в обычном С коде...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 26 2008, 21:55
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ Jan 27 2008, 00:34) *
Вы можете спросить почему это не написано на асм.
Потому что в качестве бонуса я получаю возможность обращаться к регистровым переменным
как к обычным С переменным в обычном С коде...

В свете того, что выше написал aesok о регистровых переменных и квалификаторе volatile, возможность обращаться к регистровым переменным, модифицируемым в прерывании, из С кода весьма сомнительна.

Цитата(singlskv @ Jan 27 2008, 00:48) *
Вот как раз для такой оптимизации использование register абслоютно беcсмысленно
и может даже(в принципе) помешать компилятору....
Для таких кусков кода нужно грамотно использовать локальные переменные.
Если хотите примеров, покажите кусок кода где register дал выигрыш, и я покажу
как нужно было написать просто с локальными переменными.

Это и есть локальная переменная. Я выше писал, что не объявляю глобальных переменных регистровыми. Сам по себе register даст выигрыщ только если локальных переменных много, тогда это будет подсказка оптимизатору о том, какие размещать в регистрах в первую очередь. Если локальная переменная одна, то она станет регистровой сама по себе smile.gif И перестанет показывать свое значение в студии sad.gif А вот помешать компилятору вряд-ли удастся, он просто молча проигнорирует register и все, даже варнинга не даст.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kamedi_clab   Рассуждения о _regvar и register   Jan 26 2008, 14:00
- - prottoss   Цитата(kamedi_clab @ Jan 26 2008, 21:00) ...   Jan 26 2008, 14:24
|- - zltigo   Цитата(prottoss @ Jan 26 2008, 17:24) Я т...   Jan 26 2008, 14:44
|- - kamedi_clab   Цитата(prottoss @ Jan 26 2008, 17:24) Я т...   Jan 26 2008, 16:30
|- - prottoss   Цитата(Qwertty @ Jan 26 2008, 23:21) Спас...   Jan 26 2008, 16:37
||- - Qwertty   Цитата(prottoss @ Jan 26 2008, 19:37) Обр...   Jan 26 2008, 16:49
|||- - prottoss   Цитата(Qwertty @ Jan 26 2008, 23:49) К...   Jan 26 2008, 16:59
||- - defunct   Цитата(prottoss @ Jan 26 2008, 19:37) Обр...   Jan 30 2008, 11:33
|- - Baser   Цитата(Qwertty @ Jan 26 2008, 18:21) Спас...   Jan 26 2008, 17:02
|- - Qwertty   Цитата(zltigo @ Jan 26 2008, 20:42) Повер...   Jan 26 2008, 18:19
||- - prottoss   Цитата(Qwertty @ Jan 27 2008, 01:19) По п...   Jan 26 2008, 18:32
|||- - Qwertty   Цитата(prottoss @ Jan 26 2008, 21:32) ......   Jan 26 2008, 19:05
|||- - Baser   Цитата(Qwertty @ Jan 26 2008, 21:05) Укра...   Jan 26 2008, 19:44
||- - zltigo   Цитата(Qwertty @ Jan 26 2008, 21:19) __ze...   Jan 26 2008, 18:52
|||- - zltigo   Цитата(singlskv @ Jan 26 2008, 23:47) ......   Jan 26 2008, 20:52
||||- - singlskv   Цитата(zltigo @ Jan 26 2008, 23:52) 1. Эт...   Jan 26 2008, 21:01
||||- - zltigo   Цитата(singlskv @ Jan 27 2008, 00:01) Ток...   Jan 26 2008, 21:06
|||||- - singlskv   Цитата(Qwertty @ Jan 27 2008, 00:55) В св...   Jan 26 2008, 22:07
|||||- - aesok   Цитата(singlskv @ Jan 27 2008, 01:07) По ...   Jan 26 2008, 22:13
||||- - SIA   Код//---------------------------------------------...   Jan 26 2008, 22:00
||||- - Qwertty   Цитата(SIA @ Jan 27 2008, 01:00) т.к. ег...   Jan 26 2008, 22:03
||||- - singlskv   Цитата(SIA @ Jan 27 2008, 01:00) Так нель...   Jan 26 2008, 22:29
||||- - SIA   Цитата(singlskv @ Jan 27 2008, 01:17) Мож...   Jan 26 2008, 22:31
||||- - aesok   Цитата(singlskv @ Jan 27 2008, 01:29) Цит...   Jan 26 2008, 23:39
||||- - singlskv   Цитата(aesok @ Jan 27 2008, 02:39) У Вас ...   Jan 27 2008, 10:03
|||- - singlskv   Цитата(Qwertty @ Jan 27 2008, 00:06) Прав...   Jan 26 2008, 21:19
|||- - Qwertty   Цитата(singlskv @ Jan 27 2008, 00:19) рег...   Jan 26 2008, 21:38
|||- - singlskv   Цитата(Qwertty @ Jan 27 2008, 00:38) А на...   Jan 26 2008, 21:48
||- - aesok   Используя модификатор register вы просите компиля...   Jan 26 2008, 21:22
||- - ReAl   Цитата(aesok @ Jan 26 2008, 23:22) Исполь...   Jan 27 2008, 09:30
||- - aesok   Цитата(ReAl @ Jan 27 2008, 12:30) Вот эти...   Jan 27 2008, 10:25
||- - singlskv   Цитата(ReAl @ Jan 27 2008, 12:30) Можно е...   Jan 27 2008, 20:23
|- - Baser   Цитата(singlskv @ Jan 26 2008, 21:46) Для...   Jan 26 2008, 20:22
- - Baser   Цитата(kamedi_clab @ Jan 26 2008, 16:00) ...   Jan 26 2008, 15:59
- - kamedi_clab   Вот по стр 189 мануала IAR   Jan 26 2008, 16:18


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:51
Рейтинг@Mail.ru


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