Главная arrow Программирование arrow ARM arrow IAR EW ARM: DBGU, хитрости в использовании printf Wednesday, September 20 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

IAR EW ARM: DBGU, хитрости в использовании printf Версия для печати
Написал microsin   
01.03.2009

В статье описаны приемы работы с printf, DBGU, использование их в отладке.

1. Код и реализация printf скрыты от программиста, и иногда эта функция ведет себя непредсказуемо. Например, если вызывать printf в подпрограмме до основного цикла main, то ничего не выведется, но если в main, в основном цикле сделать несколько вызовов printf, то вывод появится. Единственный гарантированный метод, который позволяет побороть это - вывод текста в буфер с помощью sprintf, а затем вывод этого текста собственными процедурами напрямую в экран или порт DBGU.

2. Как перенаправить вывод printf читайте здесь.

3. Чтобы вывести с помощью printf знак процента %, нужно его продублировать:
       printf ("%%");

4. Для отладочного вывода удобно использовать макрос trace_LOG (определен в файле trace.h). Например:
    //запускаем DBGU
    trace_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    trace_LOG(trace_INFO, version_full);

5. Для чтения символов из отладочной консоли DBGU (это можно использовать для пользовательского интерфейса управления разрабатываемым прибором) можно использовать связку USART_IsDataAvailable и DBGU_GetChar, например:
    if ( USART_IsDataAvailable((AT91S_USART *)AT91C_BASE_DBGU) )
    {
        DBGU_GetChar();
        //делаем скриншот
        LED(1);
        ScreenShoot();
        LED(0);
    }

6. Чтобы организовать гарантированный фоновый прием данных от порта DBGU, необходимо это делать по прерываниям. Прерывание USART DBGU (в отличие от обычного USART) обрабатывается через System interrupt (AT91C_ID_SYS, используется для обработки таймера PIT). Поэтому в обработчике PIT необходимо сделать также обработку порта DBGU (например, писать принимаемые с отладочной консоли символы в глобальный кольцевой буфер). Например:
void ISR_Pit(void)
{
    // System Interrupt Handler
    volatile AT91S_DBGU *pDBGU= AT91C_BASE_DBGU;
    volatile unsigned int StatusDBGU;
    volatile unsigned int StatusPITS;
    StatusDBGU = pDBGU->DBGU_CSR;
    StatusPITS = PIT_GetStatus();
    if (StatusPITS & AT91C_PITC_PITS)
    {
        // Check PIT Interrupt
        // Read the PIVR to acknowledge interrupt and get number of ticks.
        // Переменная timestamp отслеживает количество прошедших милисекунд.
        // Это очищает PIT int source.
        timestamp += (PIT_GetPIVR() >> 20);
        // Handle PIT IRQ
        ...
    }
   
    if (StatusDBGU & AT91C_US_RXRDY)
    {
        // Handle DBGU RX
        ...
    }
   
    if (StatusDBGU & AT91C_US_ENDTX)
    {
        // Handle DBGU Tx
        ...
    }
}

[Ссылки]

1. Работа с кольцевым буфером.
2. IAR EW ARM: как перенаправить вывод printf и putchar.

Последнее обновление ( 26.05.2010 )
 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017