Использование JTAG UART в программах на языке ассемблер и С

Листинг 5 и листинг 6 содержат простые примеры программ на языке ассемблер и C, которые используют JTAG UART. Обе версии программы выполняют одни и те же функции, т.е. они отправляют текстовую строку в JTAG UART и затем выполняют бесконечный цикл. В этом цикле выполняется чтение символьных данных, полученных из JTAG UART, и запись их обратно в JTAG UART для передачи в инструментальный компьютер. Если программа выполняется с использованием AMP, то любые символы, которые будут печататься с помощью клавиатуры в её терминальном окне, будут возвращены назад, что приведет к появлению их в терминальном окне. Файлы с исходными кодами программ, показанных в листингах 5 и 6, доступны как часть AMP. Эти файлы могут быть найдены в разделе «Sample programs» под именем JTAG UART.

Листинг 5. Пример программы на языке ассемблер, в котором используется JTAG UART

/*****************************************************************************

* Программа выполняет следующее:

* 1. отправляет символьную строку из текстовой строки в JTAG UART

* 2. считывает данные из JTAG UART

* 3. отправляет считанные данные обратно в JTAG UART

*****************************************************************************/

.text

.global _start

_start:

movia sp, 0x07FFFFFC /* определяем адрес вершины стека */

 

movia r6, 0x10001000

 

movia r8, TEXT_STRING /* адрес текстовой строки в r8 */

LOOP:

ldb r5, 0(r8) /* считываем символ из текстовой строки в r5*/

call PUT_JTAG /* вызываем процедуру, которая отправляет символ в JTAG */

 

addi r8, r8, 1

 

br LOOP /* переходим на вывод очередного символа */

 

GET_JTAG:

ldwio r4, 0(r6) /*читаем регистр управления JTAG UART*/

andi r8, r4, 0x8000 /*проверяем, есть ли новые данные*/

beq r8, r0, GET_JTAG /*если данных нет, то ожидаем их появления*/

andi r5, r4, 0x00ff /*получаем данные*/

 

call PUT_JTAG /*отправляем символ обратно в JTAG UART*/

call GET_JTAG

 

.end

 

/*****************************************************************************

* Подпрограмма, которая выводит символы в JTAG UART

* r5 = выводимый символ

* r6 = JTAG UART базовый адрес

*****************************************************************************/

.global PUT_JTAG

PUT_JTAG:

/* сохраняем используемые регистры */

subi sp, sp, 4 /* резервирум место в стеке*/

stw r4, 0(sp) /* сохраняем r4 в стеке */

 

ldwio r4, 4(r6) /* читаем регистр управления JTAG UART */

andhi r4, r4, 0xffff /* проверяем есть ли место для записи в буфере UART */

beq r4, r0, KONEC /* если места нет, то переполнение буфера */

stwio r5, 0(r6) /* отправляем символ в UART */

 

OVERFLOW:

/* восстанавливаем содержимое r4 */

ldw r4, 0(sp)

addi sp, sp, 4

 

ret

 

/*****************************************************************************/

.data

 

TEXT_STRING:

.asciz "\nJTAG UART example code\n"

 

.end

 


Листинг 6. Пример программы на языке С, в котором используется JTAG UART

void put_jtag(volatile int *, char);

 

/********************************************************************************

Программа выполняет следующее:

* 1. отправляет символьную строку из текстовой строки в JTAG UART

* 2. считывает данные из JTAG UART

* 3. отправляет считанные данные обратно в JTAG UART ********************************************************************************/

int main(void)

{

volatile int * JTAG_UART_ptr = (int *) 0x10001000; // базовый адрес JTAG UART

 

int data, i;

char text_string[] = "\nJTAG UART example code\n> \0"; //текстовая строка

 

for (i = 0; text_string[i] != 0; ++i) //цикл отправки символов строки в JTAG UART порт

put_jtag (JTAG_UART_ptr, text_string[i]);

 

while(1)

{

data = *(JTAG_UART_ptr); //читаем символ из порта JTAG UART

if (data & 0x00008000) //проверяем, имеются ли в буфере новые данные

{

data = data & 0x000000FF;

/* echo the character */

put_jtag (JTAG_UART_ptr, (char) data & 0xFF ); // отправляем символ обратно в JTAG UART порт

}

}

}

 

/*****************************************************************************

* Подпрограмма, которая выводит символы в JTAG UART

*****************************************************************************/

void put_jtag( volatile int * JTAG_UART_ptr, char c )

{

int control;

control = *(JTAG_UART_ptr + 1); // считываем содержимое управляющего регистра JTAG UART

if (control & 0xFFFF0000) //проверяем, имеется ли свободное место в буфере

*(JTAG_UART_ptr) = c; //записываем символ в порт JTAG UART

}

 









Дата добавления: 2015-05-30; просмотров: 680;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.011 сек.