2015-05-22 8 views
3

Я работаю над промышленным кодом для контроллера 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 потребуется формальный процесс обзора, которого я бы хотел избежать.

ответ

2

Я не верю, что это обычные функции, но нестандартные встроенные функции, которые попадают в сгенерированный двоичный код, заменяются кодом ассемблера. See this.

Есть 3 правила Мишра, чтобы рассмотреть здесь, и они не обязательно согласованы друг с другом:

  • Весь код должен следовать ISO C.
  • Все функции должны иметь прототипы.
  • Все использование языка ассемблера должно быть инкапсулировано и задокументировано.

Что бы я сделал, это переместить все эти «вызовы функций» в отдельный файл и документ, чтобы этот файл содержал все интрокации встроенной сборки в вашей программе. Вероятно, вам нужен такой файл, чтобы передать другие правила MISRA относительно встроенной сборки. Укажите, что эти функции используются для инкапсуляции ассемблера. Затем исключите его из анализа статического кода, если только статический анализатор не поддерживает данный ассемблер и/или «ARM intrinsics».

Если вы сделаете это, я думаю, вы будете соответствовать 100% MISRA без необходимости повышения отклонения. Просто укажите, что встроенные средства ARM - это ваш способ инкапсулировать встроенную сборку.

+0

Перемещение этих функций в отдельный файл не является опцией, поскольку для этого потребуется изменить многие файлы, а затем просмотреть код измененных файлов. Было бы полезно иметь ссылку на достоверный источник, говорящий, что такие функции могут отклоняться от MISRA-C. Возможно, я посмотрю документацию Кейла. –

+2

@DmitryGrigoryev Допустимый источник: MISRA-C: правило 2004 года 2.1 или директива MISRA-C: 2012 4.3. Излишне говорить, что вы, вероятно, не можете запускать статический анализ в этом файле, так как он не будет написан на C. Возможно, достаточно сказать, что эти «интриги» - это инкапсуляция. Во всяком случае, вам нужно будет документировать, что они делают. Преимущество наличия отдельного файла в том, что комментарии к исходному коду могут быть вашей документацией. – Lundin

+0

@DmitryGrigoryev Более проблематично то, что компилятор использует двойное подчеркивание для этих имен, которое явно запрещено в C. 7.1.3: «Все идентификаторы, начинающиеся с подчеркивания, и буква верхнего регистра или другое подчеркивание всегда зарезервированы для любого использования. '. Ваш компилятор не соответствует стандарту C, если он использует двойное обозначение подчеркивания. – Lundin

2

Это называется compiler intrinsics, и я не уверен, что их нужно объявить. Они в основном являются расширениями языка, предоставленного компилятором.

+0

Очевидно, что они не должны быть объявлены, так как наш код компилируется и работает отлично. То, что я ищу, - это способ представить их таким образом, чтобы они соответствовали правилам MISRA. Например, использование 'sqrt()' функции вместо '__sqrt()' intrinsic решит мою проблему. Существуют ли аналогичные функции обертки для других свойств? –

+0

Я так не думаю, нет. Случай для математических функций является особым, так как, например, 'sqrt()' является частью стандартной библиотеки, стандартный исполнитель библиотеки (= Keil, в вашем случае), конечно, может выбрать использование своих встроенных компиляторов в реализации. Нет параллельного случая для «выключения прерываний», стандартная библиотека не поддерживает это. – unwind

+0

Хорошо, спасибо за прояснение технической стороны вопроса. Я принял ответ @ Lundin, поскольку проблема связана скорее с совместимостью MISRA. –

0

Как написано bevor это из компилятора. Я не думаю, что у вас есть они в источнике. Maybee вы найдете что-то, написанное в Руководстве по компилятору Keil или ARM, которое вам помогает (у меня уже нет KEIl, чтобы иметь собственный взгляд).

Может быть возможно получить определение для этой функции с помощью специальной команды Compiler (у IAR Compiler есть что-то вроде этого).

Если это не работает, вы можете сделать исключение в QA-C (не знаете его), чтобы игнорировать эту функцию, потому что она принадлежит компилятору или указывает фиктивную функцию для QA-C.

Founbd это

http://www.keil.com/support/man/docs/armccref/armccref_CJADIFCI.htm

 Смежные вопросы

  • Нет связанных вопросов^_^