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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Рассуждения о _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
prottoss
сообщение Jan 26 2008, 14:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(kamedi_clab @ Jan 26 2008, 21:00) *
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 Кб)
А что не понятного? smile.gif Компилятор же вам честно говорит -

Registers must be locked with --lock_regs .... before __regvar can be used

Разберетесь - заодно и людей, читающих курс научите smile.gif



IAR for AVR, к сожалению, сейчас нет, но разве можно регистровые переменные объявлять как

Код
__no_init __regvar volatile uint16_t sineTableIncrement           @14;


Я так понимаю - __regvar - это уже тип, а вы к нему еще и uint16_t прицепили


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 14:44
Сообщение #3


Гуру
******

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



Цитата(prottoss @ Jan 26 2008, 17:24) *
Я так понимаю - __regvar - это уже тип, а...

Нет, это Memory Attribute - ничем принципиально не отличающийся от подобного назначения __flash, __eeprom, __far и прочих прочих....

Цитата(kamedi_clab @ Jan 26 2008, 17:00) *
Error[Pa043]...

И почему для этого вопроса была выбрана тема "глюки компилятора"????????


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


Местный
***

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



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


Гуру
******

Группа: Свой
Сообщений: 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
Baser
сообщение Jan 26 2008, 15:59
Сообщение #6


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(kamedi_clab @ Jan 26 2008, 16:00) *
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

Компилятор вам прямо говорит, что ему не нравится и что нужно делать.
Говорит он, что при ваших установках проекта глобальные регистровые переменные неразрешены.
Нужно эти регистры заблокировать для локальных переменных и подключить библиотеки, где эти заблокированные регистры не используются. Делается это в опциях проекта:
Project->Options->C/C++ Compiler->Code->Number of registers to lock for global variables->9 [R7..R15]

Цитата(prottoss @ Jan 26 2008, 16:24) *
Я так понимаю - __regvar - это уже тип, а вы к нему еще и uint16_t прицепили

Тут это разрешено, uint16_t просто занимает не один, а два регистра. Все равно эти регистры блокируются специальным ключем компилятора.

Цитата(zltigo @ Jan 26 2008, 16:44) *
И почему для этого вопроса была выбрана тема "глюки компилятора"????????

Если принять во внимание, что и вопрос автора темы DiMonstr тоже не имел никакого отношения к глюкам компилятора, то вопрос помещен в правильную тему smile.gif
Go to the top of the page
 
+Quote Post
kamedi_clab
сообщение Jan 26 2008, 16:18
Сообщение #7


Местный
***

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



Вот по стр 189 мануала IAR

Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 26 2008, 16:21
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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
kamedi_clab
сообщение Jan 26 2008, 16:30
Сообщение #9


Местный
***

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



Цитата(prottoss @ Jan 26 2008, 17:24) *
Я так понимаю - __regvar - это уже тип, а вы к нему еще и uint16_t прицепили


Это писатели из ATMEL прицепили в AVR447 - я думаю они знали что делали.
Но проект положить в архив "забыли".

Я лишь попытался создать проект IAR под исходники и скомпилить. Получилось теперь.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 26 2008, 16:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Qwertty @ Jan 26 2008, 23:21) *
Спасибо, понял. Это типа как в ГЦЦ регистр для хранения 0. Хотя не понятен смысл объявления глобальных переменных в регистрах. Слишком много это вызовет ограничений, у таких переменных даже адрес взять нельзя, возможность работы посредством указателя теряется.
Никаких, по моему ограничений нет. Я пару лет назад делал проект на ATTiny2313 на IAR на С. Тоже много глобальных переменных делал регистровых таким же макаром. Обращаться к ним, по моему, тоже можно так же через указатели - ибо адреса регистров находятся в памяти данных с адреса 0! И код, кстати получается практически таким же, как пишешь на ассемблере. Только, в добавок, получаешь все преимущества языка высокого уровня.


--------------------
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 26 2008, 16:49
Сообщение #11


Местный
***

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



Цитата(prottoss @ Jan 26 2008, 19:37) *
Обращаться к ним, по моему, тоже можно так же через указатели - ибо адреса регистров находятся в памяти данных с адреса 0!

К&R, second edition - " Кроме того, применительно к регистровой переменной независимо от того, выделен на самом деле для нее регистр или нет, не определено понятие адреса ". И далеко не все ядра отражают регистры на ОЗУ.

Сообщение отредактировал Qwertty - Jan 26 2008, 16:50
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 26 2008, 16:59
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Qwertty @ Jan 26 2008, 23:49) *
К&R, second edition - " Кроме того, применительно к регистровой переменной независимо от того, выделен на самом деле для нее регистр или нет, не определено понятие адреса ". И далеко не все ядра отражают регистры на ОЗУ.
К К&R обсуждаемый вопрос не имеет отношения, это, как говорилось выше
Цитата
...Memory Attribute - ничем принципиально не отличающийся от подобного назначения __flash, __eeprom, __far и прочих прочих....
То бишь расширение компилятора от IAR for AVR


--------------------
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 26 2008, 17:02
Сообщение #13


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Qwertty @ Jan 26 2008, 18:21) *
Спасибо, понял. Это типа как в ГЦЦ регистр для хранения 0. Хотя не понятен смысл объявления глобальных переменных в регистрах. Слишком много это вызовет ограничений, у таких переменных даже адрес взять нельзя, возможность работы посредством указателя теряется.

В регистрах обычно объявляю глобальные флаги. Операции работы с ними получаются атомарными, сама модификация бита в одну команду процессора. Доступ к флагам, сохраняемым в обычной памяти, длительный. Изменение такого флага это три команды: read-modify-write. А если при этом флаг может изменятся как из основного цикла, так и из прерывания, то приходится в основном цикле еще и запрещать прерывания sad.gif Итого пять команд вместо одной-двух.

А накладных расходов при занимании нескольких регистров немного. Библиотеки используют эти регистры только в математических функциях. Все остальное обычно помещается в стек, к нему доступ удобнее, чем к регистрам R0..R15
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2008, 17:42
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
Qwertty
сообщение Jan 26 2008, 18:19
Сообщение #15


Местный
***

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



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

Посмотрю. Или подожду когда в тред заглянет aesok , чтобы не копаться в куче страниц wink.gif
Цитата(zltigo @ Jan 26 2008, 20:42) *
Ну очень ограниченое сравнение. В частности полный аналог описанного это --zero_register

__zero_reg__, R1, это то же самое про что Вы говорите? Или имеется ввиду R0?

С флагами в регистрах понятно, но я все же иду на сохранение/восстановление прерываний. Все равно немедленной реакции на установленный флаг не будет ( иначе что мешает сразу выполнить обработчик взведенного флага), так что пару лишних команд/тактов на это выделить можно. Зато из за таких "фокусов", хотя и не только из за них, С-ные программы чаще всего непереносимы с платформы на платформу. Никакие HAL тут уже не помогут...
По поводу ИАР-овских расширений - если расширения начинают противоречить стандартам языка, то я например, не стал бы ими пользоваться. А тут противоречие налицо - возможен указатель на регистровую переменную. Нафиг такие расширения smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:56
Рейтинг@Mail.ru


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