NickSmith 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Добрый день! Никак не могу одолеть задачку. В си возможна конструкция char *pm="Words"; Т.е указатель на это слово, по которому можно ссылаться на это слово. Попробовал реализовать это в IARavr __flash char * __flash pm="Words"; Ругается на не соответствие типов памяти. Т.е компилятор говорит, что я пытаюсь тип char скормить __flash char Если сделать так: __flash char *pm="Words"; В таком случае все естествен пихается в озу, но такая конструкция проходит. P.S. Понятно, что проблему можно решить через массив, но хочется разобраться именно с такой конструкцией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 36 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Пишите так: __flash char pm[]="Words"; а звёздочков не надо. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NickSmith 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Пишите так: __flash char pm[]="Words"; а звёздочков не надо. :) Так я же писал, что это и ежу понятно. Хочется с описанной мной ситуацией разобраться. Как инициализировать переменную. Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash как компилятору это объяснить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 36 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash как компилятору это объяснить. Вы бы лучше людям объяснили, чего вы хотите. А то жалуетесь на компилятор, а сами толком не можете сказать, что вам от него надо. Если конструкция __flash char pm[]="Words"; понятна не только компилятору, но и ежу, то чем она вас не устраивает? Вы бы сперва толково объяснили, где (в ОЗУ или во флеше?) вы хотите разместить строку "Words" и где (снова в ОЗУ или во флеше?) хотите разместить на нее указатель. Когда вам предлагают решение, в котором строка находится во флеше, а указатель в ОЗУ, то воротите нос. А что вам нравится? Существуют 4 возможности: 1) Строка во флеше, указатель в ОЗУ. 2) Строка во флеше, указатель тоже во флеше. 3) Строка в ОЗУ, указатель во флеше. 4) Строка в ОЗУ, указатель тоже в ОЗУ. Вариант № 1 вы отвергли за понятность ежу, остаются еще 3 варианта. Вас как, по частям дожимать или сами признаетесь, чего вам надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Так не пойдёт: __flash char s[]="1234"; char __flash * __flash fptr=s; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NickSmith 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Так не пойдёт: __flash char s[]="1234"; char __flash * __flash fptr=s; ? Хм, такой вариант еще не пробовал. Испытаю. Заранее спасибо. Вы бы лучше людям объяснили, чего вы хотите. А то жалуетесь на компилятор, а сами толком не можете сказать, что вам от него надо. Если конструкция __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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Если записывать 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"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NickSmith 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Так не ругается: __flash char * __flash pm="Words"; Но так Words сидит и в flash и в памяти. И обращение с pm получается только как с указателем в памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 9 октября, 2012 Опубликовано 9 октября, 2012 · Жалоба Имя массива есть указатель на его первый (нулевой) элемент. Пишите __flash char s[]="1234"; и используйте s как указатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NickSmith 0 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба Имя массива есть указатель на его первый (нулевой) элемент. Пишите __flash char s[]="1234"; и используйте s как указатель. Я все это понимаю, с этой записью мне все понятно. Я еще только изучаю язык и хочу понять почему вроде бы стандартное объявление не хочет прокатывать в случае объявления указателя и строки в flash Понятно, что сделать можно инициализировав массив каи вы пишите, но ведь синтаксис char *pm="Words"; эквивалентен. В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет. Ведь считается, что IAR полностью соответствует стандарту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет. Ведь считается, что IAR полностью соответствует стандарту. __flash является расширением языка. Поэтому его реализация полностью отдана IAR. В его описании компилятора приведен ваш случай: 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. Если вы хотите иметь и строку и отдельный указатель на нее и чтобы оба они лежали во флеше, вам надо делать это в два шага: __flash char str1[] = "abcdef"; __flash char __flash * pm = str1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NickSmith 0 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба __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; Спасибо большое. Теперь мне все понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться