Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.         Компилятор языка программирования Oberon-07/16 для
  2.             микроконтроллеров STM32 Cortex-M3.
  3.  
  4. ------------------------------------------------------------------------------
  5.         Параметры командной строки
  6.  
  7.   Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
  8. UTF-8 с BOM-сигнатурой.
  9.   Выход - hex-файл прошивки.
  10.   Параметры:
  11.   1) имя главного модуля
  12.   2) "stm32cm3"
  13.   3) необязательные параметры-ключи
  14.       -out <file_name> имя результирующего файла; по умолчанию,
  15.       совпадает с именем главного модуля, но с расширением ".hex"
  16.       -ram <size> размер ОЗУ в килобайтах (4 - 65536) по умолчанию 4
  17.       -rom <size> размер ПЗУ в килобайтах (16 - 65536) по умолчанию 16
  18.       -nochk <"ptibcwra"> отключить проверки при выполнении
  19.       -lower разрешить ключевые слова и встроенные идентификаторы в
  20.       нижнем регистре
  21.       -def <имя> задать символ условной компиляции
  22.  
  23.       параметр -nochk задается в виде строки из символов:
  24.       "p" - указатели
  25.       "t" - типы
  26.       "i" - индексы
  27.       "b" - неявное приведение INTEGER к BYTE
  28.       "c" - диапазон аргумента функции CHR
  29.       "w" - диапазон аргумента функции WCHR
  30.       "r" - эквивалентно "bcw"
  31.       "a" - все проверки
  32.  
  33.       Порядок символов может быть любым. Наличие в строке того или иного
  34.       символа отключает соответствующую проверку.
  35.  
  36.       Например: -nochk it - отключить проверку индексов и охрану типа.
  37.       -nochk a - отключить все отключаемые проверки.
  38.  
  39.   Например:
  40.  
  41.   Compiler.exe "C:\example.ob07" stm32cm3 -ram 32 -rom 256 -nochk pti
  42.   Compiler.exe "C:\example.ob07" stm32cm3 -out "C:\Ex1.hex" -ram 8 -rom 32
  43.  
  44.   В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
  45. При работе компилятора в KolibriOS, код завершения не передается.
  46.  
  47. ------------------------------------------------------------------------------
  48.         Отличия от оригинала
  49.  
  50.  1.     Расширен псевдомодуль SYSTEM
  51.  2.     В идентификаторах допускается символ "_"
  52.  3.     Усовершенствован оператор CASE (добавлены константные выражения в
  53.         метках вариантов и необязательная ветка ELSE)
  54.  4.     Расширен набор стандартных процедур
  55.  5.     Семантика охраны/проверки типа уточнена для нулевого указателя
  56.  6.     Добавлены однострочные комментарии (начинаются с пары символов "//")
  57.  7.     Разрешено наследование от типа-указателя
  58.  8.     "Строки" можно заключать также в одиночные кавычки: 'строка'
  59.  9.     Добавлен тип WCHAR
  60. 10.     Добавлена операция конкатенации строковых и символьных констант
  61. 11.     Добавлены кодовые процедуры
  62.  
  63. ------------------------------------------------------------------------------
  64.         Особенности реализации
  65.  
  66. 1.      Основные типы
  67.  
  68.           Тип              Диапазон значений               Размер, байт
  69.  
  70.         INTEGER       -2147483648 .. 2147483647                 4
  71.         REAL          1.17E-38 .. 3.40E+38                      4
  72.         CHAR          символ ASCII (0X .. 0FFX)                 1
  73.         BOOLEAN       FALSE, TRUE                               1
  74.         SET           множество из целых чисел {0 .. 31}        4
  75.         BYTE          0 .. 255                                  1
  76.         WCHAR         символ юникода (0X .. 0FFFFX)             2
  77.  
  78. 2.      Максимальная длина идентификаторов - 1024 символов
  79. 3.      Максимальная длина строковых констант - 1024 символов (UTF-8)
  80. 4.      Максимальная размерность открытых массивов - 5
  81. 5.      Процедура NEW заполняет нулями выделенный блок памяти
  82. 6.      Локальные переменные инициализируются нулями
  83. 7.      В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
  84.         модульность отсутствуют
  85. 8.      Тип BYTE в выражениях всегда приводится к INTEGER
  86. 9.      Контроль переполнения значений выражений не производится
  87.  
  88. ------------------------------------------------------------------------------
  89.         Псевдомодуль SYSTEM
  90.  
  91.   Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
  92. ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
  93. повреждению данных времени выполнения и аварийному завершению программы.
  94.  
  95.         PROCEDURE ADR(v: любой тип): INTEGER
  96.                 v - переменная или процедура;
  97.                 возвращает адрес v
  98.  
  99.         PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
  100.                 возвращает адрес x
  101.  
  102.         PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
  103.                 возвращает адрес x
  104.  
  105.         PROCEDURE SIZE(T): INTEGER
  106.                 возвращает размер типа T
  107.  
  108.         PROCEDURE TYPEID(T): INTEGER
  109.                 T - тип-запись или тип-указатель,
  110.                 возвращает номер типа в таблице типов-записей
  111.  
  112.         PROCEDURE INF(): REAL
  113.                 возвращает специальное вещественное значение "бесконечность"
  114.  
  115.         PROCEDURE MOVE(Source, Dest, n: INTEGER)
  116.                 Копирует n байт памяти из Source в Dest,
  117.                 области Source и Dest не могут перекрываться
  118.  
  119.         PROCEDURE GET(a: INTEGER;
  120.                 VAR v: любой основной тип, PROCEDURE, POINTER)
  121.                 v := Память[a]
  122.  
  123.         PROCEDURE GET8(a: INTEGER;
  124.                        VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
  125.                 Эквивалентно
  126.                 SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
  127.  
  128.         PROCEDURE GET16(a: INTEGER;
  129.                         VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
  130.                 Эквивалентно
  131.                 SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
  132.  
  133.         PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
  134.                 Эквивалентно
  135.                 SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
  136.  
  137.         PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
  138.                 Память[a] := x;
  139.                 Если x: BYTE или x: WCHAR, то значение x будет расширено
  140.                 до 32 бит, для записи байтов использовать SYSTEM.PUT8,
  141.                 для WCHAR -- SYSTEM.PUT16
  142.  
  143.         PROCEDURE PUT8(a: INTEGER;
  144.                        x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
  145.                 Память[a] := младшие 8 бит (x)
  146.  
  147.         PROCEDURE PUT16(a: INTEGER;
  148.                         x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
  149.                 Память[a] := младшие 16 бит (x)
  150.  
  151.         PROCEDURE PUT32(a: INTEGER;
  152.                         x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
  153.                 Память[a] := младшие 32 бит (x)
  154.  
  155.         PROCEDURE CODE(hword1, hword2,... : INTEGER)
  156.                 Вставка машинного кода,
  157.                 hword1, hword2 ... - константы в диапазоне 0..65535,
  158.                 например:
  159.                 SYSTEM.CODE(0BF30H) (* wfi *)
  160.  
  161.   Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
  162. допускаются никакие явные операции, за исключением присваивания.
  163.  
  164.   Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
  165.  
  166. ------------------------------------------------------------------------------
  167.         Оператор CASE
  168.  
  169.   Синтаксис оператора CASE:
  170.  
  171.         CaseStatement =
  172.                 CASE Expression OF Сase {"|" Сase}
  173.                         [ELSE StatementSequence] END.
  174.         Case = [CaseLabelList ":" StatementSequence].
  175.         CaseLabelList = CaseLabels {"," CaseLabels}.
  176.         CaseLabels = ConstExpression [".." ConstExpression].
  177.  
  178.   Например:
  179.  
  180.         CASE x OF
  181.         |-1:    DoSomething1
  182.         | 1:    DoSomething2
  183.         | 0:    DoSomething3
  184.         ELSE
  185.                 DoSomething4
  186.         END
  187.  
  188.   В метках вариантов можно использовать константные выражения, ветка ELSE
  189. необязательна. Если значение x не соответствует ни одному варианту и ELSE
  190. отсутствует, то программа прерывается с ошибкой времени выполнения.
  191.  
  192. ------------------------------------------------------------------------------
  193.         Тип WCHAR
  194.  
  195.   Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
  196. ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
  197. ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
  198. только тип CHAR. Для получения значения типа WCHAR, следует использовать
  199. процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
  200. исходный код в кодировке UTF-8 c BOM.
  201.  
  202. ------------------------------------------------------------------------------
  203.         Конкатенация строковых и символьных констант
  204.  
  205.   Допускается конкатенация ("+") константных строк и символов типа CHAR:
  206.  
  207.   str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
  208.  
  209.   newline = 0DX + 0AX;
  210.  
  211. ------------------------------------------------------------------------------
  212.         Проверка и охрана типа нулевого указателя
  213.  
  214.   Оригинальное сообщение о языке не определяет поведение программы при
  215. выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
  216. Oberon-реализациях выполнение такой операции приводит к ошибке времени
  217. выполнения. В данной реализации охрана типа нулевого указателя не приводит к
  218. ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
  219. значительно сократить частоту применения охраны типа.
  220.  
  221. ------------------------------------------------------------------------------
  222.         Дополнительные стандартные процедуры
  223.  
  224.  
  225.         COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
  226.                 v := x;
  227.                 Если LEN(v) < LEN(x), то строка x будет скопирована
  228.                 не полностью
  229.  
  230.         LSR (x, n: INTEGER): INTEGER
  231.                 Логический сдвиг x на n бит вправо.
  232.  
  233.         MIN (a, b: INTEGER): INTEGER
  234.                 Минимум из двух значений.
  235.  
  236.         MAX (a, b: INTEGER): INTEGER
  237.                 Максимум из двух значений.
  238.  
  239.         BITS (x: INTEGER): SET
  240.                 Интерпретирует x как значение типа SET.
  241.                 Выполняется на этапе компиляции.
  242.  
  243.         LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
  244.                 Длина 0X-завершенной строки s, без учета символа 0X.
  245.                 Если символ 0X отсутствует, функция возвращает длину
  246.                 массива s. s не может быть константой.
  247.  
  248.         WCHR (n: INTEGER): WCHAR
  249.                 Преобразование типа, аналогично CHR(n: INTEGER): CHAR
  250.  
  251. ------------------------------------------------------------------------------
  252.         Использование регистров общего назначения R0 - R12
  253.  
  254.         R0 - R3:  регистровый стэк (промежуточные значения выражений)
  255.         R4 - R12: не используются
  256.  
  257. ------------------------------------------------------------------------------
  258.         Вызов процедур и кадр стэка
  259.  
  260.   Правила вызова похожи на соглашение cdecl (x86):
  261.   - параметры передаются через стэк справа налево
  262.   - результат, если есть, передается через регистр R0
  263.   - вызывающая процедура очищает стэк
  264.  
  265.   Состояние стэка при выполнении процедуры:
  266.  
  267.   меньшие адреса <- |var3|var2|var1|LR|arg1|arg2|arg3| -> бОльшие адреса
  268.  
  269.   LR   - сохраненный регистр LR (адрес возврата)
  270.   argX - параметры в порядке объявления (слева направо)
  271.   varX - локальные переменные в порядке использования в процедуре
  272.  
  273.   Размер каждого элемента в стэке (кроме локальных переменных структурных
  274.   типов) - 1 машинное слово (4 байта). Структурные переменные (массивы и
  275.   записи) занимают место в стэке в соответствии с их размером (с учетом
  276.   выравнивания).
  277.  
  278.   Размещение локальных переменных зависит от их размеров и порядка
  279.   использования, и в общем случае неопределенно. Если переменная не
  280.   используется явно, то компилятор не выделяет для нее место в стэке.
  281.  
  282. ------------------------------------------------------------------------------
  283.         Скрытые параметры процедур
  284.  
  285.   Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
  286. формальных параметров, но учитываются компилятором при трансляции вызовов.
  287. Это возможно в следующих случаях:
  288.  
  289. 1.      Процедура имеет формальный параметр открытый массив:
  290.                 PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
  291.         Вызов транслируется так:
  292.                 Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
  293. 2.      Процедура имеет формальный параметр-переменную типа RECORD:
  294.                 PROCEDURE Proc (VAR x: Rec);
  295.         Вызов транслируется так:
  296.                 Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
  297.  
  298. ------------------------------------------------------------------------------
  299.         Кодовые процедуры
  300.  
  301.   Компилятор поддерживает процедуры, написаные в машинных кодах.
  302.   Синтаксис:
  303.  
  304.   PROCEDURE "[code]" имя [ (параметры): ТипРезультата ]
  305.       МашКом, МашКом,... МашКом;
  306.  
  307.   ";" после заголовка и END "имя" в конце процедуры не ставятся.
  308.   МашКом - целочисленная константа [0..65535] (в том числе и константное
  309.   выражение).
  310.  
  311.   Например:
  312.  
  313.   PROCEDURE [code] WFI
  314.       0BF30H; (* wfi *)
  315.  
  316.   Компилятор автоматически добавляет к такой процедуре команду возврата
  317. (bx LR). Способ передачи параметров и результата не изменяется. Регистр LR,
  318. при входе в процедуру не сохраняется.
  319.  
  320.   Чтобы использовать кодовые процедуры, необходимо импортировать псевдомодуль
  321. SYSTEM.
  322.  
  323. ------------------------------------------------------------------------------
  324.         Обработка прерываний
  325.  
  326.   При возникновении прерывания, будет вызван обработчик (если он объявлен).
  327. Объявление обработчика:
  328.  
  329.     PROCEDURE handler_name [iv]; (* процедура без параметров *)
  330.  
  331. iv - целочисленная константа (константное выражение), номер вектора прерывания
  332. в таблице векторов, iv >= 2:
  333.  
  334.      0       начальное значение SP
  335.      1       сброс
  336.     ...
  337.     15       SysTick
  338.     ...
  339.     59       TIM6
  340.     60       TIM7
  341.     ...
  342.  
  343. например:
  344.  
  345.     (* обработчик прерываний от TIM6 *)
  346.     PROCEDURE tim6 [59];
  347.     BEGIN
  348.         (* код обработки *)
  349.     END tim6;
  350.  
  351.   Также, можно объявить общий обработчик (iv = 0), который будет вызван, если
  352. не назначен индивидуальный. Общий обработчик получает параметр - номер вектора
  353. прерывания. По значению этого параметра, обработчик должен определить источник
  354. прерывания и выполнить соответствующие действия:
  355.  
  356.     PROCEDURE handler (iv: INTEGER) [0];
  357.     BEGIN
  358.         IF iv = 59 THEN
  359.             (* TIM6 *)
  360.         ELSIF iv = 60 THEN
  361.             (* TIM7 *)
  362.         ELSIF ....
  363.         ....
  364.         END
  365.     END handler;
  366.  
  367. В конец программы компилятор добавляет команду ожидания прерывания.
  368.  
  369. ------------------------------------------------------------------------------
  370.         Обработка ошибок
  371.  
  372.   В случае возникновения ошибки при выполнении программы, будет вызван
  373. пользовательский обработчик (если он объявлен).
  374.  
  375. Объявление обработчика ошибок:
  376.  
  377.     PROCEDURE trap (modNum, modName, err, line: INTEGER) [1];
  378.     BEGIN
  379.     END trap;
  380.  
  381.     где,
  382.         modNum  - номер модуля (в отчете о компиляции:
  383.                   compiling (modNum) "modName" )
  384.         modName - адрес имени модуля
  385.         err     - код ошибки
  386.         line    - номер строки
  387.  
  388. Коды ошибок:
  389.  
  390.  1       ASSERT(x), при x = FALSE
  391.  2       разыменование нулевого указателя
  392.  3       целочисленное деление на неположительное число
  393.  4       вызов процедуры через процедурную переменную с нулевым значением
  394.  5       ошибка охраны типа
  395.  6       нарушение границ массива
  396.  7       непредусмотренное значение выражения в операторе CASE
  397.  8       ошибка копирования массивов v := x, если LEN(v) < LEN(x)
  398.  9       CHR(x), если (x < 0) OR (x > 255)
  399. 10       WCHR(x), если (x < 0) OR (x > 65535)
  400. 11       неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
  401.  
  402. После возврата из обработчика программа будет перезапущена.
  403.  
  404. ------------------------------------------------------------------------------