Я использовал C и C++ со времени их появления, и мне хочется думать, что я пишу хорошие коды. Хотя, должен признаться, в созданных приложениях я допустил множество ошибок, устранение которых иногда требовало длительных и утомительных отладочных сессий. Почти каждый новый микроконтроллер поддерживается бесплатным инструментарием, включающим в себя компилятор C/C++.
К сожалению, C чрезвычайно недружественен, и C++ лишь немногим лучше. Тем не менее, до настоящего времени они остаются основным инструментом программистов встроенных систем. Это одна из причин, по которой я с нетерпением ждал появления анонсированного компанией AdaCore пакета Ada 2012 для платформы Cortex-M. Теперь его можно бесплатно скачать, воспользовавшись ссылкой [1].
Cortex-M является основным из простейших 32-разрядных микроконтроллеров, используемым почти всеми производителями микроконтроллеров, принявшими архитектуру ARM. Некоторые компании, такие как Green Hills Software, Atego и AdaCore и раньше поддерживали платформу Cortex, но опирались при этом на ранние стандарты Ada. В Ada 2012 добавлен целый рад новых возможностей, включая контрактное программирование [2].
Засучив рукава
Мне уже доводилось поработать в среде GNAT Programming Studio (GPS), выпущенной компанией AdaCore. Я создавал приложения для Linux на разработанной Texas Instruments инструментальной платформе BeagleBone с процессором Cortex-A8. Новый инструментарий предназначен для «голого железа», что необходимо для многих приложений.
![]() |
|
Рисунок 1. | Последняя версия набора инструментов Ada 2012 компании AdaCore работает на платформе платы STMicroelectronics STM32F4 Discovery с процессорным ядром Cortex-M4. |
Начало работы было простым, поскольку GPS была уже установлена. На установку отладочного интерфейса ST-Link на плату STM32 (Рисунок 1) времени потребовалось больше. Затем предлагалось запустить демонстрационное приложение, попеременно включающее ряд светодиодов. Отрывок кода, управляющего миганием светодиодов (Листинг 1), я включил в статью, чтобы подчеркнуть некоторые преимущества использования Ada 2012.
Листинг 1.
with LEDs; use LEDs;
with Button; use Button;
with Ada.Real_Time; use Ada.Real_Time;
package body Driver is
type Index is mod 4;
Pattern : constant array (Index) of User_LED := (Orange, Red, Blue, Green);
task body Controller is
Period : constant Time_Span := Milliseconds (75); -- arbitrary
Next_Start : Time := Clock;
Next_LED : Index := 0;
begin
loop
Off (Pattern (Next_LED));
Next_LED := Next_LED +
(if Button.Current_Direction = Counterclockwise then -1 else 1);
On (Pattern (Next_LED));
Next_Start := Next_Start + Period;
delay until Next_Start;
end loop;
end Controller;
end Driver;
________________________________________
with LEDs; use LEDs;
with Button; use Button;
with Ada.Real_Time; use Ada.Real_Time;
package body Driver is
type Index is mod 4;
Pattern : constant array (Index) of User_LED := (Orange, Red, Blue, Green);
task body Controller is
Period : constant Time_Span := Milliseconds (75); -- arbitrary
Next_Start : Time := Clock;
Next_LED : Index := 0;
begin
loop
Off (Pattern (Next_LED));
Next_LED := Next_LED +
(if Button.Current_Direction = Counterclockwise then -1 else 1);
On (Pattern (Next_LED));
Next_Start := Next_Start + Period;
delay until Next_Start;
end loop;
end Controller;
end Driver;
Даже если вам не приходилось пользоваться Ada, вы должны получить представление о заложенных в него идеях. Например, спецификация тела задачи выдвигает на первый план встроенную поддержку многозадачности. Отметим также использование в индексах данных беззнакового типа, ограничивающих адресацию матричных структур. В отличие от C, здесь нет необходимости проверять Next_LED после его инкрементирования. Кроме того, я предпочитаю более многословные условные выражения в конструкциях if/then/else языка Ada, используемой в C/C++ комбинации ?:. Я программировал на APL, и его однострочные конструкции были лаконичными, но, как правило, непонятными. О C и C++ можно сказать то же самое.
Перед C и C++ Ada имеет множество преимуществ. Не лишена Ada и недостатков, среди которых можно выделить ее недоступность для некоторых типов микроконтроллеров. Однако для ARM Cortex такой проблемы больше не существует. Разработчики смогут воспользоваться всем многообразием функций Ada 2012, от дженериков до многозадачности.
Я призываю всех желающих написать пуленепробиваемый код для встраиваемых приложений, чтобы на практике убедиться в возможностях комбинации AdaCore и STM32. Это совсем недорого и очень функционально. Поддержка ST-Link также позволяет ему работать с такими платформами как STM32F401 Nucleo. В этом я тоже убедился на своей Nucleo.
Heartbleed [3] является лишь одним из многих указаний на то, какой ущерб может нанести единственная ошибка проверки принадлежности к диапазону. C не производит таких проверок в принципе, а вот Ada делает это не только при доступе к массиву, но и по умолчанию. Ada не устранит ошибки из вашего кода, но сделать их будет намного сложнее.
Ссылки