|
|
  |
Рассуждения о _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, 14:24
|

Гуру
     
Группа: Свой
Сообщений: 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 Кб) А что не понятного?  Компилятор же вам честно говорит - Registers must be locked with --lock_regs .... before __regvar can be usedРазберетесь - заодно и людей, читающих курс научите IAR for AVR, к сожалению, сейчас нет, но разве можно регистровые переменные объявлять как Код __no_init __regvar volatile uint16_t sineTableIncrement @14; Я так понимаю - __regvar - это уже тип, а вы к нему еще и uint16_t прицепили
--------------------
|
|
|
|
|
Jan 26 2008, 14:44
|

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

Просто 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 тоже не имел никакого отношения к глюкам компилятора, то вопрос помещен в правильную тему
|
|
|
|
|
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, 16:30
|
Местный
  
Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004

|
Цитата(prottoss @ Jan 26 2008, 17:24)  Я так понимаю - __regvar - это уже тип, а вы к нему еще и uint16_t прицепили Это писатели из ATMEL прицепили в AVR447 - я думаю они знали что делали. Но проект положить в архив "забыли". Я лишь попытался создать проект IAR под исходники и скомпилить. Получилось теперь.
|
|
|
|
|
Jan 26 2008, 16:37
|

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

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

|
Цитата(prottoss @ Jan 26 2008, 19:37)  Обращаться к ним, по моему, тоже можно так же через указатели - ибо адреса регистров находятся в памяти данных с адреса 0! К&R, second edition - " Кроме того, применительно к регистровой переменной независимо от того, выделен на самом деле для нее регистр или нет, не определено понятие адреса ". И далеко не все ядра отражают регистры на ОЗУ.
Сообщение отредактировал Qwertty - Jan 26 2008, 16:50
|
|
|
|
|
Jan 26 2008, 16:59
|

Гуру
     
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
|
Jan 26 2008, 17:02
|

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

|
Цитата(Qwertty @ Jan 26 2008, 18:21)  Спасибо, понял. Это типа как в ГЦЦ регистр для хранения 0. Хотя не понятен смысл объявления глобальных переменных в регистрах. Слишком много это вызовет ограничений, у таких переменных даже адрес взять нельзя, возможность работы посредством указателя теряется. В регистрах обычно объявляю глобальные флаги. Операции работы с ними получаются атомарными, сама модификация бита в одну команду процессора. Доступ к флагам, сохраняемым в обычной памяти, длительный. Изменение такого флага это три команды: read-modify-write. А если при этом флаг может изменятся как из основного цикла, так и из прерывания, то приходится в основном цикле еще и запрещать прерывания  Итого пять команд вместо одной-двух. А накладных расходов при занимании нескольких регистров немного. Библиотеки используют эти регистры только в математических функциях. Все остальное обычно помещается в стек, к нему доступ удобнее, чем к регистрам R0..R15
|
|
|
|
|
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:19
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(zltigo @ Jan 26 2008, 20:42)  Поверьте моему опыту - игнорирут. Посмотрите документацию на любимый компилятор и увидете чего-нибудь типа User requests for register variables are ignored. Посмотрю. Или подожду когда в тред заглянет aesok , чтобы не копаться в куче страниц Цитата(zltigo @ Jan 26 2008, 20:42)  Ну очень ограниченое сравнение. В частности полный аналог описанного это --zero_register __zero_reg__, R1, это то же самое про что Вы говорите? Или имеется ввиду R0? С флагами в регистрах понятно, но я все же иду на сохранение/восстановление прерываний. Все равно немедленной реакции на установленный флаг не будет ( иначе что мешает сразу выполнить обработчик взведенного флага), так что пару лишних команд/тактов на это выделить можно. Зато из за таких "фокусов", хотя и не только из за них, С-ные программы чаще всего непереносимы с платформы на платформу. Никакие HAL тут уже не помогут... По поводу ИАР-овских расширений - если расширения начинают противоречить стандартам языка, то я например, не стал бы ими пользоваться. А тут противоречие налицо - возможен указатель на регистровую переменную. Нафиг такие расширения
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|