exponenta event banner

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;
}

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

Группа: Дизайн кода
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b