TESSA 0.1

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:09, 28 февраля 2016.

Введение

Ядро "Тесей" предназначено для создания и массового производства широкого семейства 8-разрядных микроконтроллеров.

К характерным особенностям языка ТЕСЕЙ относятся:

  • гарвардская RISC - архитектура, позволяющая выполнять за 2 такта частоты процессора любую из 52 команд;
  • единая система команд для всего семейства с возможностью адресации до двух операндов, находящихся в памяти;
  • четырехступенчатый конвейер выполнения команд;
  • широкий диапазон конфигураций внутренних команд памяти, памяти данных и периферийных устройств.

Микроконтроллеры ТЕСЕЙ предназначены для использования в системах управления, работающих в режиме реального времени. Они отличаются высокой производительностью, наличием энергонезависимой памяти данных, возможностью многократного перепрограммирования памяти команд или же реализации памяти команд в масочном ПЗУ, малым количеством внешних выводов и низким током потребления.


Начало работы

Язык Ассемблер и компиллятор TESSA 0.1 предназначены для разработки и отладки прикладных программ микроконтроллеров, построенных на основе ядра Тесей.

Отладка программ осуществляется либо на персональном компьютере в режиме эмуляции, либо на специальном аппаратном отладочном модуле.

Для выполнения программирования и отладки персональный компьютер должен удовлетворять следующим требованиям:

  • IBM-совместимый компьютер (требования к ОС - не выше Microsoft Windows XP);
  • пакет программ TESSA 0.1
  • программатор (при использовании отладочного модуля программатор не требуется).

Скачать программы для программатора микроконтроллера, компилятор АССЕМБЛЕРа для программирования микроконтроллеров ТЕСЕЙ, пакет программ отладочной среды для отладки на IBM совместимых PC прикладных программ микроконтроллеров ТЕСЕЙ, а также примеры программ можно на сайте:

http://www.radioman-portal.ru/sprav/microcontrollers/kr1878ve1/

В первую очередь необходимо скачать:

  • Компилятор АССЕМБЛЕРа для программирования микроконтроллеров ТЕСЕЙ - файл TESSA.exe;
  • Демо версия отладочной среды (для Windows).

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

  • MC_WIN.EXE, представляющая собой управляющую программу;
  • файлы типа *.INI (TRC_SET.INI, SET_UP. INI, WIN_PAR.INI, EEPROM.INI)
  • файл CS8X11.FNT (шрифты).

Далее осуществляется непосредственно запуск программы:

Path DIR. > MC_WIN.EXE <Enter>

При установке на ОС Windows XP необходимо скачать архив "Демо версия отладочной среды (для Windows)". После скачивания файла archievedebugmct.exe необходимо распаковать имеющиеся в архиве файлы (DebugMCT.exe, PRODUCT.INF, setup.exe) в отдельную директорию и осуществить запуск программы (файл DebugMCT.exe). Откроется окно следующего вида (рис. 1).

Рис. 1. Окно эмулятора.

Чтобы начать непосредственно выполнение программы, написанной на ассемблере, необходимо скомпилировать файл с текстом программы. Для этого требуется компилятор ассемблера микроконтроллеров ТЕСЕЙ - Tessa.exe, версия 1.0

Файлы исходного текста должны иметь расширение *.mic.

Запуск компиллятора осуществляется следующим образом: В коммандной строке вводится команда tessa.exe [-key] [имя_файла1][+имя_файла2][+...]

где имя_файла1 - имя головного файла
'имя_файла2 - имя файла, содержащего дополнительный программный модуль
key - ключ, определяющий режим компилляции

Компиллятор генерирует файлы следующего типа:

  • *.sav - файл исполняемого кода;
  • *.lst - файл листинга;
  • *.sym - служебный файл для обеспечения режима символьной отладки;
  • *.sdf - - служебный файл для обеспечения режима символьной отладки.

Ключи компилляции:

  • -l - разрешает генерацию файла листинга;
  • -d - разрешает генерацию служебных файлов для обеспечения режима символьной отладки.
  • -i:path - определяет путь до директории, содержащей библиотеку include файлов.

По завершении чтения текущих установок и опознания подключенного оборудования программа начинает работу в активном режиме.

После завершения компилляции программы необходимо загрузить скомпилированный файл в окно программы-эмулятора. Для этого необходимо выбрать пункты меню "Файл-Открыть" (рис. 2).

Рис. 2. Открытие нового файла.

В открывшемся окне выбрать скомпилированный ранее файл с расширением *.lst (в нашем случае, файл TEST.lst) - файл листинга (рис. 3).

Рис. 3. Выбор файла листинга.

Далее открывается файл с текстом программы и эмулятором (рис. 4).

Рис. 4. Окно эмулятора.

