Задачи в SPARK требуют последовательной проработки
В настоящее время я изучаю Аду во время университетского курса по языкам программирования в реальном времени и у меня есть вопрос о SPARK.
Я работаю над проектом с задачей, которая контролирует автономный источник питания. Эта задача имеет решающее значение для безопасности машины и поэтому должна быть максимально безошибочной, скажем, проверенной с помощью SPARK.
Я получаю эту странную ошибку, которую мне не удалось найти 11:14 tasking in SPARK requires sequential elaboration (SPARK RM 9(2)) violation of pragma SPARK_Mode
Оригинальный код немного длинный, но я смог получить ту же ошибку с минимальным примером.
Спецификация:
pragma Profile (Ravenscar);
pragma SPARK_Mode;
with System;
package simple_monitoring is
function sign (val : in Float) return Float
with Pre => val >= 10.0;
task type myTask is
end myTask;
end simple_monitoring;
Реализация:
pragma Profile (Ravenscar);
pragma SPARK_Mode;
with Ada.Real_Time; use Ada.Real_Time;
with Ada.Text_IO; use Ada.Text_IO;
package body simple_monitoring is
function sign (val : in Float) return Float is
res : Float;
begin
pragma Assert (val >= 10.0);
res := 100.0 / val;
return res;
end sign;
task body myTask is
TASK_PERIOD : constant Time_Span := Milliseconds (100);
next_time : Time := Clock;
myVar : Float;
begin
loop
Put_Line ("Running task");
myVar := sign (20.0);
next_time := next_time + TASK_PERIOD;
delay until next_time;
end loop;
end myTask;
end simple_monitoring;
Любая помощь приветствуется:-)
1 ответ
Вам нужна дополнительная прагма конфигурации
pragma Partition_Elaboration_Policy (Sequential);
(см. ARM H.6). Для примера, который вы приводите, это нужно только указать в спецификации; но в целом это должна быть прагма конфигурации всей программы.
Вы организуете это, имея файл, скажем gnat.adc
содержащий, например,
pragma Profile (Ravenscar);
pragma Partition_Elaboration_Policy (Sequential);
и ссылка на него в пакете Builder
в вашем файле проекта GNAT:
package Builder is
for Global_Configuration_Pragmas use "gnat.adc";
...