реклама на сайте
подробности

 
 
> AVR IAR C flash
NickSmith
сообщение Oct 8 2012, 07:34
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Добрый день!

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

Код
char *pm="Words";


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

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

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

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

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

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

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

P.S.
Понятно, что проблему можно решить через массив, но хочется разобраться именно с такой конструкцией.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
Xenia
сообщение Oct 8 2012, 08:10
Сообщение #2


Гуру
******

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



Пишите так:
Код
__flash char pm[]="Words";

а звёздочков не надо. sm.gif
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Oct 8 2012, 09:15
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(Xenia @ Oct 8 2012, 12:10) *
Пишите так:
Код
__flash char pm[]="Words";

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

Так я же писал, что это и ежу понятно.
Хочется с описанной мной ситуацией разобраться. Как инициализировать переменную.
Как я понимаю, компилятору не нравится, что я пихаю в переменную во flash данные не из flash
как компилятору это объяснить.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 8 2012, 10:40
Сообщение #4


Гуру
******

Группа: Модератор 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 варианта. Вас как, по частям дожимать или сами признаетесь, чего вам надо?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 15:58
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Так не пойдёт:
Код
__flash char s[]="1234";
char __flash * __flash fptr=s;

?
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Oct 8 2012, 16:17
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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.

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 16:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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";
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Oct 8 2012, 16:29
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



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

Но так Words сидит и в flash и в памяти.
И обращение с pm получается только как с указателем в памяти.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2012, 07:41
Сообщение #9


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Oct 10 2012, 09:40
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



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

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

Я еще только изучаю язык и хочу понять почему вроде бы стандартное объявление не хочет прокатывать в случае объявления указателя и строки в flash Понятно, что сделать можно инициализировав массив каи вы пишите, но ведь синтаксис char *pm="Words"; эквивалентен. В юниксе эта конструкция без вопросов инициализируется при объявлении, а тут не хочет.
Ведь считается, что IAR полностью соответствует стандарту.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2012, 10:09
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Oct 10 2012, 15:29
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 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;

Спасибо большое. Теперь мне все понятно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 10:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0155 секунд с 7
ELECTRONIX ©2004-2016