В VxWorks каждая задача, которая использует плавающую точку, должна быть указана как таковая при создании задачи, чтобы регистры FP сохранялись во время переключения контекста, но только при переключении из задач, которые используют плавающую точку.Это позволяет задачам без плавающей запятой иметь более быстрое время переключения контекста.
Однако, когда прерывание опережает задачу с плавающей запятой, наиболее вероятно, что регистры FP не сохранены.Для этого обработчик прерываний должен будет определить, какая задача была прервана и была ли она задана как задача с плавающей запятой;это сделало бы задержку прерывания как высокой, так и переменной, что, как правило, нежелательно в системе реального времени.
Таким образом, чтобы заставить ее работать, любая подпрограмма прерывания, использующая плавающую точку, должна явно сохранять и восстанавливать регистры FP самостоятельно.Любая задача, использующая число с плавающей запятой, должна быть указана как таковая в любом случае, хотя с этим можно справиться, если у вас есть только одна такая задача.
Если задача с плавающей запятой имеет приоритет, ваше прерывание будетмодифицировать значения регистров с плавающей запятой, используемые этой задачей, результат этого при возобновлении задачи FP является недетерминированным, но включает в себя создание исключения с плавающей запятой - если ранее ненулевой регистр, например, становится нулевым, и впоследствии используется какправая часть операции деления.
Однако мне кажется, что в этом случае операция с плавающей запятой, вероятно, совершенно не нужна.Ваш «обходной путь» на самом деле является обычным, самым безопасным и наиболее детерминированным методом и, вероятно, должен рассматриваться как исправление вашего проекта, а не обходной путь .