首页 > 解决方案 > 为什么 MISRA-C 检查器提供错误检查 STM32 HAL?

问题描述

我已经使用 stm32cubemx 开始了一个包含 HAL 库的项目,但似乎存在 HAL 和 MISRA-C 合规性问题。

我正在使用 Keil 进行软件开发,并且添加了 PC-Lint (MISRA-C checker) 来检查 C 标准。当我运行 PC-lint 检查 MISRA-C 规则时,我收到了许多由 HAL 命令产生的 MISRA-C 2012 违规规则。

注意,除了stm32cube生成的源文件,我没有输入任何源文件。

例如,生成的文件包含以下两行:

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)

但我因此收到这些错误:

: Note 934: Taking address of near auto variable 'GPIO_InitStruct' (arg. no. 2) [MISRA 2012 Rule 1.3, required]
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)

我还收到很多其他错误。据此 HAL 符合 MISRA C 2012。有什么问题?

标签: cstm32microcontrollerhalmisra

解决方案


大多数板级支持包会导致违反 MISRA C 规则。

这是因为,通常,这些 BSP 正在做的事情(大多数时候)不是好主意。有时,它们是必要的(例如,内存映射寄存器需要将整数转换为指针,尽管这可以在链接器中完成)

它们通常还包含许多特定于编译器的魔法(因此规则 1.1、规则 1.2 和指令 1.1 值得适当审查!)

因此,您需要将您的违规行为分为三组。

  1. 纠正需要修复的违规行为
  2. 需要偏离的必要违规行为
  3. 您可以接受的建议违规行为(并记录您的推理)

请记住:偏差是 MISRA 合规性的可接受方面!任何说您不允许偏差的剪贴板监视器都需要一些再教育。

对于第 2 组,MISRA 发布了一些偏差许可来帮助您...

免责声明:见简介

PS:为了拯救@Lundin 发表评论,尽管我的专业背景,PC-Lint 并不是分析仪的最佳选择。

-- 已编辑 --

据此,HAL 符合 MISRA C 2012。

根据(现在添加的)链接

HAL 和 LL API 可用于生产,按照 MISRA-C®:2012 指南开发并使用 CodeSonar 静态分析工具进行检查。报告可按需提供。

你需要索取这些报告,看看他们怎么说。我很想亲自去问他们......

由于他们声称符合 MISRA C 2012,因此将有一份指南合规摘要(以及其他一些内容)......如果没有,他们就不合规。


推荐阅读