Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Процедура вывода отладочной информации
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
west329_
Хочу немного упростит процедуру вывода отладочной информации.

По класической схеме да и в моей программе отладочные строки типа "Ошибка", "Время вышло" описываются вначале программы с префиксом __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
IgorKossak
У компилятора есть такая опция --string_literals_in_flash, в документации EWAVR_CompilerReference.pdf подробно описано. Если работаете в среде, то добавьте эту опцию в Project->Options...->C/C++ Compiler->Extra Options
west329_
Цитата(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 *"


я вобще не использую встроенных функций библиотек ввода вывода они у меня свои может из за этого
IgorKossak
Цитата(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 как определена?
west329_
Цитата(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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.