Рассмотрим, что представляет из себя окно эмулятора.

Подокно "Рабочая программа"

Рис. 5. Рабочая программа.

Содержит непосредственно текст программы, написанной на ассемблере. Текущая (выполняемая) команда подсвечена красным цветом.

Подокно "ОЗУ данных, область ввода/вывода"

Рис. 6. ОЗУ данных, область ввода/вывода.

Данное подокно разбито на несколько сегментов. Сначала следует отметить подокно "Системные регистры", служащее для просмотра содержимого базы сегментных регистров A, B, C и D, а также 2 окна IR0 и IR1, позволяющие просматривать содержимое регистров косвенной адресации. Далее следуют окна указателя стека инструкций (Stack Pointers) и окно, отображающее текущее содержимое регистра состояния (A13, A12, OF, DC, IE, N, Z, C). Наконец, внизу рассматриваемого подокна отображается непосредственно содержимое ОЗУ. Адреса 00h - 3Fh занимает область ввода/вывода, начиная с адреса 40h - 3FFFh расположена ОЗУ данных.

Запуск программы

F5 - выполнение программы целиком; F10 - пошаговое выполнение программы.

Пример записи программы

Независимо от модели микроконтроллера, первые 16 адресов памяти команд процессора выделены для размещения векторов прерываний. Вектор прерывания содержит команду перехода на подпрограмму обработки прерывания. Начиная писать программу, следует учитывать данный факт. Поэтому первые 16 команд имеют вид:

  • nop - не требуется обработки прерываний;
  • jmp <метка> - переход по метке для обработки прерывания.
        JMP	START	        ;<0> 
	JMP	ERR		;<1>
	JMP	ERR		;<2> 
	JMP	ERR		;<3> 
	JMP	ERR		;<4>
	JMP	ERR		;<5>
	JMP	ERR		;<6>
	JMP	ERR		;<7>
	JMP	ERR		;<8>
	JMP	ERR		;<9>
	JMP	ERR		;<10>
	JMP	ERR		;<11>
	JMP	ERR		;<12>
	JMP	ERR		;<13>
	JMP	ERR		;<14>
	JMP	ERR		;<15>
EXIT:	JMP	EXIT

ERR:	JMP	ERR

Метка содержит не более 32 алфавитно-цифровых символов, начинается с алфавитного символа и заканчивается знаком :. При первоначальном запуске создадим файл test.mic с текстом программы, написанной на языке Ассемблер.

Работа с программой начинается с инициализации служебных регистров.

Для обращения к служебным регистрам используется конструкция #n, где # - префикс обращения к служебному регистру, n - номер служебного регистра (в диапазоне от 0 до 7). Номер служебного регистра определяет соответствующий регистр из множества {SR0...SR7}. Для служебных регистров SR0, SR1, SR2, SR3 допускается задание номера символами a, b, c, d соответственно.

  • SR0...SR3 являются регистрами баз сегментов,
  • SR4...SR5 - регистры адреса косвенного регистра IR0;
  • SR6...SR7 - регистры адреса косвенного регистра IR1.

Разряды 6 и 7 в SR5 определяют режим работы косвенного регистра IR0:

  • 00 - отключение косвенного режима; обращение к регистру %d6 аналогично обращению к любому другому режиму памяти данных;
  • 01 - косвенный автоинкрементный режим;
  • 10 - косвенный автодекрементный режим;
  • 11 - косвенное обращение без изменения значения адреса.

Разряды 6 и 7 в SR7 определяют режим работы косвенного регистра IR0:

  • 00 - отключение косвенного режима; обращение к регистру %d6 аналогично обращению к любому другому режиму памяти данных;
  • 01 - косвенный автоинкрементный режим;
  • 10 - косвенный автодекрементный режим;
  • 11 - косвенное обращение без изменения значения адреса.

Признаком непосредственного обращения к регистрам памяти служит знак %, то есть для обращения к регистру памяти необходимо применить команду: %Xn, где Xn - номер служебного регистра.

Пример инициализации регистров представлен далее.

START:

        cst     8	;IE=0 ;Команды загрузки служебных регистров
        ldr	#0, 40h	; загрузка регистра SR0
        ldr	#1, 48h	; загрузка регистра SR1
        ldr	#2, 50h	; загрузка регистра SR2
        ldr	#3, 58h	; загрузка регистра SR3
        ldr	#4, 48h	; загрузка регистра SR4
        ldr	#5, 40h	; загрузка регистра SR5
        ldr	#6, 00h	; загрузка регистра SR6
        ldr	#7, 00h	; загрузка регистра SR7
 
        movl    d0,0h
        movl   d1,0h
        movl   d2,0h
        movl   d3,0h
        movl   d4,0h
        movl   d5,0h
        movl   a0,0h
        movl   a1,0h
        movl   a2,0h
        movl   a3,0h
        movl   a4,0h
        movl   a5,0h
        movl   a6,0h
        movl   a7,0h
        movl   b0,0h
        movl   b1,0h
        movl   b2,0h
        movl   b3,0h
        movl   b4,0h
        movl   b5,0h
        movl   b6,0h
        movl   b7,0h
        movl   c0,0h
        movl   c1,0h
        movl   c2,0h
        movl   c3,0h
        movl   c4,0h
        movl   c5,0h
        movl   c6,0h
        movl   c7,0h

