|
Рассуждения о _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, 22:00
|
Местный
  
Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723

|
Код //------------------------------------------------------------------- // Прерывание системного таймера // используются только регистровые переменные // никакие регистры не сохраняются // SREG не сохраняется // ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ СГЕНЕРИРОВАННЫЙ КОД !!!!!!!!!!!!!!!!!!!!! //------------------------------------------------------------------- там всего 8 команд + reti Но я точно знаю что я делаю. Так нельзя делать даже из самых лучших побуждений. Код, работающий по прерыванию и при этом портящий регистры и статус процессора - нонсенс, т.к. его исполнение может оказаться прервано другим таким же с большим приоритетом - с соответствующей порчей данных. Не говоря уже о том, что уменьшение числа регистров, доступных компилятору, ухудшает оптимизацию, и дополнительные загрузки-выгрузки легко съедят весь эффект, полученный в частной подпрограмме. Я однажды еще на ассемблере делал системный таймер в регистре процессора для системы быстрой регистрации, но код отработки прерывания не изменял в процессоре НИЧЕГО, кроме регистра таймера. Если хочется сэкономить такты - практичнее подумать над алгоритмом в целом или поменять МК, если экономится память - это вообще нонсенс, т.к. цена версий МК с разной памятью не сильно отличается. Чтобы окупить затраты на отладку такого "кода", потребуются многотысячные тиражи, и то не факт, что это рационально - резервов для апгрейда не останется. Еще для ускорения при отработке прерываний можно использовать теневой банк регистров (дополнительные банки есть у многих МК, от 8051 и Z80 до PIC32).
|
|
|
|
|
Jan 26 2008, 22:29
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SIA @ Jan 27 2008, 01:00)  Так нельзя делать даже из самых лучших побуждений. Код, работающий по прерыванию и при этом портящий регистры и статус процессора - нонсенс, т.к. его исполнение может оказаться прервано другим таким же с большим приоритетом - с соответствующей порчей данных. Может конечно и нельзя .... Но я точно знаю что я делаю.используются только зарезервированные регистры и регистры переферии, код написан таким образом что SREG просто не меняется, напоминание "ПРОВЕРИТЬ КОД" именно про то, чтобы проверить что компилятор не начудил и не вставил инструкции меняющие SREG. Цитата(aesok @ Jan 27 2008, 01:13)  Почитайте пост, там описана проблема: http://electronix.ru/forum/index.php?showtopic=42140GCC ведет себя также. До веррсии 4.1 он выдавал предупреждение, потом перестал. Есть ключик чтобы его включть. Я не только читал но и писал в той ветке... Про проблемы с повтором констант я знаю, более того примерно с год назад я поднимал этот вопрос на форуме (ссылку лень искать сейчас, что то типа"Проблемы оптимизации WinAVR"). У меня все проблемы сводились к тому что код оказывался просто очень не оптимальным. У Вас есть пример кода для GCC который будет в такой ситуации некорректным ?
|
|
|
|
|
Jan 26 2008, 23:39
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(singlskv @ Jan 27 2008, 01:29)  Цитата Почитайте пост, там описана проблема: http://electronix.ru/forum/index.php?showtopic=42140GCC ведет себя также. До веррсии 4.1 он выдавал предупреждение, потом перестал. Есть ключик чтобы его включть. У Вас есть пример кода для GCC который будет в такой ситуации некорректным ? Да нашел на www.avrfreaks.net. Код volatile register uint16_t s1 asm("r2"); ISR(INT0_vect) {
if(bit_is_set(PINC,0)) s1++; else s1--; }
int main{ //... sei(); OCR0+=10; while(s1<10); //... } Регистровая переменная объявлена как volatile, код на уровне оптимизации -Os: Код 205: sei(); SEI 208: OCR0+=10; IN R24,0x31 SUBI R24,0xF6 OUT 0x31,R24 MOVW R24,R2 //!!! 209: while(s3<10); CPI R24,0x0A CPC R25,R1 BRCS PC-0x02 Происходит копирование R2:R3 в R24:R25, и в цикле анализируеться копия переменой s1 в R24:R25, а не она сама в R2:R3. Так что не используйте в GCC 'volatile register' переменые и добавте в свои макефайлы ключик '-Wvolatile-register-var'. Если интересно почему GCC так работает то, можно почитать здесь: http://gcc.gnu.org/ml/gcc-patches/2005-11/msg00657.htmlАнатолий.
|
|
|
|
|
Jan 27 2008, 10:03
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Jan 27 2008, 02:39)  У Вас есть пример кода для GCC который будет в такой ситуации некорректным ? Да нашел на www.avrfreaks.net. Код ........... Регистровая переменная объявлена как volatile, код на уровне оптимизации -Os: Происходит копирование R2:R3 в R24:R25, и в цикле анализируеться копия переменой s1 в R24:R25, а не она сама в R2:R3. Проверил на WinAVR 200604... Код генериться одинаковый и с и без volatile Код 16: sei(); +00000045: 9478 SEI Global Interrupt Enable 17: TCNT0+=10; +00000046: B782 IN R24,0x32 In from I/O location +00000047: 5F86 SUBI R24,0xF6 Subtract immediate +00000048: BF82 OUT 0x32,R24 Out to I/O location 18: while(s1<10); +00000049: E08A LDI R24,0x0A Load immediate +0000004A: 1628 CP R2,R24 Compare +0000004B: 0431 CPC R3,R1 Compare with carry +0000004C: F3E0 BRCS PC-0x03 Branch if carry set Вроде все правильно. C volatile выдает warning.
|
|
|
|
Сообщений в этой теме
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              Qwertty Цитата(singlskv @ Jan 27 2008, 00:34) Вы ... Jan 26 2008, 21:55               singlskv Цитата(Qwertty @ Jan 27 2008, 00:55) В св... Jan 26 2008, 22:07                aesok Цитата(singlskv @ Jan 27 2008, 01:07) По ... Jan 26 2008, 22:13               Qwertty Цитата(SIA @ Jan 27 2008, 01:00) т.к. ег... Jan 26 2008, 22:03                SIA Цитата(singlskv @ Jan 27 2008, 01:17) Мож... Jan 26 2008, 22:31            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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|