Задачи в 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";
   ...
Другие вопросы по тегам