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

на главную - закладки

Жанры

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

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

Шрифт:

Обратимся теперь к разъяснению содержимого заголовочного файла. Мы не будем приводить его текст целиком, а приведем лишь те строки, которые необходимы для рассматриваемой в основном примере программы:

1 #define _IO_BASE 0

2 #define _P(off) *(unsigned char volatile*) (_IO_BASE + off)

3 #define TSCR _Р(0х86)

4 #define TMSK2 _Р(0х8D)

5 #define TFLG2 _P(0x8F)

6 #define DDRA _Р(0х02)

7 #define PORTA _Р(0х00)

8 #define CLI asm("cli\n")

9 #define EXIT asm("swi\n")

Две первые

строки приведенного фрагмента заголовочного файла используются для определения макроса _P с аргументом off. Обратите внимание на символ указателя в макросе. Все следующие выражения в строках с 3 по 7 определяют численные значения для символьных обозначений регистров специальных функций МК. Эти численные значения — адреса регистров в соответствии с картой памяти МК. Любое упоминание имен регистров в тексте программы связано с выполнением операций чтения или записи в эти регистры по их физическим адресам. Этим объясняется необходимость применения указателя в определении макроса _P(off). Две последние строки 8 и 9 являются примерами определения макросов.

Вернемся к примеру управления светодиодами. После обработки программой компилятора исходного текста программы Sample.c будет получен следующий текст программы на языке ассемблера.

1 .module interrupt.c

2 .area memory(abs)

3 .org 0xb1e

4 _Timer_Overflow_interrupt_vector::

5 .word _TOIISR

6 .area data

7 _second::

8 .blkb 1

9 .area idata

10 .byte 0

11 .area data

12 .area text _main::

14 ; void TOIISR(void);

15 ; #pragma interrupt_handler TOIISR ;

16 ; #pragma abs_address:0x0B1E

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

18 ; #pragma end_abs_address ;

19 ; unsigned char second=0x00;

20 ;

21 ;void main(void)

22 ;{

23 ; TSCR=0x80;

24 ldab #128

25 stab 0х86

26 ; ТМSК2=0х80;

27 ldab #128

28 stab 0x8d

29 ; TFLG2=0x80;

30 ldab #128

31 stab 0x8f

32 ; DDRA=0xFF;

33 ldab #255

34 stab 0х2

35 ; CLI;

36 сli

37 L3: L4:

38 bra L3

39 X0:

40 ; while(1) {};

41 ; EXIT;

42 swi

43 ; }L2

44 .dbline 0

45 ; func end

46 rts

47 _TOIISR: :

48 void TOIISR(void)

49 ; {

50 ; TFLG2=0x80;

51 ldab #128

52 stab 0x8f

53 ; second + = 1;

54 ldab _second

55 clra

56 addd #1

57 stab _second

58 ; if(second = = 122)

59 ldab _second

60 cmpb #122

61 bne L7

62 ; {

63 ; PORTA = ~ PORTA;

64 ; vol

65 ldab 0

66 clra

67 coma

68 comb

69 stab 0

70 ; second = 0x00;

71 clr _second

72 ; }

73 L7:

74 ; }

75 L6:

76 .dbline 0

77 ; func end

78 rti

Итак,

мы видим текст после обработки кросс-компилятором, который содержит инструкции команд на языке ассемблера микроконтроллера 68HC12 и директивы языка Ассемблер в составе интегрированной среды разработки ICC12. Директивы программы Ассемблер — это специальные команды, которые осуществляют управления процессом генерации кодов команд для МК при обработке приведенного выше текста программой Ассемблер. В среде ICC12 директивы выделяются точкой перед их именем. Например: .area data или .byte 0. Разберем текст представленного файла.

В строке 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.

Поделиться:
Популярные книги

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Граф Суворов 7

Шаман Иван
7. Граф Суворов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Граф Суворов 7

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Новобрачная

Гарвуд Джулия
1. Невеста
Любовные романы:
исторические любовные романы
9.09
рейтинг книги
Новобрачная

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Невеста вне отбора

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
7.33
рейтинг книги
Невеста вне отбора

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Невеста снежного демона

Ардова Алиса
Зимний бал в академии
Фантастика:
фэнтези
6.80
рейтинг книги
Невеста снежного демона