Описание
Задайте НЕФТЯНЫЕ файлы, которые Polyspace® анализирует, чтобы настроить многозадачную настройку вашего проекта OSEK.
Установите опцию
Пользовательский интерфейс: В панели Configuration опция доступна на узле Multitasking. Смотрите Зависимости для других опций, которые необходимо также включить.
Командная строка: Используйте опцию -osek-multitasking
. Смотрите информацию о Командной строке.
Почему использование эта опция
Если ваш проект включает НЕФТЯНЫЕ файлы, Polyspace может проанализировать эти файлы, чтобы настроить задачи, прерывания, циклические задачи и критические разделы. Вы не должны настраивать их вручную.
Настройки
- На
Polyspace ищет и анализирует НЕФТЯНЫЕ файлы, чтобы настроить вашу многозадачную настройку.
auto
Ищите НЕФТЯНЫЕ файлы в своем источнике проекта и включайте папки, но не в их подпапках.
custom
Ищите НЕФТЯНЫЕ файлы на заданном пути и подпапках path. Можно задать путь к НЕФТЯНЫМ файлам или к папке, содержащей файлы.
Когда вы выбираете эту опцию в вашем исходном коде, Polyspace поддерживает эти многозадачные ключевые слова OSEK:
TASK
DeclareTask
ActivateTask
DeclareResource
GetResource
ReleaseResource
ISR
DeclareEvent
DeclareAlarm
Polyspace анализирует НЕФТЯНЫЕ файлы, что вы предусматриваете TASK
, ISR
, RESOURCE
и определения ALARM
. Анализ использует эти определения и поддерживаемые многозадачные ключевые слова, чтобы сконфигурировать задачи, прерывания, циклические задачи и критические разделы.
Пример: анализируйте свой многозадачный проект OSEK
Этот пример показывает, как настроить многозадачную настройку проекта OSEK и запустить анализ этого проекта. Чтобы попробовать шаги в этом примере, используйте демонстрационные файлы в папке polyspaceroot/help/toolbox/bugfinder/examples/External_multitasking/OSEK
или polyspaceroot/help/toolbox/codeprover/examples/External_multitasking/OSEK
. polyspaceroot
является папкой установки Polyspace. Результаты анализа применяются к этому примеру кода.
#include <assert.h>
#include "include/example_osek_multi.h"
int var1;
int var2;
int var3;
DeclareAlarm(Cyclic_task_activate);
DeclareResource(res1);
DeclareTask(init);
TASK(afterinit1);
TASK(init) // task
{
var2++;
ActivateTask(afterinit1);
var3++;
GetResource(res1); // critical section begins
var1++;
ReleaseResource(res1); // critical section ends
}
TASK(afterinit1) // task
{
var3++;
var2++;
GetResource(res1); // critical section begins
var1++;
ReleaseResource(res1); // critical section ends
}
void main()
{}
|
Настраивать вашу многозадачную настройку и анализировать код:
Скопируйте содержимое polyspaceroot/help/toolbox/bugfinder/examples/External_multitasking/OSEK
или polyspaceroot/help/toolbox/codeprover/examples/External_multitasking/OSEK
к вашей машине, например, в C:\Polyspace_worskpace\OSEK
.
Запустите анализ своего проекта OSEK при помощи команды:
Средство поиска ошибки:
polyspace-bug-finder -sources ^
C:\Polyspace_workspace\OSEK\example_osek_multitasking.c ^
-osek-multitasking auto
Программа автоматического доказательства кода:
polyspace-code-prover -sources ^
C:\Polyspace_workspace\OSEK\example_osek_multitasking.c ^
-osek-multitasking auto
Сервер средства поиска ошибки:
polyspace-bug-finder-server -sources ^
C:\Polyspace_workspace\OSEK\example_osek_multitasking.c ^
-osek-multitasking auto
Сервер программы автоматического доказательства кода:
polyspace-code-prover-server -sources ^
C:\Polyspace_workspace\OSEK\example_osek_multitasking.c ^
-osek-multitasking auto
Средство поиска ошибки обнаруживает гонку данных на переменной var3
из-за нескольких операция чтения и операция записи от задач init
и afterinit1
. Смотрите Data race
.
#include <assert.h>
#include "include/example_osek_multi.h"
int var1;
int var2;
int var3;
|
Нет никакого дефекта на var2
, поскольку afterinit1
переходит к активному состоянию (ActivateTask()
) после того, как init
постепенно увеличивает var2
. Точно так же нет никакого дефекта на var1
, потому что он защищен вызовами ReleaseResource()
и GetResource()
.
Программа автоматического доказательства кода обнаруживает, что var3
является потенциально незащищенной глобальной переменной, потому что это используется в задачах init
и afterinit1
без защиты от прерывания во время операций чтения и операций записи. Анализ также показывает, что циклическая операция задачи на var4
может потенциально вызвать переполнение. Смотрите Potentially unprotected variable
и Overflow
.
#include <assert.h>
#include "include/example_osek_multi.h"
int var1;
int var2;
int var3;
...
void func()
{
var4++;
}
|
Переменный var2
не совместно используется, потому что afterinit1
переходит к активному состоянию (ActivateTask()
) после того, как init
постепенно увеличивает var2
. Переменный var1
является защищенной переменной через критические разделы от вызовов ReleaseResource()
и GetResource()
.
Чтобы видеть, как модели Polyspace TASK
, ISR
, и определения RESOURCE
из ваших НЕФТЯНЫХ файлов, открывают Concurrency window от панели Dashboard.
- От (значения по умолчанию)
Polyspace не настраивает многозадачную настройку для вашего проекта OSEK.
Дополнительные факторы
Анализ игнорирует объявления TerminateTask()
в вашем исходном коде и полагает, что последующий код выполнен.
Polyspace игнорирует элементы синтаксиса ваших НЕФТЯНЫХ файлов, которые не следуют за синтаксисом, заданным здесь.