Поиск по сайту:

 


По базе:  

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

реклама

 




Мероприятия:




Доступ к функциям, хранящимся в ПЗУ MAXQ

Использование таблиц внутри программы пользователя является обычной для программистов практикой при работе с микроконтроллерами. Из-за однотактовой природы ядра MAXQ программа не имеет прямого доступа к кодовому пространству и, следовательно, не может непосредственно считывать таблицы, размещенные внутри пользовательского кода. Чтобы устранить это затруднение, все ПЗУ в MAXQ содержат программы доступа к данным и таблицам, располженным в программной области. В дополнение к этим базовым функциям, ПЗУ каждой модификации MAXQ может содержать специфичные для данного микроконтроллера программы. Поскольку эти программы могут быть размещены в ПЗУ произвольно и их местонахождение может изменяться для каждой новой версии ПЗУ, был разработан стандартный механизм доступа к программам. Это позволяет использовать код, написанный для одной из версий ПЗУ, во всех последующих версиях без переписывания или перекомпилирования.

Во всех вариантах процессора MAXQ ПЗУ включает в себя таблицу адресов для всех поддерживаемых функций. Местоположение таблицы в разных вариантах может быть различным, поэтому ссылка на нее всегда размещается по адресу 800Dh. Затем адреса используемых функций можно найти в таблице с помощью индексирования. Таблица всегда поддерживает один и тот же порядок расположения функций для всех версий определенного ПЗУ. В табл. 1 перечислены функции MAXQ2000 и адреса их вызова из таблицы.

Табл. 1 Таблица пользовательских функций ПЗУ MAXQ2000

FUNCTION NUMBER FUNCTION NAME ENTRY POINT
(USERTABLE = ROM[800Dh])
0 Reserved ROM[userTable + 0]
1 Reserved ROM[userTable + 1]
2 Reserved ROM[userTable + 2]
3 moveDP0 ROM[userTable + 3]
4 moveDP0inc ROM[userTable + 4]
5 moveDP0dec ROM[userTable + 5]
6 moveDP1 ROM[userTable + 6]
7 moveDP1inc ROM[userTable + 7]
8 moveDP1dec ROM[userTable + 8]
9 moveFP ROM[userTable + 9]
10 moveFPinc ROM[userTable + 10]
11 moveFPdec ROM[userTable + 11]
12 copyBuffer ROM[userTable + 12]

Выполнение функции ПЗУ производится за четыре шага. В первом - прочитайте указатель таблицы функций, записанный по адресу 800Dh. Во втором – прибавьте к прочитанному указателю номер нужной функции. В третьем – прочитайте указатель нужной функции, записанный по адресу, вычисленному на втором шаге. Наконец – выполните функцию путем обращения к подпрограмме по адресу, прочитанному на третьем шаге. Приведенный ниже текст на языке ассемблера демонстрирует эти четыре шага, используя функцию микроконтроллера moveDPlinc в качестве примера.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Function:             ReadDataAtDP1
;; Description:          This function uses the utility ROM function “moveDP1inc”
;;                       to read from program memory the data stored at the
;;                       address in DP[1]. If DP[1] is in word mode two
;;                       bytes will be read. If DP[1] is in byte mode only
;;                       one byte is read. DP[1] is then post incremented.
;; Returns:              The result is returned in GR.
;; Destroys:             ACC and DP[0]
;; Notes:                This function assumes that DP[0] is set to word
;;                       mode and the device has 16-bit accumulators.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ReadDataAtDP1:
   move    DP[0], #0800Dh    ; This is where the address of the table is stored.
   move    ACC, @DP[0]       ; Get the location of the function table.
   add     #7                ; Add the index to the moveDP1inc function.
   move    DP[0], ACC        ; Point to where the address of moveDP1 is stored.
   move    ACC, @DP[0]       ; Retrieve the address of the function.
   call    ACC               ; Execute the function.
   ret

Поскольку будущие версии ПЗУ в определенном варианте MAXQ могут хранить служебные функции по разным адресам, использование служебной функции, сходной с функцией ReadDataAtDP1 гарантирует их совместимость в дальнейшем. «Ценой» этой совместимости является больший размер кода и большее время выполнения. В некоторых случаях это может быть неприемлемым, тогда лучше применить прямой вызов функций ПЗУ. Для прямого вызова служебной функции следует просто определить адрес требуемой функции и использовать его в качестве назначения в команде вызова (call).

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

Text:
DB “Hello World!”,0 ; Define a string in code space.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Function:         PrintText
;; Description:      Prints the string stored at the “Text” label.
;; Returns:          N/A
;; Destroys:         ACC, DP[1], DP[0], and GR.
;; Notes:            This function assumes that DP[0] is set to word mode,
;;                   DP[1] is in byte mode, and the device has 16-bit
;;                   accumulators.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PrintText:
   move   DP[1], #Text        ; Point to the string to display.
   move   ACC, DP[1]          ; “Text” is a word address and we need a
   sla                        ; byte address, so shift left 1 bit.
   or     #08000h             ; Code space is mapped to 8000h when running
   move   DP[1], ACC          ; from the ROM, so the address must be masked.
PrintText_Loop:
   call   ReadDataAtDP1       ; Fetch the byte from code space.
   move   ACC, GR
   jump   Z, PrintText_Done   ; Reached the null terminator.
   call   PrintChar           ; Call a routine to output the char in ACC
   jump   PrintText_Loop      ; Process the next byte.
PrintText_Done:
   ret

Заключение

Служебные функции облегчают разработчику чтение данных, хранящихся в программной памяти. Стандартный механизм доступа к программам ПЗУ также позволяет разработчикам писать коды, которые будут работать со всеми вариантами конкретного процессора MAXQ. Библиотеки подпрограмм пользователя могут быть написаны так, что их можно будет повторно использовать с последующими версиями ПЗУ, не опасаясь несовместимости.






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