MISRA-C: 2004 не распространяется на C99, поэтому вы просто не можете использовать inline
вообще.
И из-за этого правило об определениях функций в файлах заголовков прямо действует даже на встроенные функции. Невозможно согласовать MISRA-C: 2004 с опубликованным кодом - вам придется создавать отклонения от нескольких обязательных правил.
Я рекомендую перейти на MISRA-C: 2012, в котором есть явное исключение для этого сценария (правило 5.9):
Исключение
встроенная функция с внутренней связью может быть определена в нескольких единицах перевода при условии, что все такие определения сделаны в одном и том же заголовочном файле, который включен в каждый единица перевода.
MISRA-C: 2012 также требует, чтобы все встроенные функции были объявлены как static
(правило 8.10).
MISRA-C: 2012 - намного лучший документ почти во всех отношениях. IAR также поддерживает версию 2012 года, и их средство проверки MISRA должно быть отдельным плагином, не связанным с конкретным MCU.
Не имеющий отношения к вашему актуальному вопросу (int16u)1u <<
совершенно неверен и опасен.
Если вы действительно должны иметь подписанные типы (чаще всего нет), тогда вы должны сначала выполнить сдвиг на беззнаковом типе, затем преобразовать в подписанный.
Это необходимо не только для соответствия MISRA-C, но и для исправления явной ошибки C, которая вызывает неопределенное поведение на 8- и 16-битных микроконтроллерах, когда вы оставляете данные сдвига в знаковый бит.
Правильный код должен быть int16uVar |= (int16u)(1u << int16uBitIndex);
, и я считаю, что это также удовлетворяет требованиям MISRA-C: 2004 о приведении к базовому типу после операции.
Также обратите внимание, что создание собственных "стандартных" целочисленных типов не одобряется в целом - поскольку вы используете C99, вам следует использовать stdint.h
и ничего больше. Это также рекомендация MISRA-C: 2012.
person
Lundin
schedule
20.05.2020