1

我有以下代码行:

uint32_t address = 0x40000000U;

这在使用au-misra2.lnt配置文件时会出现以下 3 个 PC-Lint 错误:

"*** LINT: "D:\_SVN\LPC1788-32 Dev Kit\Bootloader--4\Loadware\source\led.c"(7, 35) Note 960: Violates MISRA 2004 Required Rule 10.1, Implicit conversion of integer to smaller type"

"*** LINT: "D:\_SVN\LPC1788-32 Dev Kit\Bootloader--4\Loadware\source\led.c"(7, 35) Info 712: Loss of precision (initialization) (unsigned long to unsigned int)"

"*** LINT: "D:\_SVN\LPC1788-32 Dev Kit\Bootloader--4\Loadware\source\led.c"(7, 35) Warning 569: Loss of information (initialization) (31 bits to 16 bits)"

更改为:

uint32_t address = (uint32_t)0x40000000U;

导致赋值为 0。

为什么会发生这种情况?它适用于 32 位 Cortex-M3 处理器,因此应该将 unsigned int.. 分配给 unsigned int - 我不明白为什么它是不可接受的。

有没有人有任何想法?

4

2 回答 2

2

似乎 PC-Lint 的配置使得 sizeof(int) 等于 2。您可以使用 -si# 选项将 sizeof(int) 指定给 PC-Lint。例如,使用 -si4 指定一个 int 为 4 个字节。

此外,确保 PC-Lint 使用正确的包含路径并包含正确版本的 std_int.h。

于 2013-09-19T00:11:42.027 回答
0

编译器可以使用 16 位指令而不是 32 位指令来节省代码大小。文字的默认大小是int,可能只有 16 位。(我不确定。)转换错误可能来自文字本身,然后再进行转换。

尝试uint32_t address = 0x40000000UL;

于 2013-09-18T19:19:16.677 回答