IAR9.X printf串口重定向方法,或提示Linker Error: “no definition for __write“的解决方案

news2024/11/27 8:26:03

一、问题现象:

1、Error[Li005]:no definition for"__write" [referenced from flush.o(dl7M_tlf.a)] 

2、串口重映射代码没问题,但是串口工具接收不到数据

3、复现环境:IAR9.40.1

二、操作方法:

1、[工程项目]->[Options]->[General Options]->[Library Configuration]配置如下

2、在串口初始化页面新增如下代码

3、源码如下

#include <LowLevelIOInterface.h>
int iar9x_putc(int x);
#pragma module_name = "?__write"


#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
 set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int iar9x_putc(int ch)
#endif /* __GNUC__ */


/*
* If the __write implementation uses internal buffering, uncomment
* the following line to ensure that we are called with "buffer" as 0
* (i.e. flush) when the application terminates.
*/
size_t __write(int handle, const unsigned char * buffer, size_t size)
{
    size_t nChars = 0;
    if (buffer == 0)
    {
        /* This means that we should flush internal buffers. Since we don't we just return
        * (Remember, "handle" == -1 means that all handles should be flushed.) */
        return 0;
    }
    /* Only writes to "standard out" and "standard err", return failure for other handles*/
    if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR)
    {
        return _LLIO_ERROR;
    }
    for (/* Empty */; size != 0; --size)
    {
        if (iar9x_putc(*buffer++) < 0)
        {
            return _LLIO_ERROR;
        }
        ++nChars;
    }
    return nChars;
}


/*** @brief Retargets the C library printf function to the USART. ***/
PUTCHAR_PROTOTYPE
{
 /* Place your implementation of fputc here */
 /* e.g. write a character to the USART and Loop until the end of transmission */
 HAL_UART_Transmit(&husart_debug, (uint8_t *)&ch, 1, 0xFFFF);
 return ch;
}

三、原理分析

1、IAR 帮助文档“EWARM 开发指南”,可以通过 Help-> C/C++ Development Guide 查看 EWARM_DevelopmentGuide.ENU.pdf 文件

2、文档的 The DLIB runtime environment 中“BRIEFLY ABOUT RETARGETING”章 节有重定向的较详细说明,如下图 2所示。IAR9.x DLib 使用 printf 时需要重定向__write 函数,详见文档

3、在 \arm\src\lib\file\write.c 文件已经给出了一个__write 的实现模 板,客户可以自行参考。

四、参考链接:

【应用笔记】LAT1295 IAR 9.x环境下STM32 printf 重定向串口输出 - STM32团队 ST意法半导体中文论坛

IAR9.X printf串口底层重定向方法,否则提示Linker Error: "no definition for __write" - 开发环境 - 硬汉嵌入式论坛 - Powered by Discuz!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【负载均衡式在线OJ】Compile_server 模块

文章目录 程序源码compile_server整体思路编译(compile.hpp)运行模块编译运行模块编译运行服务 程序源码 https://gitee.com/not-a-stupid-child/online-judge compile_server 整体思路 这个服务要对oj_server 发送过来的代码进行编译和运行&#xff0c;最后把结果返回给oj…

理想二极管

原理图 mos管选型 参考链接 很实用&#xff01;用MOS管制作一个理想中的二极管_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Xi421r7K8/?spm_id_from333.1007.tianma.2-1-4.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年9月3日

JS设计模式之“单孑独立” - 单例模式

image.png 引言 在JavaScript开发中&#xff0c;单例模式是一种常见且实用的设计模式一。 单例模式的核心思想是&#xff1a;确保一个类只有一个实例对象&#xff0c;并且该对象可以在应用程序的任何地方被共享和访问。通过使用单例模式&#xff0c;我们可以简化代码、节省资…

SpringCloud开发实战(一):搭建SpringCloud框架

本系列文章主要是记录在工作中用到的微服务的各个组件&#xff0c;以及学习新的微服务组件~如有问题&#xff0c;欢迎大家批评指导。如果本文对你有帮助&#xff0c;还请点个收藏和关注。感谢支持&#xff0c;希望大家写的代码都没有BUG&#xff01;&#xff01; 前言 下面是我…

Linux下编译安装SuperLU

SuperLU用于求解大规模稀疏线性方程组&#xff0c;本文记录在远程Linux服务器下编译安装SuperLU的流程。 一、配置VS Code 2.1 安装VS Code Extensions 在本地打开VS Code, 安装以下扩展插件&#xff0c; Task Explorer Output Colorizer Git Extension Pack Remote Develop…

