microchip

Освоение PIC32MX. Методы отладки программного обеспечения.

  Tips and Tricks PIC32MX

В данном разделе мы постараемся собрать полезные советы по отладке и конфигурированию контроллеров PIC32.



  •  

    Контекстный ввод-вывод
    Необходимое ПО и оборудование
    Модуль отладки ядра MIPS32 MK4 позволяет использовать JTAG канал для вывода и ввода информации в процессор, образуя, таким образом, виртуальный канал передачи сообщений. При использовании библиотеки db_utils.a подобный канал организуется совместно с отладчиком, установленным на плате PIC32 Starter Kit или PIC32 USB Board - для ввода и вывода сообщений больше не нужно занимать отдельный порт UART. Сообщения выводятся в отладочную консоль MPLAB, а при вводе сообщений всплывает меню с запросом ввода текстовой строки.
    Список функций библиотеки db_utils:

    MPLAB IDE
    MPLAB C32

    PIC32 Starter Kit
    или
    PIC32 USB Board

    Функция
    Описание
    DBINIT(void) Инициализация библиотеки. Эта функция должна быть
    вызвана до момента вызова любой другой.
    DBPUTC(const unsigned char *c) Вывод первого символа строки c
    DBPUTS(const unsigned char *s) Вывод строки s (строка должна заканчиваться нулевым
    терминатором)
    DBGETC(unsigned char *c) Считывание одного символа из поля ввода в строку c
    DBGETS(unsigned char *s, int len) Считывание len символов из поля ввода в строку s
    DBPRINTF(const char *format, ...) Форматированный вывод. Правила форматирования
    соответствуют библиотечной функции printf().

    Пример кода
    Окно вывода
    int main (void) {
        DBINIT();
        DBPUTS("Добро пожаловать на Russian Masters 2008!\n");
        DBPUTS("-----------------------------------------\n");
        DBPUTS("--------- Лабораторная работа №1 --------\n");
        DBPUTS("-----------------------------------------\n");
    
        for (;;) {
            memset(buffer, 0, sizeof(buffer));
            DBGETS(buffer, sizeof(buffer));
            DBPUTS(buffer);
            if (!strcmp(buffer, "quit"))
                break;
        }
    
        DBPUTS("Программа завершена!\n");
    
        return 0;
    }
    
    ...
    if (!(buttons & BTN_GREEN)) {    
        if (!(state & LED_GREEN)) {
            mPORTDSetBits(LED_GREEN);
            DBPUTS("Зеленый светодиод включен\n");
            state |= LED_GREEN;
        }
    } else {    
        if (state & LED_GREEN) {
            mPORTDClearBits(LED_GREEN);
            DBPUTS("Зеленый светодиод отключен\n");                             
            state &= ~LED_GREEN;
       }
    }
    ...

     

    Ввод-вывод данных через порт UART в симуляторе Необходимое ПО и оборудование
    Для симуляции приема и выдачи сообщений через UART, в среде разработки MPLAB IDE есть несколько встроенных функций. В отличии от Контекстного Ввода-Вывода вместо канала отладки JTAG используется один из портов UART. Среда разработки MPLAB IDE позволяет получать данные в UART1 из внешнего файла и выводить передаваемые данные в окно отладки Output. Естественно, что для правильной симуляции UART1 его необходимо предварительно правильно проинициализировать. MPLAB IDE
    MPLAB C32

    Для симуляции приема данных от внешнего устройства необходимо создать файл данных с описанием последовательности принимаемых данных и временных интервалов

    //single-packet example
    wait 10 ms 		// передача данных с интервалом в 10мс.
    15 15 32		// передаваемые данные 
    rand 50 200 ms 	// передача данных со случайным интервалом 50–200мс.
    10 20 34		// передаваемые данные

    Для того, чтобы воспользоваться функцией симуляции приема данных через UART в окне настроек симулятора, на вкладке UART1 IO необходимо разрешить возможность симуляции UART, выбрать созданный файл с входными данными и разрешить вывод данных в окно симулятора. Так же можно «закольцевать» принимаемые данные или оставить однократный прием последовательности, заданной в файле. Для этого ставим галочку на пункте Rewind Input если хотим, чтобы входные данные из файла были закольцованы, иначе, данные из файла будут переданы только 1 раз.

    При отладке программ бывает нужно выводить в окне симулятора некоторые данные из отлаживаемой программы. Для этого так же можно использовать UART.

    while(1) {
    	while(!DataRdyUART1()); 	/* Wait for data in the UARTRx. */
    	data = (char)ReadUART1(); 	/* Read data from Rx. */
    	putcUART1(data); 			/* Write data into Tx. */
    }

    Данный пример выводит в окно Output (SIM UART1) данные, получаемые со входа UART1 (из входного файла).

     

    Форматированный вывод Необходимое ПО и оборудование
    Для отладки программы и вывода информационных сообщений можно использовать стандартные функции форматированого вывода предоставляемые библиотеками Си Библиотечные функции ввода-вывода определяются стандартом ANSI и поэтому совместимы для любых компиляторов языка Си. MPLAB IDE
    MPLAB C32

    Библиотечные бункции компилятора MPLAB C32 направляют поток stdout в порт UART2, а среда разработки MPLAB IDE, как мы видели ранее, может выводить в окно Output только данные, направляемые в UART1. Для перенаправления потока в UART1 нужно определить функцию _mon_putc (char c). Без этого определения компилятор будет использовать функцию из библиотеки.

    #include <plib.h>
    #include <stdio.h>
    
    void _mon_putc (char c) {
    	while(BusyUART1()); /* Wait till the UART transmitter is free. */
    		putcUART1(c); /* Write data into Tx. */
    }
    
    int main(void) {
    	int	pbClk;
    	unsigned char data;
    
    	// Configure the device for maximum performance but do not change the PBDIV
    	// Given the options, this function will change the flash wait states, RAM
    	// wait state and enable prefetch cache but will not change the PBDIV.
    	// The PBDIV value is already set via the pragma FPBDIV option above..
    	pbClk=SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
    
    	// Open UART1 with Receive and Transmitter enable.
        OpenUART1(UART_EN, UART_RX_ENABLE | UART_TX_ENABLE, 
                                          pbClk/16/DESIRED_BAUDRATE-1);
    
    	printf("UART1 ready!\n");			// UART готов к работе
    	while(1) {
    		while(!DataRdyUART1()); /* Wait for data in the UARTRx. */
    		data = (char)ReadUART1(); /* Read data from Rx. */
            // Отображение принимаемых данных.//
    		printf("UART1 received = %x\n",data);	
       };
       return 0;
    }	
     

     

       
    Конфигурирование PIC32 на максимальное быстродействие Необходимое ПО и оборудование
    Контроллеры PIC32 могут работать с частотой ядра 80МГц, однако Flash память программ имеет максимальную частоту доступа 30МГц. Для возможности ускорения выполнения команд служит конфигурируемый кэш предвыборки команд. Для получения максимального быстродействия необходимо правильно настроить ядро контроллера PIC32. MPLAB IDE
    MPLAB C32

    для того чтобы производительность PIC32MX на 80МГц была максимальной, необходимо
    сделать следующие действия:
    Задать минимальное количество тактов задержки чтения из Flash (flash waitstates) для использованной тактовой частоты (для 80 МГц это будет два такта). Разрешить использование кэша, настроить кэш:

    mCheConfigure(	CHE_CONF_WS2 |
    				CHE_CONF_PF_ALL |
    				CHE_CONF_DC_NONE |
    				CHE_CONF_COH_INVUNL
    );

    Разрешить кэширование области памяти программ:

    CheKseg0CacheOn();
    

    Убрать дополнительные такты задержки доступа к SRAM:

    mBMXDisableDRMWaitState();
    

    То же самое, но в одну строку, можно сделать используя библиотечную функцию конфигурирования ядра, задав частоту тактирования ядра:

    SYSTEMConfigPerformance(80000000);
    

    Время выполнения программы в симуляторе для PIC32 будет не всегда совпадать с реальным, так как симулятор не может полностью учитывать функционирование кэша.

    Конфигурирование работы шины периферии на максимальную тактовую частоту

    Периферия, т ак же как и ядро контроллера PIC32, может работать с максимальной частотой 80МГц. Это дает большое приемущество контроллерам PIC32 по сравнению с конкурирующими контроллерами. Благодаря высокой частоте работы периферии можно, например, получить скорость работы UART до 20Мбод и переключать порты контроллера с частотой 40МГц.

    Для этого после конфигурирования ядра необходимо установить делитель частоты периферии в 1:1

    ...
    SYSTEMConfigPerformance(FCY);
    mOSCSetPBDIV(OSC_PB_DIV_1) ;
    ...
                  
     
       
    Продолжение... следует  

     

     

     

     

    ©2007 Гамма-Санкт-Петербург