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

 
 
> Работа с FLASH памятью МК
koluna
сообщение Sep 8 2009, 22:13
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Здравствуйте!

Помогите, пожалуйста, разобраться!
Необходимо определить в FLASH-памяти строку.
И добраться до неё из программы.
Ниже приведённый код не работает. Почему?

Код
...

prog_uchar x[] = "!!!Test String!!!";

...

Chr = pgm_read_byte(&x[i]);

...


WinAVR 20090313.
Раньше работало (определял через PROGMEM).

Благодарю заранее.

Сообщение отредактировал n_bogoyavlensky - Sep 8 2009, 22:22


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
777777
сообщение Sep 9 2009, 04:42
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(n_bogoyavlensky @ Sep 9 2009, 02:13) *
Раньше работало (определял через PROGMEM).

Очевидно, и сейчас надо определять через PROGMEM smile.gif

Код
const prog_uchar x[] PROGMEM= "!!!Test String!!!";

...

Chr = pgm_read_byte(&x[i]);
Go to the top of the page
 
+Quote Post
koluna
сообщение Sep 9 2009, 05:17
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Совсем неочевидно...
Потому что я сначала так и делал... Но компилятор ругался, типа progmem проигнорирован...
После этого обратился к avr-libc и сделал как там рекомендовано.
Компилятор ругаться перестал.
Но программа работать не начала!
И, о, чудо! Пришёл на работу и скомпилировал на версии WinAVR 20071221 приведённый выше код - работает!!!
Как это объяснить? smile.gif

Кучу времени убил...

Кстати, почему x должна быть глобальной?
Как вообще при определении этой переменной работает компилятор?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 9 2009, 08:18
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Посмотрите внимательно avr-lib FAQ: How do I put an array of strings completely in ROM?
Код
const char test_str[] PROGMEM = "test";


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
koluna
сообщение Sep 10 2009, 05:38
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Почитал. Спасибо.
Кстати, там статья есть приличная в юзер мануале по этому поводу...

Вот чего вычитал, ещё один способ:
Код
...
USART.WriteStringFromFLASH2(PSTR("as1, as2, as3"));
...


Очень удобно, только вот если подобные строки в исходниках дублируются, то в исполняемом файле они тоже дублируются... не очень экономично получается...

Кстати, при применении выше указанного кода (Вами и позже мной) выдаётся сообщение:
Цитата
main.cpp|15|warning: only initialized variables can be placed into program memory area|


Не пойму, к чему бы это...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:11
Рейтинг@Mail.ru


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