|
из флєш - в уарт, как организовать вывод в уарт строки находящейся во флэш |
|
|
|
Feb 3 2006, 11:21
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 20-10-05
Пользователь №: 9 886

|
Подскажите,как в IAR сделать следующее
есть строка в флэш
обьявляю строку: __flash unsigned char on[] = "\nON command received!\0";
указатель не нее unsigned char __flash *on_ptr=&on[0];
хочу вывести на екран.пишу функцию: void USART_transmit_string_from_flash(unsigned char __flash *ptr) { while(*ptr) { USART_transmit(*ptr++);//функция вывода байта } }
компилятор не ругается но и программа не работает. подскажите,в чем дело.
спасибо
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 19)
|
Feb 3 2006, 11:30
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 6-10-05
Пользователь №: 9 276

|
Что именно не работает? и при чем здесь экран? программ передачи байта живая?
|
|
|
|
|
Feb 3 2006, 11:47
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 20-10-05
Пользователь №: 9 886

|
да,живая.не виводится ничего в терминал(bray). сейчас нашел в аппнотах драйвер к терминалу.там есть что то похожее.пробую
|
|
|
|
|
Feb 10 2006, 07:56
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 19-10-05
Пользователь №: 9 821

|
А USART_transmit функция или макрос? Если макром, то инструкции вида *ptr++ использовать нельзя!
А USART_transmit функция или макрос? Если макром, то инструкции вида *ptr++ использовать нельзя!
|
|
|
|
|
Feb 10 2006, 11:29
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(defunct @ Feb 4 2006, 00:00)  Проверил - работает: Код void USART_transmit_string_from_flash(unsigned char __flash *ptr) { unsigned char c; while(*ptr) { c = *ptr++; USART_transmit( c ); } } Если и работает то строка лежит в озу, при инициализации памяти туда помещается. а нада чтоб из флеша читалась void write_str_from_prg(PGM_P str) { while(pgm_read_byte(str)) put_uart(pgm_read_byte(str++)); } в GCC так делается
|
|
|
|
|
Feb 10 2006, 13:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Неинтересно мучаться с модификаторам в зависимости от источника данных - проще через __generic Ну и насчет макроса - или показывайте какой он крутой, или не юзайте в таком контексте - "подводные грабли" могут быть  ) __flash unsigned char on[] = "\nON command received!\0"; void USART_transmit_string_from_flash(unsigned char __generic *ptr) { unsigned char c; while(*ptr) { c=ptr++; USART_transmit©;//функция вывода байта } } Вызов USART_transmit_string_from_flash(&on[0]);
--------------------
aka Vit
|
|
|
|
|
Feb 10 2006, 14:39
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(sensor_ua @ Feb 10 2006, 15:49)  USART_transmit_string_from_flash(&on[0]); Ну тогда бы я её назвал Код USART_transmit_string_from_anywhere(); за исключением, разве что, EEPROM, как говорили раньше в других постах. Тем не менее, это по-моему будет непереносимо на GCC.
|
|
|
|
|
Feb 14 2006, 12:40
|
Местный
  
Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957

|
У меня с Уартом в порядке, а вот при сравнении компилятор выдает ошибку Код char HexCom[9]; __flash char Status[] = "STATUS\0";
if (strcmp(HexCom, Status) == 0) response_sms(1); Код Error[Pe167]: argument of type "char __flash *" is incompatible with parameter of type "char const *"
--------------------
Обычно последним смеется тот, кто хуже соображает!
|
|
|
|
|
Feb 14 2006, 13:53
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(Георгий @ Feb 14 2006, 14:40)  У меня с Уартом в порядке, а вот при сравнении компилятор выдает ошибку Код char HexCom[9]; __flash char Status[] = "STATUS\0";
if (strcmp(HexCom, Status) == 0) response_sms(1); Код Error[Pe167]: argument of type "char __flash *" is incompatible with parameter of type "char const *" Логика компилятора железная - не совпадают типы. Пользуйтесь strcmp_P!
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Feb 15 2006, 07:54
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 1-12-04
Пользователь №: 1 267

|
__flash char Status[] = "STATUS\0";
if (strcmp(HexCom, (char *)Status) == 0) response_sms(1);
|
|
|
|
|
Feb 15 2006, 09:06
|
Местный
  
Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957

|
Только судя по листингам результат будет ошибочный. Код \ 000000C8 .... RCALL gsb_decoder \ 000000CA E026 LDI R18, 6 \ 000000CC .... LDI R17, LOW(Status) \ 000000CE .... LDI R16, HexCom \ 000000D0 .... RCALL strncmp \ 000000D2 2B01 OR R16, R17
\ 000000C8 .... RCALL gsb_decoder \ 000000CA E006 LDI R16, 6 \ 000000CC .... LDI R30, LOW(Status) \ 000000CE .... LDI R31, Status >> 8 \ 000000D0 .... LDI R26, HexCom \ 000000D2 .... RCALL strncmp_P \ 000000D4 2B01 OR R16, R17 В первом случае он возьмет байт по LD, а во втором по LPM
Сообщение отредактировал Георгий - Feb 15 2006, 09:12
--------------------
Обычно последним смеется тот, кто хуже соображает!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|