[英]Query regarding Misra rule 11.6 (MISRA C:2012)
我无法在此行中解决米斯拉规则11.6警告:
uint32_t * delay = (uint32_t *)0x40086D0C ;
[ 仅供参考: typedef long unsigned int uint32_t;]
PC-Lint:注释923:从int转换为指针[MISRA 2012 Rule 11.6,必填]
我做了什么:
您能否分享有关我的问题的有用想法? 我们将不胜感激。
皮棉一如既往的破碎 提交错误报告或仅卸载Lint。
MISRA-C:2012规则11.6是关于从指针到void的转换为算术类型的指针! 因此,“从整数到指针的转换[MISRA 2012规则11.6,必需]”是不正确的废话,与引用的规则无关,他们不正确地引用了该引用。
关于整数到指针的转换,有一个咨询规则11.4。 该规则的目的是捕获这种类型的转换会导致指针对齐不正确的情况。 但是,您可以忽略规则11.4,而不会引起偏差,因为它是建议性的。
因此,除了咨询规则外,您的代码还符合MISRA的要求,尽管您需要在整数常量后附加一个U后缀,以便确定其他规则:
uint32_t* delay = (uint32_t*)0x40086D0Cu ;
并且指针最有可能应该是volatile uint32_t*
,以便此代码有意义。
这是完全合理的强制转换(假设您的指针是32位)。 在这种情况下,最好让您的皮棉检查器忽略该行。 MISRA规则可以防止常见的错误,但是某些操作(例如访问内存映射的外围设备)在规范内无法完成(据我所知)。
使用memset
是一个非常糟糕的主意-它设置单个字节,因此您需要4次memset()
调用来设置指针的4个字节。 您可以通过一次memcpy()
调用获得类似的效果,尽管我认为这不符合规范的精神。
对于memcpy()
和memset()
,您都不会看到性能下降。 任何值得精打细算的优化编译器都将检测到固定大小的memcpy
,并将其替换为单个32位MOV指令(或适用于您平台的模拟量)。 这是c的例子
delay
的值与addr
的值相同 delay
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.