|
Размещение строки во флэш, что не так? |
|
|
|
Dec 3 2008, 06:53
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Как то так, наверное Код uint8_t *function_name[] PROGMEM = { (uint8_t *) fn0, (uint8_t *) fn1}; Кстати, а зачем вы типы приводите? Так Код uint8_t *function_name[] PROGMEM = { fn0, fn1}; разве не компилится?
|
|
|
|
|
Dec 3 2008, 06:55
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Используйте готовый макросы PSTR и PGM_P. например, так: Код PROGMEM char str1[] = "name1" PROGMEM char str2[] = "name2"; PROGMEM PGM_P names[] = { str1, str2};
lcd_print_P(pgm_read_word(&names[1])); ваш код почти верный, только вы забыли, что для считывания из флеши данных надо использовать макрос pgm_read_byte или pgm_read_word
Сообщение отредактировал ARV - Dec 3 2008, 07:10
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Dec 3 2008, 06:57
|

Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544

|
Цитата(ARV @ Dec 3 2008, 11:55)  Используйте готовый макросы PSTR и PGM_P. например, так: Код PROGMEM PGM_P names[] = {PSTR("name1"), PSTR("name2")};
lcd_print_P(pgm_read_word(&names[1])); ваш код почти верный, только вы забыли, что для считывания из флеши данных надо использовать макрос pgm_read_byte или pgm_read_wordСпасибо, буду пробовать
|
|
|
|
|
Dec 3 2008, 07:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
извините, поспешил правильно так: Код PROGMEM char str1[] = "name1"; PROGMEM char str2[] = "name2";
PROGMEM PGM_P names[] = {str1, str2}; остальное - как и говорил ранее
Сообщение отредактировал ARV - Dec 3 2008, 07:09
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Dec 3 2008, 08:05
|

Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544

|
Цитата(ARV @ Dec 3 2008, 12:08)  извините, поспешил правильно так: Код PROGMEM char str1[] = "name1"; PROGMEM char str2[] = "name2";
PROGMEM PGM_P names[] = {str1, str2}; остальное - как и говорил ранее Спасибо. Это работает.
|
|
|
|
|
Dec 3 2008, 13:55
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(haker_fox @ Dec 3 2008, 13:36)  prog_char testString[] ="something here..."; Тогда массив testString будет размещен во флеш памяти. В версии компилятора 4.3.2 такой массив будет расположен в ОЗУ. Необходимо прямое указание PROGMEM. Например: Код PROGMEM char testString[] ="something here..."; Не знаю, почему так...
|
|
|
|
|
Dec 3 2008, 14:31
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(sonycman @ Dec 3 2008, 17:55)  В версии компилятора 4.3.2 такой массив будет расположен в ОЗУ. Необходимо прямое указание PROGMEM. Например: Не верю! Winavr20081118rc2 Код prog_char testString[] ="something here..."; int main(void){ // там один раз упомянули адрес этой строки Код 2e: 26 c0 rjmp .+76 ; 0x7c <__bad_interrupt> 30: 25 c0 rjmp .+74 ; 0x7c <__bad_interrupt> 32: 24 c0 rjmp .+72 ; 0x7c <__bad_interrupt>
00000034 <testString>: 34: 73 6f 6d 65 74 68 69 6e 67 20 68 65 72 65 2e 2e something here.. 44: 2e 00 ..
|
|
|
|
|
Dec 3 2008, 15:40
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(_Pasha @ Dec 3 2008, 18:31)  Не верю! Winavr20081118rc2 Пжалста: Код #include <avr/pgmspace.h>
prog_char testString[] ="something here...";
int main(void) { char a; PGM_P p = testString; do { a = pgm_read_byte(p++); }while (a);
return 0; } и из листинга: Код 00800060 g O .data 00000012 testString Тот же самый WinAVR-20081118rc2. Цитата(defunct @ Dec 3 2008, 19:30)  pgm_print("hello\n"); pgm_print("this program demonstrates an easy way of\n"); pgm_print("printing string literals stored in flash\n"); Действительно, красиво сделано
|
|
|
|
|
Dec 3 2008, 15:54
|

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

|
Цитата(sonycman @ Dec 3 2008, 15:55)  В версии компилятора 4.3.2 такой массив будет расположен в ОЗУ. Необходимо прямое указание PROGMEM. Например: А если посмотреть pgmspace.h, то можно увидеть Код typedef char PROGMEM prog_char; Теперь объясняйте - в чем разница?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 3 2008, 15:57
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Сергей Борщ @ Dec 3 2008, 19:54)  А если посмотреть pgmspace.h, то можно увидеть Код typedef char PROGMEM prog_char; Теперь объясняйте - в чем разница? Это всё понятно. Только не мне объяснять, почему - откуда я знаю? Выше приведён пример, в котором строка после компиляции помещается в ОЗУ. А вот если сделать вот так: Код #include <avr/pgmspace.h>
PROGMEM char testString[] ="something here...";
int main(void) { char a; PGM_P p = testString; do { a = pgm_read_byte(p++); }while (a);
return 0; } то всё в порядке: Код 00000054 g O .text 00000012 testString
00000054 <testString>: 54: 73 6f 6d 65 74 68 69 6e 67 20 68 65 72 65 2e 2e something here.. 64: 2e 00 .. Попробуйте лучше вы это объяснить Я-то всего лишь любитель...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|