MISRA C:2012 Dir 4.3

Ассемблер должен инкапсулироваться и изолироваться

Описание

Направляющее определение

Ассемблер должен инкапсулироваться и изолироваться.

Объяснение

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

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

  • Имя и документация, макроса инкапсуляции или функции ясно дают понять намерение ассемблера.

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

  • Можно легко заменить ассемблером различную цель или в целях статического анализа.

Реализация Polyspace

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

  • Функции asm или прагмы asm

  • Макросы

Обменивайтесь сообщениями в отчете

Ассемблер должен инкапсулироваться и изолироваться

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

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

void taskHandler(void) { 
    isTaskActive = FALSE; 
    // Software interrupt for task switching 
    asm volatile 
    ( 
        "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: необходимый
Язык: C90, C99

Введенный в R2014b