Я работаю над промышленным кодом для контроллера Cortex-M0, используя uVision Keil 4.71.0.0 IDE. Наш код должен уважать правила MISRA и регулярно проверяется с помощью QA-C.Где такие специфичные для Cortex функции, как __wfi(), определенные в Keil?
Моя проблема заключается в том, что некоторые контроллеры специфические функции, как __wfi()
, __current_sp()
и т.д., кажется, не должны быть определены в любом месте, и QA-C жалуется на них:
340: __wfi();
^
Msg(5:3335) No function declaration.
Implicit declaration inserted: 'extern int __wfi();'.
CC Coding Rule 6 <next>
правой кнопкой мыши на функции имя в Keil и выбрав пункт «Перейти к определению» подтверждает, что функция не определена:
Source Browser: '__wfi' - undefined Definition/Reference!
ли Keil предоставить официальный заголовочный файл с прототипами таких функций? Для жесткого кодирования таких прототипов в коде нашего проекта или для создания исключений QA-C потребуется формальный процесс обзора, которого я бы хотел избежать.
Перемещение этих функций в отдельный файл не является опцией, поскольку для этого потребуется изменить многие файлы, а затем просмотреть код измененных файлов. Было бы полезно иметь ссылку на достоверный источник, говорящий, что такие функции могут отклоняться от MISRA-C. Возможно, я посмотрю документацию Кейла. –
@DmitryGrigoryev Допустимый источник: MISRA-C: правило 2004 года 2.1 или директива MISRA-C: 2012 4.3. Излишне говорить, что вы, вероятно, не можете запускать статический анализ в этом файле, так как он не будет написан на C. Возможно, достаточно сказать, что эти «интриги» - это инкапсуляция. Во всяком случае, вам нужно будет документировать, что они делают. Преимущество наличия отдельного файла в том, что комментарии к исходному коду могут быть вашей документацией. – Lundin
@DmitryGrigoryev Более проблематично то, что компилятор использует двойное подчеркивание для этих имен, которое явно запрещено в C. 7.1.3: «Все идентификаторы, начинающиеся с подчеркивания, и буква верхнего регистра или другое подчеркивание всегда зарезервированы для любого использования. '. Ваш компилятор не соответствует стандарту C, если он использует двойное обозначение подчеркивания. – Lundin