Чтение онлайн

ЖАНРЫ

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

Пак Дэниэл Дж.

Шрифт:

В строке 1 записана директива Ассемблера, определяющая название программы. Директивы .area и .org генерируются при обработке строки 7 исходной программы на Си: #pragma abs_address:0x0B1E. Они устанавливают адрес ячейки памяти для записи адреса начала подпрограммы прерывания по переполнению таймера. Это адрес принято называть вектором прерывания. Для микроконтроллеров семейства 68HC12 ячейки памяти для хранения вектора прерывания от каждого источника запросов определены техническим описанием. В частности для МК модели 68HC12B32 в ячейке памяти с адресом 0x0B1E хранится вектор прерывания по переполнению таймера. Компилятор среды ICC12 добавляет символ подчеркивания перед именами идентификаторов исходного кода на Си (это имена переменных и функций). Это можно наблюдать в строках 4, 7 и 47.

Два двоеточия после имени переменной отражают тот факт, что эти переменные доступны из всех программ, т.е. из текущей функции и из всех внешних функций. Директива .word в строке 5 производит запись адреса начала подпрограммы прерывания с именем TOIISR в ячейку памяти разрядностью в 2 байта. Директивы в строках с 7 по 11 выделяют память для хранения переменной second и инициализируют ее нулевым значением.

Начиная с линии 12 можно видеть сгенерированные кросс компилятором команды ассемблера микроконтроллера 68HC12, соответствующие основной программе. Заметьте, что все записи исходного текста на Си из основной программы перенесены в текст ассемблерной программы (строки с 13 по 23), но перед ними установлен символ «точка с запятой». Это означает, что эти записи переведены в статус комментария, что удобно при чтении программы. Аббревиатуры команд ассемблера начинаются со строки 24. Причем в строке 23 написана инструкция Си, которая присваивает регистру управления таймером TSCR значение 0x80. Ниже в строках 24 и 25 записаны две команды ассемблера, которые реализуют данное действие. Причем, кросс-компилятор уже использовал заголовочный файл для определения абсолютного адреса регистра управления TSCR как 0x86. Строки с 26 по 36 завершают процесс инициализации микроконтроллера, но уже на языке ассемблерных команд. В строках 37…40 записаны команды бесконечного цикла. Строки с 41 по 46 завершают ассемблерный текст основной программы. Обратите внимание, макросы CLI и EXIT генерируют ассемблерные команды cli и swi соответственно. Основная программа оформлена в виде подпрограммы и завершается командой возврата из подпрограммы rts. В строке 47 начинается программа прерывания по переполнению таймера. Анализируя ее текст, можно проследить соответствие команд ассемблера каждому оператору исходного текста на Си. Подпрограмма прерывания завершается командой rti в строке 78.

Следующий шаг в процессе генерации исполняемого машинного кода — это генерация объектного кода (файл interrupt.o) из рассмотренного ассемблерного исходного кода. После обработки программой Ассемблер среды ICC12 рассмотренного текста будет получен следующий объектный код:

H4 areas 4 global symbols

M interrupt.c

А text size 3D flags 0

S _main Def0000

S _TOIISR Def001A

А memory size В20 flags С

S _Timer_Overflow_interrupt_vector Def0B1E

А data size 1 flags 0

S _second Def0000

А idata size 1 flags 0

T 0В 1Е 00 1А

R 00 00 00 01 00 02 00 00

T 00 00 00

R 00 00 00 03

T 00 00 С6 80 7В 00 86 С6 80 7В 00 80 С6 80 7В

R 00 00 00 00

T 00 00 00 8F С6 FF 7В 00 02 10 EF 20 FE 3F 30 С6

R 00 00 00 00

T 00 1В 80 7В 00 8F F6 00 00 87 С3 00 01 7В 00 00

R 00 00 00 00 00 07 00 02 00 0E 00 02

T 00 29 F6 00 00 C1 7А 26 ОС F6 00 00 87 41 51 7B

R 00 00 00 00 00 03 00 02

Т 00 37 00 00 79 00 00 0B

R 00 00 00 00 00 05 00 02

Заметим, что в верхней половине представленного объектного кода,

содержатся директивы для программы линковщика, а в нижней половине читатель может увидеть шестнадцатеричные коды инструкций ассемблера МК семейства 68HC12.

На заключительной стадии представленный выше объектный код обрабатывается программой линковщика. В результате формируются три файла: interrupt.lst, interrupt.map и interrupt.s19.

Файл листинга программы interrupt.lst представляет собой текстовый файл, который содержит команды ассемблера, машинные коды этих команд и абсолютные адреса в памяти микроконтроллера, в которых эти коды располагаются. Сгенерированный линковщиком файл листинга представлен ниже:

.module interrupt.c

.area memory(abs)

.org 0хb1е

0B1Е _ _Timer_Overflow_interrupt_vector: :

0B1Е 8044 .word _TOIISR

.area data

0800 _second::

0800 .blkb 1

.area idata

– -- 0000 00 .byte 0

.area data

.area text

802А _main: :

;#include <383HC12-ver1.h>

;void TOIISR(void) ;

;#pragma interrupt_handler TOIISR

;

;#pragma abs_address:0x0B1E

;void(*Timer_Overflow_interrupt_vector[]) ={TOIISR};

;#pragma end_abs_address

;

;unsigned char second=0x00;

;

;void main(void)

;{

;TSCR=0x80;

802А C680 ldab #128

802С 7В0086 stab 0х86

;TMSK2=0x80;

802F C680 ldab #128

8031 7B008D stab 0x8d

;TFLG2=0x80;

8034 C680 ldab #128

8036 7B008F stab 0x8f

;DDRA=0xFF;

8039 C6FF ldab #255

803В 7В0002 stab 0x2

;CLI;

803Е 10EF cli

8040 L3:

8040 L4:

8040 20FE bra L3

8042 X0:

;while (1) {};

;EXIT;

8042 3F swi

; }

8043 L2:

8043 .dbline 0; func end

8043 3D rts

8044 _TOIISR: :

;

; void TOIISR(void) {

;TFLG2=0x80;

8044 C680 ldab #128

8046 7B008F stab 0x8f

;second += 1;

8049 f60800 ldab _second

804C 87 clra

804D C30001 addd #1

8050 7B0800 stab _second

;if(second == 122)

8053 F60800 ldab _second

8056 C17A cmрb #122

8058 260C bnе L7

;{

;PORTA = ~PORTA;

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