Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Название:Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Автор:
- Жанр:
- Издательство:Издательский дом «ДМК-пресс»
- Год:2007
- Город:Москва
- ISBN:5-9706-0034-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С краткое содержание
В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах.
Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров.
Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 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 рассмотренного текста будет получен следующий объектный код:
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
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;
; vol
805A F60000 ldab 0
805D 87 clra
805E 41 comа
805F 51 comb
8060 7B0000 stab 0
;second = 0x00;
8063 790800 clr _second
;}
8066 L7:
;}
8066 L6:
8066 .dbline 0; func end
8066 0B rti
Файл листинга обычно используется в процессе отладки прикладной программы при выявлении несоответствий между задуманными программистом действиями и реальным ходом исполнения программного кода. Кроме того, в процессе отладки иногда полезно знать, какие коды должны быть расположены в ячейках с фиксированными адресами. Последнюю информацию наиболее удобно получить из файла карты памяти *.map (иногда этот файл называют файлом символьных меток). Пример файла карты памяти для программы sample.c приведен ниже.
Area
(Attributes) Addr Size Decimal Bytes
------------ ---- ---- ------- --------
text 8000 006В = 107. bytes (rel,con)
Addr Global Symbol
---- --------------
8000 __start
8028 _exit
802А _main
8044 _TOIISR
8067 __HC12Setup
806B __text_end
Area
(Attributes) Addr Size Decimal Bytes
Интервал:
Закладка: