MISRA C:2012 Dir 4.3

Язык сборки должен быть инкапсулирован и изолирован

Описание

Определение директивы

Язык сборки должен быть инкапсулирован и изолирован.

Объяснение

Инкапсуляция языка сборки выгодна потому, что:

  • Это улучшает читаемость.

  • Имя и документация инкапсулирующего макроса или функции устраняют намерение языка сборки.

  • Все виды использования языка сборки для данной цели могут совместно использовать инкапсуляцию, что улучшает поддерживаемость.

  • Язык сборки можно легко заменить на другой целевой объект или для статического анализа.

Реализация Polyspace

Polyspace® не выдает предупреждение о коде языка сборки, инкапсулированном в следующем:

  • asm функции или asm pragmas

  • Макрос

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

enum boolVal {TRUE, FALSE};
enum boolVal isTaskActive;
void taskHandler(void);

void taskHandler(void) { 
    isTaskActive = FALSE; 
    // Software interrupt for task switching 
    asm volatile   /* Non-compliant */
    ( 
        "SWI &02"     /* Service #1: calculate run-time */ 
    ); 
    return; 
} 

В этом примере нарушение правил происходит, потому что код языка сборки встроен непосредственно в функцию C taskHandler который содержит другие операторы на C.

Коррекция: инкапсуляция кода сборки в макрос

Одной из возможных коррекций является инкапсуляция кода языка сборки в макрос и вызов макроса в функции taskHandler.

#define  RUN_TIME_CALC \
asm volatile \
    ( \
        "SWI &02"     /* Service #1: calculate run-Time */ \
    )\

enum boolVal {TRUE, FALSE};
enum boolVal isTaskActive;
void taskHandler(void);

void taskHandler(void) {
    isTaskActive = FALSE;
    RUN_TIME_CALC;
    return;
}

Проверяйте информацию

Группа: Кодовые проекты
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2014b