IAR 编译失败,CCS 编译正常。类型不兼容

IAR compilation failure, CCS compilation works. Types Incompatibility

在为我的 CC2538 使用 CCS 开发新固件(主固件和库)后,所有错误都已调试,现在设备工作正常。

从 CCS 开始,我无法永久刷新固件,我正在与 IAR 合作开发此操作。

在 IAR 上,我已经创建了工作区、项目并包含了编译固件所需的所有库和文件。但是,由于类型不兼容错误导致编译失败。

这些错误的根本原因是什么? 也许,编译器的任何选项?我需要添加任何文件吗?还是原型上的代码?

韩国!

第一个错误有点误导。这似乎表明您忘记包含 <stdlib.h>,因此 malloc 未定义,编译器假定它 returns int.

在任何情况下,您都将指针分配给数组:这是不正确的。

返回本地自动数组的地址也不正确。

您应该将accData定义为指针而不是数组,并使其指向分配的int16_t数组。您似乎希望此数组包含 3 个元素,否则相应地修改代码:

#include <stdlib.h>

int16_t *lsm303d_readAccData(void) {
    int16_t *accData = malloc(sizeof(int16_t) * 3);
    ...
    return accData;
}

您应该将编译器配置为发出更多警告并拒绝过时的构造,例如隐式 int。对于 gcc,添加 -std=c99-std=c11-Wall -Wextra -Werror

Which is the root cause of these errors?

"a value of type "int"" 是根本原因。这里应该没有int!只是 signed short*(这是你的 int16_t*)和来自 malloc 的 void*

这是因为您使用的是 C90 编译器而忘记了 #include <stdlib.h>。在找到没有原型的函数后,C90 会隐含地假设您想要一个返回 int 的函数,这解释了编译器错误 "a value of type "int""。但是malloc实际上returns一个void*,所以这是一个严重的bug。通过在找到 malloc 的地方包含 header stdlib.h 来解决此问题。

语言的这种不受欢迎和不合理的行为在 17 年前就已修复。考虑改用现代编译器,或将编译器配置为使用当前的 C 语言标准 (ISO 9899:2011)。

也就是说,这段代码也没有任何意义:

int16_t *accData[3] = malloc(sizeof(int16_t));

你的意思可能是

int16_t *accData = malloc( sizeof(int16_t[3]) );