Перейти к содержанию
    

AVR IAR C flash

Добрый день!

 

Никак не могу одолеть задачку.

В си возможна конструкция

 

char *pm="Words";

 

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

 

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

 

__flash char * __flash pm="Words";

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

 

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

 

__flash char *pm="Words";

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

 

P.S.

Понятно, что проблему можно решить через массив, но хочется разобраться именно с такой конструкцией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишите так:

__flash char pm[]="Words";

а звёздочков не надо. :)

Так я же писал, что это и ежу понятно.

Хочется с описанной мной ситуацией разобраться. Как инициализировать переменную.

Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash

как компилятору это объяснить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash

как компилятору это объяснить.

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

 

Если конструкция

__flash char pm[]="Words";

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

 

Существуют 4 возможности:

1) Строка во флеше, указатель в ОЗУ.

2) Строка во флеше, указатель тоже во флеше.

3) Строка в ОЗУ, указатель во флеше.

4) Строка в ОЗУ, указатель тоже в ОЗУ.

Вариант № 1 вы отвергли за понятность ежу, остаются еще 3 варианта. Вас как, по частям дожимать или сами признаетесь, чего вам надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так не пойдёт:

__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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если записывать

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";

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так не ругается:

__flash char  * __flash pm="Words";

Но так Words сидит и в flash и в памяти.

И обращение с pm получается только как с указателем в памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имя массива есть указатель на его первый (нулевой) элемент. Пишите __flash char s[]="1234"; и используйте s как указатель.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имя массива есть указатель на его первый (нулевой) элемент. Пишите __flash char s[]="1234"; и используйте s как указатель.

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

 

Я еще только изучаю язык и хочу понять почему вроде бы стандартное объявление не хочет прокатывать в случае объявления указателя и строки в flash Понятно, что сделать можно инициализировав массив каи вы пишите, но ведь синтаксис char *pm="Words"; эквивалентен. В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет.

Ведь считается, что IAR полностью соответствует стандарту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет.

Ведь считается, что 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__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;

Спасибо большое. Теперь мне все понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...