Это старая версия документа!
В предыдущей заметке было описано, как создать новый проект в среде разработки Рекордино, компилировать модуль-заготовку и затем — сформировать файл прошивки и записать его в память микроконтроллера.
Теперь разберём детально сам код этого небольшого модуля, чтобы лучше понять идеологию модульного подхода и особенности языка программирования Оберон.
После запуска проекта открывается следующий код:
IMPORT SYSTEM,
ARMv7M := MicroARMv7M,
SysTick0 := MobxARMv7MSTM32SysTick0,
MCU := MicroSTM32F4,
Pins := MicroSTM32F4Pins,
Sys := MicroSTM32F4System;
VAR
msec: INTEGER;
PROCEDURE Setup;
BEGIN
msec := 0;
SysTick0.Init(Sys.HCLK, 1000);
Pins.Configure(Pins.C, 13,
Pins.output, Pins.pushPull, Pins.medium, Pins.noPull, Pins.AF0);
END Setup;
PROCEDURE Loop;
BEGIN
REPEAT
IF SysTick0.OnTimer() THEN
IF msec = 999 THEN msec := 0 ELSE INC(msec) END;
IF msec = 0 THEN
SYSTEM.PUT(MCU.GPIOCBSRR, {13})
ELSIF msec = 500 THEN
SYSTEM.PUT(MCU.GPIOCBSRR, {13 + 16})
END;
END;
ARMv7M.WFI
UNTIL FALSE
END Loop;
BEGIN
Setup;
Loop
Программа прошивки состоит из модулей, как из кирпичиков Лего.
Модуль всегда начинается с слова MODULE, после которого следует его название. И заканчивается словом END, после которого повторяется название, и завершается точкой.
MODULE Main;
END Main.
В общем случае название модуля может быть любым, название главного модуля редактируется в настройках проекта. Именно для главного модуля будет создаваться прошивка при нажатии на кнопку сборки на панели меню.
Секция импорта начинается ключевым словом IMPORT, после которого через запятую идут названия других модулей — строительных блоков программы. При этом с помощью оператора присваивания := для модулей допускается указывать короткие обозначения.
MODULE Main;
IMPORT SYSTEM,
ARMv7M := MicroARMv7M, (* общее для всех контроллеров архитектуры ARMv7 *)
SysTick0 := MobxARMv7MSTM32SysTick0, (* пример таймера на прерываниях *)
MCU := MicroSTM32F4, (* ардеса регистров для микроконтроллеров STM32F4* *)
Pins := MicroSTM32F4Pins, (* модуль для настройки портов ввода/вывода *)
Sys := MicroSTM32F4System; (* модуль для базовой настройки STM32F4* *)
После секции импорта возможно указывать константы и описывать новые типы данных. Однако в этой простой программе это не используются, поэтому за секцией импорта следует секция глобальных переменных VAR. После идентификатора (имени) переменной через двоеточие указывается тип данных, который будет хранить переменная.
VAR
msec: INTEGER;
В Обероне существует шесть базовых типов для переменных:
BOOLEAN логические значения TRUE и FALSE
CHAR литеры стандартного набора литер
INTEGER целые числа
REAL действительные числа
BYTE целые числа от 0 до 255
SET набор целых чисел между 0 и пределом, зависящим от реализации
После описания переменных идёт описание процедур и программный код модуля. В этом примере две процедуры:
Setup — отвечает за настройку микроконтроллера,
Loop — содержит главную петлю программы, которая повторяется во время работы микроконтроллера после настройки.
MODULE Main;
...
PROCEDURE Setup;
BEGIN
...
END Setup;
PROCEDURE Loop;
BEGIN
...
END Loop;
BEGIN
Setup;
Loop
END Main.
Процедура настройки Setup имеет три выражения:
PROCEDURE Setup;
BEGIN
msec := 0;
SysTick0.Init(Sys.HCLK, 1000);
Pins.Configure(Pins.C,13,Pins.output,Pins.pushPull,Pins.medium,Pins.noPull,Pins.AF0);
END Setup;