Использование 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; просмотров: 729;