Глагол для АРМ

Описание среды разработки приложений настоящего (реального) времени

для АРМ-процессоров на языке Глагол.

Ноябрь 2006г.

Оглавление

Введение

 

Успех работы приложения настоящего времени зависит не только от быстродействия оборудования, но и, в большей степени, от чётко выстроенного кода. Для достижения последнего разработчику необходимо досконально разбираться в получаемом коде. Конечно, он не будет изучать каждую команду, выдаваемую преобразователем, но он должен хорошо представлять суть его работы. Правила преобразования должны быть довольно прозрачными. Этого можно достичь разумно простым языком с ясно определёнными выражениями, которые легко преобразуются в достаточно производительный для данного процессора код. Исходя из этого, была предпринята попытка определить подмножество языка Глагол для АРМ-процессора. На полном Глаголе был написан Малый Преобразователь Глагола (МПГ), который производит АРМ-код, работающий под управлением PocketPC.

1 Малый Преобразователь Глагола

Все исходные тексты МПГ поставляются в составе разработок на Глаголе. Для получения готового к работе файла \Глагол\Службы\МПГ.EXE необходимо запустить командный файл \Глагол\Приложения\МПГ\Построить.bat.

При разработке МПГ верхний уровень преобразования был частично заимствован из полного Преобразователя Глагола (ПГ), а задачи, вырабатывающие код для целевого процессора, были переписаны заново. Для упрощения переноса преобразователя на другие ОС и другие процессоры было решено, чтобы МПГ производил не двоичный код, а текст на языке ассемблера целевого процессора. Предполагается, что далее этот текст будет переводиться в исполняемые приложения при помощи сторонних средств.

2 Изменения в языке

2.1 Ограничения

Поскольку среда выполнения приложений настоящего времени не должна сильно нагружать процессор, то её было решено значительно упростить. В среде не осталось ни уборки памяти, ни проверок времени выполнения, ни охраны вида, ни ловушек исключений. Эти упрощения не должны сильно повлиять на надёжность работы приложения, т.к. предполагается, что приложения предварительно отлаживаются в среде полного Глагола, а уже потом переносятся в среду настоящего времени. Учитывая возможности новой среды выполнения, из языка были изъяты указания ДЛЯ ВИДА, ВЫБРАТЬ ИЗ, ЯВЛЯЕТСЯ и встроенные задачи СТОП, ПРОВЕРИТЬ.

Необходимо заметить, что при внесении всех изменений в язык учитывались следующие обстоятельства (по порядку их предпочтения):

1. простота и надёжность алгоритмов преобразования;

2. скорость выполнения целевого кода;

3. совместимость с полным Глаголом.

Т.к. не во всех процессорах встроена вещественная арифметика, то виды ВЕЩ и ШИРВЕЩ были исключены. В будущем намечено осуществить программную замену этих видов средствами целой арифметики. Также был изъят редко используемый вид ШИРЦЕЛ. Указание ВЫБРАТЬ ИЗ было убрано из-за громоздкости его представления в преобразователе и отсутствии в среде ловушек исключений. К тому же это указание всегда можно заменить равнозначными указаниями (А)ЕСЛИ ТО.

Для дальнейшего упрощения преобразователя на язык были наложены следующие ограничения:

– в текущей задаче можно обращаться только к тем переменным, которые объявлены в ней самой или в области отдела, но не в окружающих задачах;

– нет открытых рядов, кроме приёмников переменных вида ЦЕПЬ;

– встроенные задачи, которые работали и с ЦЕПЬ, и с РЯД ИЗ ЗНАК, теперь работают только с ЦЕПЬ.

Также необходимо учитывать, что при входе в задачу среда выполнения приложений не записывает начальное значение ПУСТО в переменные бегунков и доступов этой задачи.

2.2 Дополнительные возможности

Если при объявлении задачи после её заголовка следует служебное слово КОД, то весь текст от этого слова до служебного слова КОН попадёт напрямую в выходной ассемблерный текст.

Пример:

