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

реклама

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

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

текст еще



Программное прерывание (SWI)

Эта команда будет выполнена, если условие истинно. Все различные условия ее выполнения перечислены в таблице 6. Машинный код команды приведен на рис.33.

Команда программного прерывания
Рис. 33. Команда программного прерывания

Команда программного прерывания используется для входа в защищенный режим (Supervisor), выполнение которой вызывает прерывание работы программы и передачу управления в соответствующий обработчик, при этом происходит смена режима работы ядра ARM7TDMI. В регистр PC записывается определенное значение, соответствующее вектору обработчика (0x08), а содержимое CPSR сохраняется в специальном регистре SPSR_svc. Защита обработчика программного прерывания от возможности изменений из основной программы или приложения (и контроллером внешней памяти) позволяет построить на основе команды SWI полностью защищенную операционную систему.

Возврат из прерывания

Так как перед передачей управления обработчику программного прерывания содержимое регистра PC предварительное сохранено в R14_svc, то для возможности правильного возврата из прерывания фактически в R14_svc заносится адрес команды, сразу следующий за командой SWI. При выполнении команды MOVS PC,R14_svc восстанавливается содержимое CPSR и возвращается управление в основную прерванную программу. Необходимо отметить, что этот способ входа и выхода из такого прерывания не позволяет реализовывать вложенные прерывания, поэтому внутри этого обработчика необходимо вручную сохранять адрес возврата (PC) и флаги процессора (SPSR), а перед выходом из него вручную восстанавливать указанные регистры.

Поле комментариев

Младшие 24-х бита кода при выполнении команды SWI всегда игнорируются, поэтому это поле комментариев может быть использовано, например, для передачи внутрь обработчика программного прерывания дополнительной информации. Например, в этом поле можно передавать индекс внутри массива указателей на подпрограммы, выполняющие определенные функции для защищенного режима.

Число машинных тактов

Команда SWI выполняется за 2S + 1N, где S и N зависят от типа машинных тактов.

Синтаксис в ассемблере

SWI{cond} <выражение>

где:

{cond}: двухсимвольная мнемоника условия выполнения команды (см. табл. 6);
{выражение}: результат вычисления этого выражения размещается в поле комментариев в коде самой команды.

Примеры

SWI   ReadC         ; Get next character from read stream.
SWI   WriteI+"k"    ; Output a "k" to the write stream.
SWINE 0             ; Conditionally call supervisor
                    ; with 0 in comment field.

Код обработчика (Supervisor)

Предыдущие примеры подразумевают существование обработчика, например, подобного этому:

0x08    B           Supervisor     ; Точка входа в программное прерывание
EntryTable                         ; Адреса функций, используемых в обработчике
            DCD     ZeroRtn
            DCD     ReadCRtn
            DCD     WriteIRtn
. . .
Zero        EQU     0
ReadC       EQU     256
WriteI      EQU     512

      ; Этот обработчик использует биты [23:8] в качестве 
      ; адреса функции и биты [7:0] в качестве передаваемых данных (если они есть). 
      ; R13_svc - указатель на вершину стека.
Supervisor
      STMFD         R13,{R0-R2,R14}     ; Сохранить используемые регистры и адрес возврата
      LDR           R0,[R14,#-4]        ; Получить адрес команды SWI
      BIC           R0,R0,#0xFF000000   ; Замаскировать старшие 8 бит. 
      MOV           R1,R0,LSR#8         ; Вычислить содержимое поля комментариев команды.
      ADR           R2,EntryTable       ; Получить адрес таблицы EntryTable
      LDR           R15,[R2,R1,LSL#2]   ; Вызвать соответствующую подпрограмму из таблицы
WriteIRtn                               ; Младший байт содержит обрабатываемый символ
. . . . . .
      LDMFD         R13,{R0-R2,R15}^    ; Восстановить регистры 
                                        ; и возвратиться в основную программу
                                        ; восстановив режим работы ядра


<---- Вернуться к Системе команд --->






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