STM32+IAR 解决Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned

本文介绍在使用IAR进行STM32工程编译时遇到的Pe147错误,详细解析了与__nounwind__interwork__softfpunsignedint__iar_builtin_REV16(unsignedint)声明冲突的问题,并提供了通过注释掉特定包含指令来解决问题的有效方案。

在IAR中编译STM32工程,遇到

Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned int __iar_builtin_REV16(unsigned int)" (declared at line 199 of "$PROJ_DIR$\CMSIS\core_cm3.h 1124

在core_cm3.h中找到如下行,注释掉“#include <intrinsics.h>  ”

then ,it works~

 

你遇到的错误信息如下: ``` Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp size_t __write(int, unsigned char const *, size_t)" (declared at line 47 of "D:\IAR FOR ARM V8.40\ D:\tm32cubemx\three\test\Core\Src\main.c 66 ``` --- ## 🔍 错误分析 这是一个 **IAR 编译器** 的错误,编号 `Pe147` 表示: > 函数声明与已有的声明不兼容。 具体来说,你可能 **重新定义了 `__write` 函数**(用于重定向 `printf`),但它的函数签名(参数、返回值)与编译器期望的不一致。 --- ## 🧠 背景知识 在嵌入式系统中,`printf` 等标准 I/O 函数需要底层函数支持,其中: - `__write()` 是 IAR 的标准库函数,用于实现 `printf` 的输出 - 你可以通过重写 `__write()` 函数来将输出重定向到调试器(semihosting)或 ITM 等 --- ## ✅ 正确的 `__write` 函数定义(适用于 IAR) 你需要确保你的 `__write` 函数签名完全匹配编译器预期的格式: ```c #include <yfuns.h> _STD_BEGIN size_t __write(int handle, const unsigned char * data, size_t size) { // 你的实现,例如: for (size_t i = 0; i < size; i++) { // 输出一个字节,比如通过 ITM 或调试器 // __sink_itm(data[i]); } return size; } _STD_END ``` ### ⚠️ 注意事项: - `__write` 函数必须使用 `size_t` 返回值类型 - 参数顺序必须是:`int handle`, `const unsigned char * data`, `size_t size` - 必须包含头文件 `<yfuns.h>` - 使用 `_STD_BEGIN` 和 `_STD_END` 是为了与 IAR 的标准库命名空间一致 --- ## 🛠️ 修复步骤 ### ✅ 步骤 1:确保函数签名正确 ```c #include <yfuns.h> _STD_BEGIN size_t __write(int handle, const unsigned char * data, size_t size) { // 示例:忽略 handle,只处理 stdout (handle == 1) if (handle != 1) { return 0; } for (size_t i = 0; i < size; i++) { // 这里可以添加你自己的输出方式,比如 ITM 输出 // ITM_SendChar(data[i]); } return size; } _STD_END ``` ### ✅ 步骤 2:确保没有其他地方重复定义 `__write` 检查项目中是否还有其他 `.c` 文件也定义了 `__write()`,避免重复定义。 --- ## ✅ 如果只想使用调试器输出(semihosting) 你可以完全不重写 `__write`,而是启用 IAR 的 Semihosting 功能: ### 方法如下: 1. 在 `Project -> Options -> Debugger` 中选择你的调试器(如 J-Link) 2. 在 `General Options` 中勾选 `Enable Semihosting` 3. 添加宏定义:`__SEMIHOSTING` 然后直接使用: ```c printf("Hello from IAR\n"); ``` 输出会显示在 IAR 的 `Terminal I/O` 窗口中。 --- ## ✅ 总结 | 原因 | 解决方法 | |------|----------| | `__write` 函数签名错误 | 使用正确的函数签名(参数和返回值) | | 没有包含 `<yfuns.h>` | 添加该头文件 | | 没有使用 `_STD_BEGIN/_STD_END` | 添加命名空间保护 | | 重复定义 `__write` | 检查项目中是否多个文件定义了该函数 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值