При запуске программы в режиме программного эмулятора контролируются так называемые исключительные ситуации в работе процессора. Если это случилось, то выполнение программы приостанавливается и на экране появляется сообщение, содержащее адрес команды, в которой произошло исключение, и одно из следующих сообщений, поясняющее ситуацию:

  • недопустимый код команды;
  • обращение по несуществующему адресу ОЗУ;
  • обращение к IR1 в режиме адресации к памяти команд в качестве приемника;
  • обращение к IR1 в режиме адресации к памяти команд при переходе через границу памяти команд;
  • недопустимое значение адреса системного регистра при выполнении команд LDR, MTPR, POP;
  • недопустимое сочетание операндов, например, MTPR #0, A1;
  • недопустимое использование IR1, например, MTPR #0, D7, когда IR1 в режиме адресации к памяти команд;
  • недопустимые операции со стеком, например, если при прерывании по адресу вектора прерывания стоит команда работы со стеком PUSH, POP;
  • переполнение стеков.

Для продолжения работы необходимо нажать любую клавишу для удаления сообщения с экрана и продолжить отладку программы.

Далее приведен пример отрывка программы, позволяющей определить знак произведения двух чисел. Непосредственно сами числа хранятся в 3 регистрах, порядки чисел -еще в одном регистре, знаковыми являются старшие биты в записях сила и порядка как для первого, так и для второго операндов.

        operand1_0 = 10010000b                 ;численное значение первого операнда
        operand1_1 = 00000000b
        operand1_2 = 00000000b
        operand2_0 = 10000010b                 ;численное значение первого операнда
        operand2_1 = 00000000b
        operand2_2 = 00000000b



        operand1_poradok  = 00000010b              ;порядок первого числа
        operand2_poradok = 00000100b               ;порядок второго числа
       
        movl	%a0, operand1_0		; загрузка первого операнда	
	movl	%a1, operand1_1
	movl	%a2, operand1_2
	movl	%a3, operand1_poradok		; загрузка порядка первого операнда
		
	movl	%b0, operand2_0		; загрузка второго операнда	
	movl	%b1, operand2_1		
	movl	%b2, operand2_2
	movl	%b3, operand2_poradok		; загрузка порядка второго операнда
		
	
	
	xor 	%c0, %c0
	xor 	%c1, %c1
	xor 	%c2, %c2
	movl	%c6, 0;
	
       ;Вычисляем знак произведения
	mov	%a6, 	%a3            ;временное сохранение произведения
	mov	%b6,    %b3	       ;вычисление знакового бита
	bicl 	%a6,  1111b            ;очистка бит в младшей тетраде, задаваемых литерой
	bich 	%a6,  0111b            ;очистка бит в старшей тетраде, задаваемых литерой
	bich 	%b6,  0111b
	bicl 	%b6,  1111b
	rlc %a6                       ;циклический сдвиг влево
        rlc %a6;
        rlc %b6;
        rlc %b6;
	bich 	%a3,  1000b
	bich 	%b3,  1000b
        cmp %a6, %b6
        jz odinakovje_znaki
        mov 	%c3, %a3
        add 	%c3, %b3
        cmpl 	%a6, 0h
        jnz znMINUS0
        movl	%c5, 0h
        jmp continue

        znMINUS0:
        movl	%c5, 1h
        jmp continue


        odinakovje_znaki:                    ;выполнение, если знаки одинаковые
        cmp %a3, %b3
        js m1
        mov 	%c3, %a3
        sub 	%c3, %b3
        cmpl 	%a6, 0h
        jnz znMINUS1
        movl	%c5, 0h           ответ пишем знак "+", то есть старший бит равен 0
        jmp continue

        znMINUS1:
        movl	%c5, 1h           ответ пишем знак "-", то есть старший бит равен 1
        jmp continue


        m1:
        mov 	%c3, %b3
        sub 	%c3, %a3
        cmpl 	%a6, 0h
        jnz znPLUS1
        movl	%c5, 1h           ответ пишем знак "-", то есть старший бит равен 1
        jmp continue

        znPLUS1:
        movl	%c5, 0h           ответ пишем знак "+", то есть старший бит равен 0
        jmp continue

        ;здесь следует продолжение программы
        continue: