|
AVR IAR C flash |
|
|
|
Oct 8 2012, 07:34
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Добрый день! Никак не могу одолеть задачку. В си возможна конструкция Код char *pm="Words"; Т.е указатель на это слово, по которому можно ссылаться на это слово. Попробовал реализовать это в IARavr Код __flash char * __flash pm="Words"; Ругается на не соответствие типов памяти. Т.е компилятор говорит, что я пытаюсь тип char скормить __flash char Если сделать так: Код __flash char *pm="Words"; В таком случае все естествен пихается в озу, но такая конструкция проходит. P.S. Понятно, что проблему можно решить через массив, но хочется разобраться именно с такой конструкцией.
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Oct 8 2012, 09:15
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(Xenia @ Oct 8 2012, 12:10)  Пишите так: Код __flash char pm[]="Words"; а звёздочков не надо.  Так я же писал, что это и ежу понятно. Хочется с описанной мной ситуацией разобраться. Как инициализировать переменную. Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash как компилятору это объяснить.
|
|
|
|
|
Oct 8 2012, 10:40
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(NickSmith @ Oct 8 2012, 13:15)  Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash как компилятору это объяснить. Вы бы лучше людям объяснили, чего вы хотите. А то жалуетесь на компилятор, а сами толком не можете сказать, что вам от него надо. Если конструкция Код __flash char pm[]="Words"; понятна не только компилятору, но и ежу, то чем она вас не устраивает? Вы бы сперва толково объяснили, где (в ОЗУ или во флеше?) вы хотите разместить строку "Words" и где (снова в ОЗУ или во флеше?) хотите разместить на нее указатель. Когда вам предлагают решение, в котором строка находится во флеше, а указатель в ОЗУ, то воротите нос. А что вам нравится? Существуют 4 возможности: 1) Строка во флеше, указатель в ОЗУ. 2) Строка во флеше, указатель тоже во флеше. 3) Строка в ОЗУ, указатель во флеше. 4) Строка в ОЗУ, указатель тоже в ОЗУ. Вариант № 1 вы отвергли за понятность ежу, остаются еще 3 варианта. Вас как, по частям дожимать или сами признаетесь, чего вам надо?
|
|
|
|
|
Oct 8 2012, 16:17
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(_Артём_ @ Oct 8 2012, 19:58)  Так не пойдёт: Код __flash char s[]="1234"; char __flash * __flash fptr=s; ? Хм, такой вариант еще не пробовал. Испытаю. Заранее спасибо. Цитата(Xenia @ Oct 8 2012, 14:40)  Вы бы лучше людям объяснили, чего вы хотите. А то жалуетесь на компилятор, а сами толком не можете сказать, что вам от него надо. Если конструкция Код __flash char pm[]="Words"; понятна не только компилятору, но и ежу, то чем она вас не устраивает? Вы бы сперва толково объяснили, где (в ОЗУ или во флеше?) вы хотите разместить строку "Words" и где (снова в ОЗУ или во флеше?) хотите разместить на нее указатель. Когда вам предлагают решение, в котором строка находится во флеше, а указатель в ОЗУ, то воротите нос. А что вам нравится? Существуют 4 возможности: 1) Строка во флеше, указатель в ОЗУ. 2) Строка во флеше, указатель тоже во флеше. 3) Строка в ОЗУ, указатель во флеше. 4) Строка в ОЗУ, указатель тоже в ОЗУ. Вариант № 1 вы отвергли за понятность ежу, остаются еще 3 варианта. Вас как, по частям дожимать или сами признаетесь, чего вам надо? Я веду речь за стандарт Си. У Керниган & Ритчи говорится, в главе 5.5 , что по мимо записи Код char pm[] ="Words"; есть еще вариант char *pm= "Words"; В последнем случае получается не массив, а простая, строковая переменная в памяти с указателем на нее. Я естественно хочу разместить и указатель и саму строку в flash Код __flash char * __flash pm="Words" в такой записи, компилятор все проглатывает, но слово все равно размещается в ОЗУ. Если записывать Код char __flash * __flash pm="Words" Компилятор ругается: Код Error[Pe144]: a value of type "char *" cannot be used to initialize an entity of type "char __flash *" Мне просто хочется понять, как делать такое объявление указателя и размещать строку и указатель на нее в flash.
|
|
|
|
|
Oct 8 2012, 16:24
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(NickSmith @ Oct 8 2012, 19:17)  Если записывать Код char __flash * __flash pm="Words" Компилятор ругается: Код Error[Pe144]: a value of type "char *" cannot be used to initialize an entity of type "char __flash *" Так не ругается: Код __flash char * __flash pm="Words";
|
|
|
|
|
Oct 8 2012, 16:29
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(_Артём_ @ Oct 8 2012, 20:24)  Так не ругается: Код __flash char * __flash pm="Words"; Но так Words сидит и в flash и в памяти. И обращение с pm получается только как с указателем в памяти.
|
|
|
|
|
Oct 10 2012, 09:40
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(Сергей Борщ @ Oct 9 2012, 11:41)  Имя массива есть указатель на его первый (нулевой) элемент. Пишите __flash char s[]="1234"; и используйте s как указатель. Я все это понимаю, с этой записью мне все понятно. Я еще только изучаю язык и хочу понять почему вроде бы стандартное объявление не хочет прокатывать в случае объявления указателя и строки в flash Понятно, что сделать можно инициализировав массив каи вы пишите, но ведь синтаксис char *pm="Words"; эквивалентен. В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет. Ведь считается, что IAR полностью соответствует стандарту.
|
|
|
|
|
Oct 10 2012, 10:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (NickSmith @ Oct 10 2012, 12:40)  В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет. Ведь считается, что IAR полностью соответствует стандарту. __flash является расширением языка. Поэтому его реализация полностью отдана IAR. В его описании компилятора приведен ваш случай: QUOTE Putting strings in flash This can be done on individual strings or for the whole application/file using the option --string_literals_in_flash. Examples on how to put individual strings into flash: __flash char str1[] = "abcdef"; __flash char str2[] = "ghi"; __flash char __flash * pVar[] = { str1, str2 }; String literals cannot be put in flash automatically, but you can use a local static variable instead: #include <pgmspace.h> void f (int i) { static __flash char sl[] = "%d cookies\n"; printf_P(sl, i); } Фактически IAR реализовал концепцию нескольких адресных пространств, которой тогда еще не было в стандарте языка. Сейчас адресные пространства являются частью стандарта, и именно по стандарту в случае char __flash * __flash pm="Words" строковый литерал "Words" должен располагаться в основном адресном пространстве (ОЗУ), после чего его адрес должен быть присвоен указателю pm с соответствующим приведением типа (а в этом случае такое приведение невозможно и должно выдаваться сообщение об ошибке). Недавно мне встречалось развернутое объяснение этого в рассылке gcc, но сейчас сразу не могу найти ссылку на него, пока нашел только его результат: http://www.avrfreaks.net/index.php?name=PN...p=994863#994863. Если вы хотите иметь и строку и отдельный указатель на нее и чтобы оба они лежали во флеше, вам надо делать это в два шага: CODE __flash char str1[] = "abcdef"; __flash char __flash * pm = str1;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 10 2012, 15:29
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(Сергей Борщ @ Oct 10 2012, 14:09)  __flash является расширением языка. Поэтому его реализация полностью отдана IAR. В его описании компилятора приведен ваш случай: Фактически IAR реализовал концепцию нескольких адресных пространств, которой тогда еще не было в стандарте языка. Сейчас адресные пространства являются частью стандарта, и именно по стандарту в случае char __flash * __flash pm="Words" строковый литерал "Words" должен располагаться в основном адресном пространстве (ОЗУ), после чего его адрес должен быть присвоен указателю pm с соответствующим приведением типа (а в этом случае такое приведение невозможно и должно выдаваться сообщение об ошибке). Недавно мне встречалось развернутое объяснение этого в рассылке gcc, но сейчас сразу не могу найти ссылку на него, пока нашел только его результат: http://www.avrfreaks.net/index.php?name=PN...p=994863#994863. Если вы хотите иметь и строку и отдельный указатель на нее и чтобы оба они лежали во флеше, вам надо делать это в два шага: Код __flash char str1[] = "abcdef"; __flash char __flash * pm = str1; Спасибо большое. Теперь мне все понятно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|