Как использовать разрешение ошибки MISRA C для встроенной функции ассемблера? - PullRequest
0 голосов
/ 15 января 2019

Я использую связанную с компилятором функцию ассемблера asm () в моем коде C PIC32 MCU. Мой код скомпилирован и работает нормально с использованием только функции asm («сброс») в моем C-коде. При проверке соответствия MISRA я получаю следующую ошибку MISRA:

функция 'asm' не объявлена, предполагается, что она возвращает int [MISRA 2012, правило 17.3, обязательное] asm ("сброс");

asm("reset");

Как я могу устранить эту ошибку MISRA для этой функции языка ассемблера? Я также пытался создать макрос функции, чтобы использовать его, но все равно получал ошибку.

функция 'asm' необъявлена, предполагается, что она возвращает int [MISRA 2012, правило 17.3, обязательное] ASM_RESET (void);

#define ASM_RESET(void) asm("reset")
ASM_RESET(void);

Ответы [ 2 ]

0 голосов
/ 16 января 2019

asm - это расширение компилятора , ключевое слово , а не функция. Будучи специфичным для компилятора, он не распознается автоматически инструментом статического анализа, а синтаксис встроенной сборки вашего компилятора является «функциональным», поэтому он применяет правило прототипирования функции.

Вам необходимо правильно настроить PC-Lint с помощью файла конфигурации или параметров командной строки, которые описывают поведение, определяемое реализацией вашего компилятора. Это может включать в себя очень много вариантов, но в этом случае вы должны использовать:

-dasm()=  

, что заставит анализатор игнорировать встроенный код сборки с функциональным синтаксисом asm(...)

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

#if defined _lint
    #define asm( asmstr )
#endif

Однако это скрыло бы другие отклонения от средства проверки, такие как правила инкапсуляции и изоляции встроенной сборки. По этой причине вам не следует использовать макрос или встроенную сборку, смешанную со строками кода на C, а скорее определять функцию-обертку:

void reset(void) 
{
   asm("reset");
}

и поместите определенную выше функцию reset() в отдельную единицу перевода и просто пропустите этот исходный код из анализа - как если бы это был библиотечный код.

0 голосов
/ 15 января 2019

Похоже, что PC-Lint не распознает asm в качестве ключевого слова. Он рассматривает это как функцию, у которой нет прототипа. Вы можете попробовать добавить +rw(asm) к опциям.

С другой стороны, в этом сообщении на форуме предполагает, что законным способом является определение функции reset в автономном файле, который включает только сборку, и показ файла C для ее прототипа.

reset.c:

void reset(void) {
   asm("reset");
}

test.c:

#include "reset.h"

...
reset();
...