Stirling-PDF:基于Web的开源PDF处理工具

PDF文件进行各种各样的操作&#xff0c;比如合并、拆分、加密、解密、旋转、压缩等等&#xff0c;功能超全&#xff0c;而且开源免费&#xff0c;简直是神器&#xff01; GitHub - Stirling-Tools/Stirling-PDF: #1 Locally hosted web application that allows you to perfor…

【JAVA开源】基于Vue和SpringBoot的历史学习网站

本文项目编号 T 004 &#xff0c;文末自助获取源码 \color{red}{T004&#xff0c;文末自助获取源码} T004&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

IDEA主题的设置

目录 一、更换皮肤&#xff1a; 二、设置背景图片&#xff1a; 1.点击 File -> Settings ; 2.选择 Appearance & Behavior -> Appearance ; 一、更换皮肤&#xff1a; 1. Theme: 点击下拉框打开&#xff1b; 白色皮肤&#xff1a; inteIIiJ light Windows 10 Lig…

VirtualLab Fusion Installer-7.6.1.18 安装包 永不过期 永久使用 下载

下载地址(资源制作整理不易&#xff0c;下载使用需付费&#xff0c;不能接受请勿浪费时间下载) 链接&#xff1a;https://pan.baidu.com/s/14yJGZAosK_ftJhHD0D4VHA?pwd00zn 提取码&#xff1a;00zn

Lua:条件断点

如果有很多方式都要经过这个函数&#xff0c;但是你只需要满足其中例如参数等于Test的这一种&#xff0c;可以在断点处右键点击编辑断点打上条件断点&#xff0c;只有参数EventName等于Test的才会断上。

如何打造高校实验室预约系统?Java SpringBoot助力高效管理,MySQL存储数据,Vue前端展现,四步实现学生轻松预约!

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【机器学习-神经网络】循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

Graylog配置用户权限以及常用搜索语法

文章目录 一、Graylog配置用户管理1、用户创建2、角色权限管理 二、搜索语法 基于Docker搭建Graylog的具体步骤&#xff1a; https://blog.csdn.net/weixin_44876263/article/details/141638739?spm1001.2014.3001.5502 一、Graylog配置用户管理 1、用户创建 2、角色权限管理…

Linux--实现简易shell

文章目录 shell定义和功能myshell.cGetCwd()GetUsrName()GetHostName()MakeCommandLineAndPrint()GetUserCommand()SplitCommand()Die()ExecuteCommand()GetHome()Cd()CheckBuildin()CheckRedir()myshell.c完整代码 makefile测试函数和进程之间的相似性 Shell是一个功能强大的工…

LVS之net模式实验

总结&#xff1a; lvs #配置环境&#xff0c;两个网卡 [rootlvs ~]# cd /etc/NetworkManager/system-connections/ [rootlvs system-connections]# ls ens160.nmconnection eth0.nmconnection eth1.nmconnection [rootlvs system-connections]# vim eth0.nmconnection [co…

华为OD机试 - 猜数字 - 穷举搜索(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

【RabbitMQ之一:windows环境下安装RabbitMQ】

目录 一、下载并安装Erlang1、下载Erlang2、安装Erlang3、配置环境变量4、验证erlang是否安装成功 二、下载并安装RabbitMQ1、下载RabbitMQ2、安装RabbitMQ3、配置环境变量4、验证RabbitMQ是否安装成功5、启动RabbitMQ服务&#xff08;安装后服务默认自启动&#xff09; 三、安…

Vue2转Vue3学习历程

选项式API>组合式API vue3和vue2的差别就是选项式api改为组件式api&#xff0c;就是以前vue2要定义data、method、mounted&#xff0c;在vue3就变为了更模块化的&#xff0c;并且我感觉vue3设计思路更多是以调用方法的方式实现&#xff0c;比如我实现一个方法&#xff0c;并…

C语言深入理解指针2

1.数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] %p\n", &arr[0]);printf("arr %p\n", arr);return 0; }可以发现数组名和数组首元素地址的打印结果一样&#xff0c;因此&#xf…

研究生深度学习入门的十天学习计划------第七天

第7天&#xff1a;自然语言处理&#xff08;NLP&#xff09;中的深度学习 目标&#xff1a; 掌握自然语言处理的基础知识与深度学习模型&#xff0c;理解如何应用RNN、LSTM、Transformer等模型处理文本数据。 7.1 自然语言处理的基础概念 自然语言处理&#xff08;NLP&#…