Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR IAR C flash
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
NickSmith
Добрый день!

Никак не могу одолеть задачку.
В си возможна конструкция

Код
char *pm="Words";


Т.е указатель на это слово, по которому можно ссылаться на это слово.

Попробовал реализовать это в IARavr

Код
__flash char * __flash pm="Words";

Ругается на не соответствие типов памяти. Т.е компилятор говорит, что я пытаюсь тип char скормить __flash char

Если сделать так:

Код
__flash char *pm="Words";

В таком случае все естествен пихается в озу, но такая конструкция проходит.

P.S.
Понятно, что проблему можно решить через массив, но хочется разобраться именно с такой конструкцией.
Xenia
Пишите так:
Код
__flash char pm[]="Words";

а звёздочков не надо. sm.gif
NickSmith
Цитата(Xenia @ Oct 8 2012, 12:10) *
Пишите так:
Код
__flash char pm[]="Words";

а звёздочков не надо. sm.gif

Так я же писал, что это и ежу понятно.
Хочется с описанной мной ситуацией разобраться. Как инициализировать переменную.
Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash
как компилятору это объяснить.
Xenia
Цитата(NickSmith @ Oct 8 2012, 13:15) *
Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash
как компилятору это объяснить.

Вы бы лучше людям объяснили, чего вы хотите. А то жалуетесь на компилятор, а сами толком не можете сказать, что вам от него надо.

Если конструкция
Код
__flash char pm[]="Words";

понятна не только компилятору, но и ежу, то чем она вас не устраивает? Вы бы сперва толково объяснили, где (в ОЗУ или во флеше?) вы хотите разместить строку "Words" и где (снова в ОЗУ или во флеше?) хотите разместить на нее указатель. Когда вам предлагают решение, в котором строка находится во флеше, а указатель в ОЗУ, то воротите нос. А что вам нравится?

Существуют 4 возможности:
1) Строка во флеше, указатель в ОЗУ.
2) Строка во флеше, указатель тоже во флеше.
3) Строка в ОЗУ, указатель во флеше.
4) Строка в ОЗУ, указатель тоже в ОЗУ.
Вариант № 1 вы отвергли за понятность ежу, остаются еще 3 варианта. Вас как, по частям дожимать или сами признаетесь, чего вам надо?
_Артём_
Так не пойдёт:
Код
__flash char s[]="1234";
char __flash * __flash fptr=s;

?
NickSmith
Цитата(_Артём_ @ 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.

_Артём_
Цитата(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";
NickSmith
Цитата(_Артём_ @ Oct 8 2012, 20:24) *
Так не ругается:
Код
__flash char  * __flash pm="Words";

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

Я все это понимаю, с этой записью мне все понятно.

Я еще только изучаю язык и хочу понять почему вроде бы стандартное объявление не хочет прокатывать в случае объявления указателя и строки в flash Понятно, что сделать можно инициализировав массив каи вы пишите, но ведь синтаксис char *pm="Words"; эквивалентен. В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет.
Ведь считается, что IAR полностью соответствует стандарту.
Сергей Борщ
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;
NickSmith
Цитата(Сергей Борщ @ 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;

Спасибо большое. Теперь мне все понятно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.