ЗАДАЧА Задача; (* прямой КОД *)
КОД
  STMDB   SP!,{FP,LR}
  MOV     FP,SP
  SUB     SP,SP,#4
  MOV     R11,#1  
  STR     R11,[FP,#-4]
  MOV     SP,FP
  LDMIA   SP!,{FP,PC}
КОН Задача;

3 Дальнейшие намерения по изменению МПГ

3.1 Регистровые приёмники

Сейчас приёмники задачи передаются через стек, далее будет проведена оценка целесообразности передачи приёмников через регистры. Эта возможность даёт в некоторых случаях выигрыш в производительности кода и позволяет осуществить изменения, перечисленные в следующих подразделах.

3.2 Оконечные задачи

Знак * после слова ЗАДАЧА сообщает преобразователю, что это оконечная задача. Оконечная задача – это задача, из которой не производятся вызовы задач. В таких задачах можно оставлять приёмники в изначальных регистрах, а не переписывать их на стек при входе в задачу. Однако регистры, постоянно занятые под приёмники, уменьшат число свободных регистров, доступных для вычисления выражений. Но обычно вычисления выражений занимают немного регистров, и это ограничение будет редко проявляться.

3.3 Регистровые переменные

Знак * после объявления переменных служит указанием преобразователю, что эти переменные необходимо разместить в регистрах, а не в памяти. Возможность задания таких переменных присутствует только в оконечных задачах. Пример:

ЗАДАЧА* Задача(а,б:ЦЕЛ); (* а - R0, б - R1 *)
ПЕР в,г:ЦЕЛ*;            (* в - R2, г - R3 *)     
УКАЗ
КОН Задача;

3.4 Бегунки

Переменные вида БЕГУНОК могут быть определены только в оконечных задачах. Каждая такая переменная занимает один регистр. Рассмотрим на двух примерах преимущества бегунков по сравнению с обычным обращением к переменным ряда.

1. Вычисление скалярного произведения векторов.

В обычной задаче приходится полностью вычислять адрес переменных ряда 2 раза при обсчёте каждой координаты:

ЗАДАЧА* ВекторНаВектор(р1-,р2-:Вектор):ЦЕЛ;
ПЕР
  с,н:ЦЕЛ;
УКАЗ
  с:=0;
  ОТ н:=0 ДО РАЗМЕР(р1)-1 ВЫП
    с:=с+р1[н]*р2[н]
  КОН;
  ВОЗВРАТ с
КОН ВекторНаВектор;

Та же задача с использованием бегунков полностью вычисляет адрес переменных ряда только 3 раза в самом начале расчёта:

ЗАДАЧА* ВекторНаВектор(р1-,р2-:Вектор):ЦЕЛ;
ПЕР
  с:ЦЕЛ;
  б1,б2,г1:БЕГУНОК ПО ЦЕЛ;
УКАЗ
  с:=0;
  ПОСТАВИТЬ(б1,р1,0);
  ПОСТАВИТЬ(б2,р2,0);
  ПОСТАВИТЬ(г1,р1,РАЗМЕР(р1));
  ПОКА б1 < г1 ВЫП
    с:=с+б1^*б2^
  КОН;
  ВОЗВРАТ с
КОН ВекторНаВектор;

2. Вычисление произведения 3х3 матриц.

Обычная задача вычисляет полностью адрес переменных ряда 8 раз для каждого элемента выходной матрицы:

ЗАДАЧА* МатрицаНаМатрицу(м1-,м2-,м3+:Матрица);
ПЕР
  i,j:ЦЕЛ;
УКАЗ
  ОТ i:=0 ДО 2 ВЫП
    ОТ j:=0 ДО 2 ВЫП
      м3[i,j]:=м1[i,0]*м2[0,j]+м1[i,1]*м2[1,j]+м1[i,2]*м2[2,j]
    КОН
  КОН
КОН МатрицаНаМатрицу;

Та же задача с использованием бегунков использует только 2 полных вычисления адреса переменных ряда на каждый элемент:

ЗАДАЧА* МатрицаНаМатрицу(м1-,м2-,м3+:Матрица);
ПЕР
  i,j:ЦЕЛ;
  б1,б3:БЕГУНОК ПО ЦЕЛ;    
  б2:БЕГУНОК 3 ПО ЦЕЛ;
УКАЗ
  ПОСТАВИТЬ(б3,м3,0);
  ОТ i:=0 ДО 2 ВЫП
    ОТ j:=0 ДО 2 ВЫП
      ПОСТАВИТЬ(б1,м1[i],0);
      ПОСТАВИТЬ(б2,м2,j);
      б3^:=б1^*б2^+б1^*б2^+б1^*б2^;
    КОН
  КОН
КОН МатрицаНаМатрицу;

4 Перевод выходных текстов МПГ в готовые приложения

Для перевода выходных ассемблерных текстов МПГ в готовые EXE-приложения применяются две служебные программы стороннего разработчика – ассемблер ARMASM (файл armasm.exe) и редактор связей LINK (файлы link.exe и mspdb60.dll). Эти файлы поставляются с eMbedded Visual Tools 3.0, eMbedded Visual C++ 4.0, eMbedded Visual C++ 4.0 SP4 и Visual Studio 2005. Первые три набора инструментов можно бесплатно переписать у их разработчика.

Обычно для преобразования и сборки приложений Глагола применяется командный файл \Глагол\Службы\ПостроитьМ. bat, который последовательно запускает МПГ, ARMASM и LINK. Далее описываются используемые возможности ARMASM и LINK.

4.1 АRMASM

ARMASM – это двухпроходный макроассемблер, который переводит текст с языка ассемблера АРМ-процессора в двоичные файлы формата COFF.

В командной строке указываются следующие настройки:

файл имя входного файла .код, полученного из МПГ;
-o файл имя выходного файла .маш формата COFF;
-arch 4 процессорная архитектура 4-го издания;
-32 перевод в 32-х разрядные команды (иначе могут получиться 16  разрядные Thumb команды);
> файл имя .ош файла для возможных сообщений об ошибках перевода.

В командном файле \Глагол\Службы\ПК. bat содержатся все вышеперечисленные настройки.

Служебные указания ассемблера, которые вырабатывает МПГ:

IMPORT метка использование внешней метки;
EXPORT метка объявление общедоступности данной метки;
название RN регистр переименование регистра;
AREA |.bss|,NOINIT начало области переменных отдела;
AREA |.text|,CODE начало области кода задач.

4.2 LINK

Редактор связей LINK позволяет из файлов формата COFF собрать EXE-приложение. Наиболее приемлемым для сборки Глагол-приложений является редактор связей из eMbedded Visual C++ 4.0 SP4.

В командной строке указываются следующие настройки:

/entry:"Nachalo" метка, с которой приложение начинает работу;
/subsystem:windowsce вид ОС;
/machine:arm для какого процессора использованы машинные коды;
"coredll.lib" точки входа в ядро.

В файле \Глагол\Службы\MSLinkARM.sbo содержатся все вышеперечисленные настройки.

5 Примеры приложений

Приложения полного Глагола, которые не используют вещественную арифметику, также работают и на PocketPC. Командные файлы ПостроитьМ. bat из соответствующих папок служат для построения EXE-примеров при помощи МПГ, а файлы Построить. bat служат, как и раньше, для построения примеров с использованием ПГ.

Необходимо учитывать, что приложения на Глаголе работают в консольном режиме, а в PocketPC изначально не встроен такой режим. Поэтому для правильной работы приложений Глагола на PocketPC требуется предварительная установка какой-либо консольной оболочки стороннего производителя. На данный момент используется бесплатно распространяемая оболочка PocketConsole 1.3.

6 Ссылки

Немного об ARM история создания АРМ-процессоров, справочник по командам и их кодам, передача параметров в PocketPC (WindowsCE).
PocketConsole 1.3 консольная оболочка для PocketPC.
eMbedded Visual C++ 4.0 SP4 в папке \EVC\WCE500\BIN\ содержатся armasm.exe, link.exe и mspdb60.dll.

    Сделано в России