koluna 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 (изменено) · Жалоба Здравствуйте! Помогите, пожалуйста, разобраться! Необходимо определить в FLASH-памяти строку. И добраться до неё из программы. Ниже приведённый код не работает. Почему? ... prog_uchar x[] = "!!!Test String!!!"; ... Chr = pgm_read_byte(&x[i]); ... WinAVR 20090313. Раньше работало (определял через PROGMEM). Благодарю заранее. Изменено 8 сентября, 2009 пользователем n_bogoyavlensky Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 9 сентября, 2009 Опубликовано 9 сентября, 2009 · Жалоба Раньше работало (определял через PROGMEM). Очевидно, и сейчас надо определять через PROGMEM :) const prog_uchar x[] PROGMEM= "!!!Test String!!!"; ... Chr = pgm_read_byte(&x[i]); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koluna 0 9 сентября, 2009 Опубликовано 9 сентября, 2009 · Жалоба Совсем неочевидно... Потому что я сначала так и делал... Но компилятор ругался, типа progmem проигнорирован... После этого обратился к avr-libc и сделал как там рекомендовано. Компилятор ругаться перестал. Но программа работать не начала! И, о, чудо! Пришёл на работу и скомпилировал на версии WinAVR 20071221 приведённый выше код - работает!!! Как это объяснить? :) Кучу времени убил... Кстати, почему x должна быть глобальной? Как вообще при определении этой переменной работает компилятор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 9 сентября, 2009 Опубликовано 9 сентября, 2009 · Жалоба Посмотрите внимательно avr-lib FAQ: How do I put an array of strings completely in ROM? const char test_str[] PROGMEM = "test"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koluna 0 10 сентября, 2009 Опубликовано 10 сентября, 2009 · Жалоба Почитал. Спасибо. Кстати, там статья есть приличная в юзер мануале по этому поводу... Вот чего вычитал, ещё один способ: ... USART.WriteStringFromFLASH2(PSTR("as1, as2, as3")); ... Очень удобно, только вот если подобные строки в исходниках дублируются, то в исполняемом файле они тоже дублируются... не очень экономично получается... Кстати, при применении выше указанного кода (Вами и позже мной) выдаётся сообщение: main.cpp|15|warning: only initialized variables can be placed into program memory area| Не пойму, к чему бы это... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться