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

 
 
> Рассуждения о _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
SIA
сообщение Jan 26 2008, 22:00
Сообщение #16


Местный
***

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



Код
//-------------------------------------------------------------------
// Прерывание системного таймера
//   используются только регистровые переменные
//   никакие регистры не сохраняются
//   SREG не сохраняется
//   ОБЯЗАТЕЛЬНО ПРОВЕРИТЬ СГЕНЕРИРОВАННЫЙ КОД !!!!!!!!!!!!!!!!!!!!!
//-------------------------------------------------------------------

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


Так нельзя делать даже из самых лучших побуждений.
Код, работающий по прерыванию и при этом портящий регистры и статус процессора - нонсенс, т.к. его исполнение может оказаться прервано другим таким же с большим приоритетом - с соответствующей порчей данных. Не говоря уже о том, что уменьшение числа регистров, доступных компилятору, ухудшает оптимизацию, и дополнительные загрузки-выгрузки легко съедят весь эффект, полученный в частной подпрограмме.

Я однажды еще на ассемблере делал системный таймер в регистре процессора для системы быстрой регистрации, но код отработки прерывания не изменял в процессоре НИЧЕГО, кроме регистра таймера.

Если хочется сэкономить такты - практичнее подумать над алгоритмом в целом или поменять МК, если экономится память - это вообще нонсенс, т.к. цена версий МК с разной памятью не сильно отличается. Чтобы окупить затраты на отладку такого "кода", потребуются многотысячные тиражи, и то не факт, что это рационально - резервов для апгрейда не останется.
Еще для ускорения при отработке прерываний можно использовать теневой банк регистров (дополнительные банки есть у многих МК, от 8051 и Z80 до PIC32).
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2008, 22:29
Сообщение #17


дятел
*****

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



Цитата(SIA @ Jan 27 2008, 01:00) *
Так нельзя делать даже из самых лучших побуждений.
Код, работающий по прерыванию и при этом портящий регистры и статус процессора - нонсенс, т.к. его исполнение может оказаться прервано другим таким же с большим приоритетом - с соответствующей порчей данных.
Может конечно и нельзя .... 07.gif
Но я точно знаю что я делаю.
используются только зарезервированные регистры и регистры переферии,
код написан таким образом что SREG просто не меняется,
напоминание "ПРОВЕРИТЬ КОД" именно про то, чтобы проверить что компилятор не начудил
и не вставил инструкции меняющие SREG.


Цитата(aesok @ Jan 27 2008, 01:13) *
Почитайте пост, там описана проблема:
http://electronix.ru/forum/index.php?showtopic=42140
GCC ведет себя также. До веррсии 4.1 он выдавал предупреждение, потом перестал. Есть ключик чтобы его включть.
Я не только читал но и писал в той ветке...
Про проблемы с повтором констант я знаю, более того примерно с год назад я поднимал
этот вопрос на форуме (ссылку лень искать сейчас, что то типа"Проблемы оптимизации WinAVR").
У меня все проблемы сводились к тому что код оказывался просто очень не оптимальным.
У Вас есть пример кода для GCC который будет в такой ситуации некорректным ?
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 26 2008, 23:39
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(singlskv @ Jan 27 2008, 01:29) *
Цитата
Почитайте пост, там описана проблема:
http://electronix.ru/forum/index.php?showtopic=42140
GCC ведет себя также. До веррсии 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

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 27 2008, 10:03
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 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.
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
||||- - 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


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

 


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


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