|
Рассуждения о _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, 21:22
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Используя модификатор register вы просите компилятор разместить переменную в регистрах процессора, предполагая что таким образом получите более оптимальный код, но компилятор вправе игнорировать вашу просьбу, если сочтет генерируемый что код в результате будет хуже. Используя код: Код register unsigned char counter asm("r3"); Вы заставляете компилятор разместить переменную counter в регистре r3 контроллера. И всю ответственность за этот поступок берете на себя. В GCC полностью безопасно использовать регистры r2..r7 для объявления переменных. (С точки зрения компилятора, если только Вы сами не будете их изменять в ассемблерных вставках.) Возможно использование r8..r15, но эти регистры могут использоваться компилятором для передачи аргументов функций. Тоесть если все функции в проекте не передают в аргументах больше 10 байт, то регистры r8..r15 в вашем распоряжении. Если 12 байт то регистры r8-r9 будут использоваться компилятором, и переменная расположенная в них исказиться. avr-libc-user-manual FAQ#3:How to permanently bind a variable to a register? и FAQ#13 What registers are used by the C compiler? Не используйте модификатор volatile с регистровыми переменными, его работа не гарантируется. К сожалению GCC не дает предупреждения, но это факт. Анатолий.
|
|
|
|
|
Jan 27 2008, 09:30
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(aesok @ Jan 26 2008, 23:22)  Используя код: Код register unsigned char counter asm("r3"); Вы заставляете компилятор разместить переменную counter в регистре r3 контроллера. И всю ответственность за этот поступок берете на себя. В GCC полностью безопасно использовать регистры r2..r7 для объявления переменных. (С точки зрения компилятора, если только Вы сами не будете их изменять в ассемблерных вставках.) Вот этим-то я и интересовался, ещё когда порт scmRTOS 1.x на avr-gcc обсуждался. И результат - в общем случае в avr-gcc лучше обойтись без -ffixed-reg и register ...asm("rX"). В некоторых функциях библиотек эти r2-r7 таки используются (в частности, a/b при uint64_t a, b задействует их все). Да, они их сохраняют и восстанавливают, но ведь обработчики прерываний об этом не знают. На этом я и остановился - не стал разбираться, можно ли перекомпилировать библиотеки с запрещёнными к использованию несколькими регистрами (даст ли это что-то, не используются ли они в частях библиотек, кодированных на асме и т.д.). Можно ещё было поразбираться - какие именно функции залазят в эти регистры - возможно, кроме 64-битных целых и, к примеру, плавающей точки, никто туда и не залазит, но я просто решил для себя - если желание разместить глобальные переменные в регистрах возникнет, значит это будет задача под чистый асм :-), "ведь играл писал же я их в молодости" (С) актёрская шутка.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 27 2008, 10:25
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ReAl @ Jan 27 2008, 12:30)  Вот этим-то я и интересовался, ещё когда порт scmRTOS 1.x на avr-gcc обсуждался. И результат - в общем случае в avr-gcc лучше обойтись без -ffixed-reg и register ...asm("rX"). В некоторых функциях библиотек эти r2-r7 таки используются (в частности, a/b при uint64_t a, b задействует их все). Да, они их сохраняют и восстанавливают, но ведь обработчики прерываний об этом не знают. Получаеться в GCC небезопасно использовать глобальные регистровые переменные. Только локальные. Анатолий.
|
|
|
|
Сообщений в этой теме
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          singlskv Цитата(zltigo @ Jan 26 2008, 23:22) Если ... Jan 26 2008, 20:47           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 26 2008, 23:47) ну ... Jan 26 2008, 21:06            SIA Цитата(Qwertty @ Jan 27 2008, 00:06) Это ... Jan 26 2008, 21:17             singlskv Цитата(SIA @ Jan 27 2008, 00:17) Вообще г... Jan 26 2008, 21:34              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              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            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
|
|
|