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

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

Шрифт:

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.

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

XН

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

  • Читать дальше
  • 1
  • ...
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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