В HTML      В PDF
микроэлектроника, микросхема, микроконтроллер, память, msp430, MSP430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, SED1335, mega128, avr, mega128  
  Главная страница > Статьи > Средства разработки

реклама

 
радиационно стойкие ПЗУ Миландр

Продажа силового и бронированного кабеля и провода в Москве

текст еще



Первая программа

Ассемблерная программа определяет не только машинные команды, которые нужно выполнять процессору, но и команды, которые нужно выполнять самому ассемблеру (например, выделить немного памяти или выдать листинг). Управляют процессом ассемблирования директивы ассемблера. Директивы начинаются с точки. Ниже приведён ассемблерный текст.

	
     1  .syntax unified
     2  .cpu cortex-m3
     3  .thumb
     4  .equ  STACKINIT, 0x20002000
     5  .text
     6  .global _start                @
     7        .word STACKINIT         @ stack pointer
     8        .word _start + 1        @ reset
     9        .word _nmi_handler + 1  @ vectors
     10       .word _hard_fault  + 1   
     11       .word _memory_fault + 1   
     12       .word _bus_fault + 1      
     13       .word _usage_fault + 1    
     14   _start:		                  @ start of execution examples
     15	     mov r0, #5                   @  5 -> r0
     16	     adr r1, value                @  address const value -> r1
     17	     ldr r2, [r1]                 @  mem_32[r1] -> r2
     18	     add r1, r2, r0	 @  r2 + r0 , -> r1
     19	     push {r1}                    @  r1 -> stack
     20	     mov  r1, #0                  @  0  -> r1 
     21      pop  {r1}                    @  stack -> r1
     22      blx _start                   @  this bad command

     23  .ascii "example"                 @ data in section code
     24  .align  0x0                      @ 
     25     _dummy:                       @ loop for handlers
     26     _nmi_handler:
     27     _hard_fault:
     28     _memory_fault:
     29     _bus_fault:
     30     _usage_fault:
     31          add r0, 1
     32          add r1, 1
     33	b _dummy
     34 .align  0x0
     35 value:  .word 0x11223344
     36 .end
	 

По ходу изложения, список директив ассемблера будет расширяться, будут вводиться новые понятия.

В первой строке директива, задающая поддержку синтаксиса стандарта UAL (Unified Assembler Language), по-русски - это унифицированный язык ассемблера. Разработка компании ARM. Вторая директива задаёт целевой процессор. Третья - указывает на необходимость генерировать команды множества Thumb-2. Этот набор команд является расширением набора Thumb, впервые введённого в архитектуре стандарта V4T. Набор команд Thumb-2 введён начиная с архитектуры V6 и выше. Альтернативная директива .code 16 , заставит генерировать 2-х байтные команды множества Thumb. В 4-ой строке директива .equ присваивает значение строке символов. Ассемблер подставит числовое значение там, где будет задан символ. Символу _start , присвоено свойство - глобальный, он будет доступен из других модулей, в процессе ассемблирования ему будет присвоено значение, а точнее адрес. Директива .text указывает на начало секции кода. В программе задана только одна секция кода.

В 7-ой строке, директива .word выделяет 4 байта и в выделенном пространстве размещает значение, присвоенное символу STACKINIT. Для Сortex-M3 в начале секции кода, должно быть значение указателя стека. Не трудно заметить, что указывается в область RAM.

Всё что после директивы .text будет направлено в секцию кода, по сути, будет размещаться в ROM, до тех пор, пока в тексте программы не встретится директива .data или .bss , тогда ассемблер направит свой вывод в соответственные директивам секции.

Далее следует таблица первых 6-ти системных исключений. В строке 8 задан адрес вектора сброса, в этом месте памяти расположится значение метки _start . Процессор перейдёт по этой метке по сбросу. Младший бит каждого вектора указывает, в каком состоянии должен выполняться соответствующий обработчик. Будет процессор выполнять команды обработчика в состоянии ARM или THUMB. Поскольку процессор Cortex-M3 поддерживает только команды Thumb, младшие биты всех векторов исключений должны быть установлены в 1. Каждый вектор в программе увеличен на 1.

Целая серия векторов перехода для различных исключений указывают на один адрес, на метку _dummy . Там имеется простейшая ловушка, бесконечный цикл.

В строке 23 задана строковая константа. В секции кода не возбраняется размещать константы. Затем идёт директива .align , эта директива указывает ассемблеру на необходимость расположить следующие за константой команды на границе слова.

После сброса, CPU тактируется от HSI (internal high-speed oscilator). Код инициализации отсутствует. Источник синхронизации не настроен на максимальную частоту и доступ к Flash памяти не сконфигурирован оптимально. Но для учебных целей, существующая конфигурация вполне пригодна.

В строках с 15 по 22 задан некоторый набор команд процессора. В строке 22 стоит команда, которая для архитектуры Cortex-M3 не является корректной и вызывает генерацию исключения Usage Fault.

Ассемблируем командой:

	
arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m3 -g -o ex1.o ex1.s

Программа arm-none-eabi-gcc - это программа драйвер или менеджер. Она управляет процессом компилирования и сборкой программ, вызывает необходимые программы, с нужными параметрами. Этот менеджер может применяться для компилирования программ на языке C , ассемблер и для компоновки.

Параметры командной строки:

c - задаёт необходимость получения только объектных файлов, не выполняется линковка,

mthumb , mcpu - задаёт формат кода для целевой системы,

g - указывает на необходимость генерации отладочной информации,

o - задаёт имя выходного файла. К слову сказать, параметры, задающие формат выходного кода, ARM или THUMB, не обязательны, так как этот формат задан в ассемблерном тексте.

После успешного ассемблирования, будет получен объектный файл ex1.o. Посмотреть имеющиеся символьные имена, или просто символы, в сгенерированном объектном файле можно командой:

	
arm-none-eabi-nm ./ex1.o
    00000040 t _bus_fault
    00000040 t _dummy
    00000040 t _hard_fault
    00000040 t _memory_fault
    00000040 t _nmi_handler
    20002000 a STACKINIT
    0000001c T _start
    00000040 t _usage_fault
    0000004c t value
	

В первом столбце идёт значение символа, затем тип символа и название.

t - локальный символ в секции .text,

T - глобальный символ в секции .text,

a - символ, имеющий абсолютное значение, при линковке его значение не меняется. Для символов типов t и T , значение - это адрес от начала секции. Эти адреса виртуальные, после линковки они могут претерпеть изменения, конечно кроме символа с абсолютным значением.

Посмотреть информацию о секциях в объектном файле, можно командой:

	
arm-none-eabi-size -A ./ex1.o
         ./ex1.o  :
         section           size   addr
        .text               80      0
        .data                0      0
        .bss                 0      0
        .ARM.attributes     33      0
        .debug_line         65      0
        .debug_info         66      0
        .debug_abbrev       20      0
        .debug_aranges      32      0
         Total              296
		 

Секции .data и .bss пустые. Так же имеются секции для целей отладки, это результат действия флага -g при ассемблировании. Секция .ARM.attributes и секции отладки, выполняют служебные функции и в памяти целевой системы не будут размещены.

<-- Предыдущая страница Оглавление Следующая страница -->





 
Впервые? | Реклама на сайте | О проекте | Карта портала
тел. редакции: +7 (495) 514 4110. e-mail:info@eust.ru
©1998-2016 ООО Рынок Микроэлектроники