|
Рассуждения о _regvar и register, Вынесено из темы "Глюки компилятора.." |
|
|
|
Jan 26 2008, 14:00
|
Местный
  
Группа: Новичок
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jan 26 2008, 15:59
|

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

|
Цитата(Qwertty @ Jan 26 2008, 18:50)  А что спецификатор типа памяти register ИАР не понимает? Понимает, точнее, как и подавляющее большинство нынешних компиляторов молча игнорирует. Цитата Зачем еще __regvar изобретать? Это совсем другое - если прочитаете сообщение об ошибке - поймете, что речь идет о глобально зарезервированном для каких-то нужд регистре.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 26 2008, 16:21
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 26 2008, 18:49
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Jan 26 2008, 20:42)  Поверьте моему опыту - игнорирут. Посмотрите документацию на любимый компилятор и увидете чего-нибудь типа User requests for register variables are ignored. А если любимый gcc ? Он не игнорирует и я этим иногда пользуюсь, только нужно проявлять осторожность при использовании библиотек в случае объявления большого количества регистровых переменных(ну или листинг смотреть...).
|
|
|
|
|
Jan 26 2008, 19:21
|

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

|
Цитата(singlskv @ Jan 26 2008, 21:49)  А если любимый gcc ? Он не игнорирует и я этим иногда пользуюсь, Исключения, только подтверждают правила  . Цитата только нужно проявлять осторожность при использовании библиотек в случае объявления большого количества регистровых переменных(ну или листинг смотреть...). Да ну? У Вас совершенно ошибочные  представления о квалификаторе register, даже в случаях если он не игнорируется в принципе, он носит только рекомендательный характер. Цитата(Qwertty @ Jan 26 2008, 22:05)  А можете поподробнее про осторожность? Чего опасаться? Абсолютно нечего - безопасно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 26 2008, 19:46
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Jan 26 2008, 22:21)  Да ну? У Вас совершенно ошибочные  представления о квалификаторе register, даже в случаях если он не игнорируется в принципе, он носит только рекомендательный характер. Абсолютно нечего - безопасно. Эксперименты ставить будем ?  Для затравки, предлагаю объявить регистры R0,R1 байтовыми переменными и присвоить им значение например 255 ... Если не убедит, подгоню примеры повеселее....
|
|
|
|
|
Jan 26 2008, 20:03
|

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

|
Цитата(singlskv @ Jan 26 2008, 22:46)  Эксперименты ставить будем ?  Нет для начала будем читать (пост #69) о чем идет речь речь идет о квалификаторе register. Цитата Для затравки, предлагаю объявить регистры R0,R1 байтовыми переменными... Давайте - есть квалификатор register описанный в стандарте языка. Давайте попробуйте с его помощью сделать вышеобещанное. Готов внимать. Цитата Если не убедит, подгоню примеры повеселее....  Да и так уже не скучно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 26 2008, 20:09
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Jan 26 2008, 23:03)  Нет для начала будем читать (пост #69) о чем идет речь речь идет о квалификаторе register. Давайте - есть квалификатор register описанный в стандарте языка. Давайте попробуйте с его помощью сделать вышеобещанное. Готов внимать. register unsigned char mynull asm("r0"); ...... mynull=255; попробуйте, не пожалеете...
|
|
|
|
|
Jan 26 2008, 20:47
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Jan 26 2008, 23:22)  Если Вы это срьезно, то ну и каша у Вас в голове  . Ну кашу я вобще не ем, кроме разьве что гречневой, так что в голове она у меня редкая гостья  ну перечитываем тогда что ли пост №68 с которого и началась дискуссия: Цитата(Qwertty @ Jan 26 2008, 18:50)  А что спецификатор типа памяти register ИАР не понимает? Зачем еще __regvar изобретать? так вот gcc его понимает и пользуется им для размещения переменных в регистрах...
|
|
|
|
|
Jan 26 2008, 21:17
|
Местный
  
Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723

|
Цитата(Qwertty @ Jan 27 2008, 00:06)  Это просто я тогда не понял, о чем идет речь. Вот и спросил о register и IAR. Я тоже сижу на ГЦЦ, и проблем с размещением в регистрах не испытывал. Правда номер регистра жестко не задаю. В документации к avr-libs указывается, что компилятор не контролирует конфликты в случае жесткого указания номера регистра. Документированные грабли и не грабли вовсе, а так, особенности реализации  Вообще говоря, не понимаю, зачем вообще при написании кода самим создавать себе проблемы - жестко указывать номера регистров для размещения переменных компилятору ? Выгоды практически никакой, а переносимость и надежность могут конкретно пострадать. Можно понять, если регистр особенный и с этой переменной надо что-то специфичное делать, но такой кусочек кода надо бы оформлять маленькой препроцессорной вставочкой/подпрограммкой, и подробно комментить.
|
|
|
|
|
Jan 26 2008, 21:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

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

|
Цитата(singlskv @ Jan 27 2008, 00:34)  Вы можете спросить почему это не написано на асм. Потому что в качестве бонуса я получаю возможность обращаться к регистровым переменным как к обычным С переменным в обычном С коде... В свете того, что выше написал aesok о регистровых переменных и квалификаторе volatile, возможность обращаться к регистровым переменным, модифицируемым в прерывании, из С кода весьма сомнительна. Цитата(singlskv @ Jan 27 2008, 00:48)  Вот как раз для такой оптимизации использование register абслоютно беcсмысленно и может даже(в принципе) помешать компилятору.... Для таких кусков кода нужно грамотно использовать локальные переменные. Если хотите примеров, покажите кусок кода где register дал выигрыш, и я покажу как нужно было написать просто с локальными переменными. Это и есть локальная переменная. Я выше писал, что не объявляю глобальных переменных регистровыми. Сам по себе register даст выигрыщ только если локальных переменных много, тогда это будет подсказка оптимизатору о том, какие размещать в регистрах в первую очередь. Если локальная переменная одна, то она станет регистровой сама по себе  И перестанет показывать свое значение в студии  А вот помешать компилятору вряд-ли удастся, он просто молча проигнорирует register и все, даже варнинга не даст.
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|