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

 
 
 
Reply to this topicStart new topic
> Процедура вывода отладочной информации, (из FLASH)
west329_
сообщение Aug 13 2008, 08:22
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Хочу немного упростит процедуру вывода отладочной информации.

По класической схеме да и в моей программе отладочные строки типа "Ошибка", "Время вышло" описываются вначале программы с префиксом __flash вот так

Код
__flash unsigned char PPPerr1[14] = {"\x0D\x0A CRC Error\x0D\x0A"};



потом в самой программе я вызываю функцию вывода отладочной строки через указатель на первый символ этой строки
Код
#ifdef debugPPP
  PrintSTRfronFLASH( &PPPerr1[0], 14, DEBUG);     //CRC Error
#endif


все работает нормально но когда объемы исходного кода большие приходится каждый раз переходить в начало страницы и обявлять новые строки

Код
__flash unsigned char PPPerr...
__flash unsigned char PPPerr..
__flash unsigned char PPPerr..
__flash unsigned char PPPerr...



Возможно ли непостредственно в процедуре вызова обявлять выводимую строку ???
что подобное этому

Код
PrintSTRfronFLASHa( "\x0d Hello WORLD" , DEBUG);



У меня такое работает только если строка находится в SRAM, как только добавляю префикс
Код
__flash
пишет ошибку

Код
Error[Pe167]: argument of type "char *" is incompatible with  E:\RADIO\IAR4.21A\avr\tutor\Xbox4\main.c 87
parameter of type "unsigned char __flash *"



вот мои процедуры для
Код
void main(void);
void PrintDebug(unsigned char __flash stringD[25]);




void PrintDebug(unsigned char __flash stringD[25])
{
unsigned temp = 0;
  for(temp = 0; stringD[temp] != 0; temp += 1)
    putchar(stringD[temp], DEBUG);

}

void main(void)
{
PrintDebug("\x0d Hello WORLD");
while(1);
}


если такое возможно.
компилято IAR 4.20 for AVR

Сообщение отредактировал west329_ - Aug 13 2008, 08:26
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 13 2008, 08:37
Сообщение #2


Шаман
******

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



У компилятора есть такая опция --string_literals_in_flash, в документации EWAVR_CompilerReference.pdf подробно описано. Если работаете в среде, то добавьте эту опцию в Project->Options...->C/C++ Compiler->Extra Options
Go to the top of the page
 
+Quote Post
west329_
сообщение Aug 13 2008, 09:10
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(IgorKossak @ Aug 13 2008, 11:37) *
У компилятора есть такая опция --string_literals_in_flash, в документации EWAVR_CompilerReference.pdf подробно описано. Если работаете в среде, то добавьте эту опцию в Project->Options...->C/C++ Compiler->Extra Options


добавил. легче не стало
Код
Error[Pe167]: argument of type "char __farflash *" is incompatible  E:\RADIO\IAR4.21A\avr\tutor\Xbox4\main.c 87
with parameter of type "unsigned char *"


я вобще не использую встроенных функций библиотек ввода вывода они у меня свои может из за этого
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 13 2008, 09:39
Сообщение #4


Шаман
******

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



Цитата(west329_ @ Aug 13 2008, 12:10) *
добавил. легче не стало
Код
Error[Pe167]: argument of type "char __farflash *" is incompatible  E:\RADIO\IAR4.21A\avr\tutor\Xbox4\main.c 87
with parameter of type "unsigned char *"

В своих функциях вывода обьявите аргументы как char __farflash *, наверное так
Код
void PrintDebug(char __farflash *stringD)

Цитата(west329_ @ Aug 13 2008, 12:10) *
я вобще не использую встроенных функций библиотек ввода вывода они у меня свои может из за этого

Не из за этого.
Кстати, putchar как определена?
Go to the top of the page
 
+Quote Post
west329_
сообщение Aug 13 2008, 09:57
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(IgorKossak @ Aug 13 2008, 12:39) *
В своих функциях вывода обьявите аргументы как char __farflash *, наверное так
Код
void PrintDebug(char __farflash *stringD)


Не из за этого.
Кстати, putchar как определена?

Использую свою реализацию.
Код
/***********************************************************************
Function :    putchar
Parameters :  
Date :  
Desc :        
***********************************************************************/
void putchar(unsigned char tx_char, unsigned char CASE_UART)
{
  
    switch(CASE_UART)
    {
    case UART_1:{                                        
                while( !(UCSR0A & (1 << UDRE0) ) );
                UDR0 = tx_char;
                break;}

    case UART_2:{                                        
                while( !(UCSR1A & (1 << UDRE1) ) );        
                UDR1 = tx_char;
                break;}
    case UART_3:{                                
                sUARTtx(tx_char);
                break;}
    }

}



Благодарюю Все заработало.

Если комуто еще надо делаем следущие:

1. Добавьте эту опцию в Project->Options...->C/C++ Compiler->Extra Options /--string_literals_in_flash/

2. Обявляем:
Цитата
void PrintDebug(unsigned char __farflash stringD[25]);

void PrintDebug(unsigned char __farflash stringD[25])
{
unsigned temp = 0;
for(temp = 0; stringD[temp] != 0; temp += 1)
putchar(stringD[temp], DEBUG);

}

3. Вызываем так:
Цитата
PrintDebug("--== Hello WORLD ==-");


Все строки находятся во FLASH mem
cool.gif

Сообщение отредактировал west329_ - Aug 13 2008, 10:03
Go to the top of the page
 
+Quote Post

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

 


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


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