当前位置: 首页 > news >正文

电控---printf重定向输出

在嵌入式系统开发中,printf 重定向输出是将标准输出(stdout)从默认设备(如主机终端)重新映射到嵌入式设备的特定硬件接口(如串口、LCD、USB等)的过程。


一、核心原理:标准IO库的底层机制

  1. C标准库的I/O层次结构

    • printf 属于标准IO库(libc),其输出最终依赖底层的 字符输出函数(如 fputc)和 文件流操作stdout)。
    • stdout 是指向 FILE 结构体的指针,该结构体定义了输出设备的操作接口(如写字符函数)。
  2. 重定向的本质

    • 通过 重定义底层输出函数,将 printf 的输出路径从默认设备(如主机终端)切换到目标硬件(如UART、SPI设备)。
    • 关键是让 printf 在调用 fputc 时,实际执行目标设备的写操作。

二、核心实现步骤:以UART为例

1. 准备硬件驱动(以UART为例)
  • 初始化UART硬件:配置波特率、数据位、停止位、奇偶校验等(具体代码依赖芯片型号,如STM32的HAL库或寄存器操作)。
    // 示例:STM32 HAL库初始化UART
    UART_HandleTypeDef huart1;
    void uart_init() {huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;HAL_UART_Init(&huart1);
    }
    // 发送单个字符到UART
    void uart_putchar(char c) {HAL_UART_Transmit(&huart1, (uint8_t*)&c, 1, 100); // 阻塞发送
    }
    
2. 重定义fputc(最通用方法)
  • fputc 是标准IO库中用于向流(如stdout)写入单个字符的函数,printf 通过调用它输出每个字符。
  • 重定义该函数,使其调用目标设备的写函数(如uart_putchar)。
    #include <stdio.h>
    int fputc(int ch, FILE *f) {if (f == stdout) { // 仅处理标准输出uart_putchar((char)ch); // 调用硬件发送函数// 处理换行符(可选:若设备需要\r\n,添加此逻辑)if (ch == '\n') {uart_putchar('\r');}}return ch; // 返回写入的字符
    }
    
3. 处理特殊字符(如换行符\n
  • 部分设备(如串口终端)需要 \r\n 作为换行标识,而 printf\n 仅输出 0x0A,因此需在 fputc 中手动添加 \r
    if (ch == '\n') {uart_putchar('\r'); // 先发送\r
    }
    
4. 编译器特定适配(关键差异点)
  • 不同编译器可能使用不同的底层函数名,需按编译器文档调整:
    • GCC(如ARM-GCC、GNU工具链):通常直接重定义 fputc 即可,或部分版本需重定义 __io_putchar(如STM32CubeIDE)。
    int __io_putchar(int ch) {uart_putchar(ch);return ch;
    }
    
    • Keil MDK(ARM Compiler):需重定义 __fputc,并可能需要关闭“Use MicroLIB”(若使用标准库):
    int __fputc(int ch, FILE *f) {uart_putchar(ch);return ch;
    }
    
    • IAR:重定义 fputc,并确保链接时不使用半主机模式(Semihosting)。
5. 关闭半主机模式(ARM调试常见问题)
  • 半主机模式是ARM调试时通过主机模拟IO的机制,若不关闭,printf 会默认输出到主机终端。
  • 关闭方法:
    • Keil:在工程配置中取消勾选 Use Semihosting
    • GCC:通过链接选项 -specs=nosys.specs 或定义 __ARM_ARCH_7__ 等宏(具体依工具链而定)。

三、进阶:不同场景的重定向

1. 重定向到非字符设备(如LCD、SPI/UART外设)
  • 若设备以块或帧为单位传输(如LCD显示字符串),需在 fputc 中逐字符发送,或在更高层函数(如自定义 lcd_puts)中处理缓冲。
int fputc(int ch, FILE *f) {lcd_write_char(ch); // LCD驱动的字符写入函数return ch;
}
2. 无操作系统(裸机)vs RTOS环境
  • 裸机:直接实现阻塞式 fputc,无需考虑任务同步。
  • RTOS(如FreeRTOS):若多个任务调用 printf,需添加互斥锁(如 vTaskSuspendAll()/xTaskResumeAll())防止竞态条件:
    int fputc(int ch, FILE *f) {taskENTER_CRITICAL(); // 进入临界区uart_putchar(ch);taskEXIT_CRITICAL(); // 退出临界区return ch;
    }
    
3. 重定向到多个输出设备(多流支持)
  • 若需同时输出到串口和LCD,可创建自定义 FILE 结构体并注册对应的写函数(需深入理解libc的流操作机制,较复杂):
    // 示例:定义自定义流
    FILE my_uart_stream;
    FILE my_lcd_stream;
    // 注册写函数(非标准方法,依赖编译器支持)
    my_uart_stream._write = uart_write_func;
    my_lcd_stream._write = lcd_write_func;
    // 使用:fprintf(&my_uart_stream, "UART: %d", data);
    
4. 禁用标准库缓冲(提升实时性)
  • stdout 默认使用行缓冲或全缓冲,可能导致输出延迟。通过 setvbuf(stdout, NULL, _IONBF, 0) 设置无缓冲模式:
    int main() {uart_init();setvbuf(stdout, NULL, _IONBF, 0); // 无缓冲printf("Hello, Embedded!\n"); // 立即输出return 0;
    }
    

四、关键注意事项

  1. 头文件包含

    • 必须包含 stdio.h,否则编译器可能无法识别 FILEfputc
  2. 内存占用与库选择

    • 标准IO库(如libc)可能占用较多内存,嵌入式系统通常使用轻量版本(如 newlib)。若使用 newlib,需确保配置中启用了相关组件(如 _printf_float 支持浮点输出)。
  3. 浮点输出支持

    • printf 的浮点格式(如%f)需要额外的数学库支持,可能增加代码体积。若无需浮点功能,可通过编译器选项禁用(如Keil的--no_floating_point)。
  4. 重定向失败排查

    • 检查硬件驱动是否正确初始化(如UART波特率是否匹配)。
    • 确认是否关闭半主机模式,避免输出到调试主机。
    • 调试时可先测试 fputc 单字符发送(如循环发送'A'),再测试printf
    • 编译器优化等级可能导致函数未被链接,可添加 __attribute__((used)) 强制保留重定义函数。
  5. 自定义printf(非标准库方案)

    • 若资源极度受限,可实现独立于标准库的简易printf,直接操作硬件(需解析格式字符串并实现字符转换,如itoa)。但此方法兼容性差,不建议除非必要。

五、典型代码示例(STM32 + GCC)

#include <stdio.h>
#include "stm32f4xx_hal.h"UART_HandleTypeDef huart1;// UART初始化
void uart_init() {huart1.Instance = USART1;huart1.Init.BaudRate = 115200;// 其他配置...HAL_UART_Init(&huart1);
}// 重定义fputc
int fputc(int ch, FILE *f) {if (f == stdout) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);// 处理\n到\r\n的转换if (ch == '\n') {HAL_UART_Transmit(&huart1, (uint8_t*)"\r", 1, 100);}}return ch;
}int main() {HAL_Init();uart_init();setvbuf(stdout, NULL, _IONBF, 0); // 无缓冲printf("System started at %s\n", __TIME__);while(1);
}

六、总结

嵌入式系统中printf重定向的核心是通过重定义底层字符输出函数(如fputc),将标准输出映射到目标硬件。关键步骤包括:

  1. 实现目标设备的单字符写入函数;
  2. 重定义编译器对应的底层函数(注意不同工具链的差异);
  3. 处理特殊字符、缓冲模式及调试配置;
  4. 适配裸机或RTOS环境,确保线程安全。

掌握此技术后,可灵活将printf输出到串口、LCD、网络等任意设备,极大提升嵌入式系统的调试和交互能力。注意结合具体编译器文档和硬件驱动进行适配,避免因底层差异导致的问题。


重点函数讲解

HAL_UART_Transmit 是 STM32 HAL(Hardware Abstraction Layer,硬件抽象层)库中用于通过 UART(通用异步收发传输器)发送数据的函数。

函数原型

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

参数解释

  1. UART_HandleTypeDef *huart

    • 此参数是一个指向 UART_HandleTypeDef 结构体的指针,该结构体用于保存 UART 外设的配置信息与状态。
    • HAL_UART_Transmit(&huart1, (uint8_t*)&c, 1, 100); 里,&huart1 代表的是指向 huart1 结构体的指针,这里的 huart1 通常是在初始化 UART1 外设时自动生成的句柄,借助它可以指定要使用的 UART 外设。
  2. uint8_t *pData

    • 这是一个指向要发送数据的指针,数据类型为 uint8_t(无符号 8 位整数)。
    • HAL_UART_Transmit(&huart1, (uint8_t*)&c, 1, 100); 中,(uint8_t*)&c 是将变量 c 的地址强制转换为 uint8_t* 类型。这意味着要发送的是变量 c 的值。
  3. uint16_t Size

    • 该参数表示要发送的数据的字节数。
    • HAL_UART_Transmit(&huart1, (uint8_t*)&c, 1, 100); 中,1 表明只发送 1 个字节的数据,也就是变量 c 的值。
  4. uint32_t Timeout

    • 此参数为发送操作的超时时间,单位是毫秒(ms)。
    • HAL_UART_Transmit(&huart1, (uint8_t*)&c, 1, 100); 中,100 意味着如果在 100 毫秒内无法完成数据发送,函数会提前返回,以避免程序陷入无限等待。
      在这个示例中,send_single_char 函数的作用是通过 UART1 发送一个字符。它调用 HAL_UART_Transmit 函数,将字符 c 发送出去,并且设置超时时间为 100 毫秒。如果发送失败,函数会返回一个非 HAL_OK 的状态码,这时就可以对发送失败的情况进行处理。

示例:TI的MSPM0G3507实现重定向

#include “stdio.h”
#include "string.h"// 重定向fputc函数
int fputc(int ch, FILE *f){DL_UART_transmitDataBlocking(UART_0_INST, ch);return (ch);
}
// 重定向fputs函数int fputs(const char* restrict s, FILE* restrict stream) {uint16_t i,len;len = strlen(s);for(i=0;i<len;i++){DL_UART_transmitDataBlocking(UART_0_INST, s[i]);}return len;
}
// 重定向puts函数
int puts(const char* _ptr)
{int count = fputs(_ptr,stdout);count += fputs("\n",stdout);return count;
}

相关文章:

电控---printf重定向输出

在嵌入式系统开发中&#xff0c;printf 重定向输出是将标准输出&#xff08;stdout&#xff09;从默认设备&#xff08;如主机终端&#xff09;重新映射到嵌入式设备的特定硬件接口&#xff08;如串口、LCD、USB等&#xff09;的过程。 一、核心原理&#xff1a;标准IO库的底层…...

uniapp使用createSelectorQuery,boundingClientRect获取宽度和高度不准确的可用的解决方案

场景展示&#xff1a; uniapp使用createSelectorQuery,boundingClientRect获取宽度和高度不准确的可用的解决方案&#xff0c;正常来说&#xff0c;使用下面的代码是可以正确获得宽高的&#xff0c;但是里面含有图片&#xff0c;在图片没有加载完的情况下&#xff0c;我们可以…...

DSO:牛津大学推出的物理一致性3D模型优化框架

在数字内容创作和制造领域,将2D图像转换为高质量、物理上稳定的3D模型一直是一个挑战。传统的3D建模方法往往需要大量的手动调整以确保生成的物体不仅美观而且符合物理定律,能够在现实世界中稳定存在。牛津大学近期推出了一款名为DSO(Direct Sparse Odometry)的项目,它不仅…...

Delphi Ini文件对UTF8支持不爽的极简替代方案

如题&#xff0c;没太多废话&#xff0c;直接复制走即可。 unit uConfig;interfaceuses classes, Sysutils;typeTConfig class privateFFileName: String;FConfig:TStringList; protectedpublicconstructor Create(ConfigFile:String);destructor Destroy;property FileName…...

Windows平台使用Docker部署Neo4j

✅ Docker 安装 Neo4j 前提条件&#xff1a;安装docker 打开docker desktop docker run \--name neo4j \-p7474:7474 -p7687:7687 \-d \-e NEO4J_AUTHneo4j/password123 \neo4j:5默认用户名是 neo4j&#xff0c;密码是你设置的&#xff0c;比如上面是 password123 ✅用 Pyt…...

FreeRTOS二值信号量详解与实战教程

FreeRTOS二值信号量详解与实战教程 &#x1f4da; 作者推荐&#xff1a;想系统学习FreeRTOS嵌入式开发&#xff1f;请访问我的FreeRTOS开源学习库&#xff0c;内含从入门到精通的完整教程和实例代码&#xff01; 1. 二值信号量核心概念解析 二值信号量(Binary Semaphore)是Fre…...

数据结构与算法[零基础]---6.算法概况

六、算法概述 (一)算法的概述 任何解决问题的过程都是由一定的步骤组成的&#xff0c;把解决问题的方法和有限的步骤称作算法 &#xff08;二&#xff09;算法的基本特征 1.有穷性 算法必须在执行有限个操作之后终止&#xff0c;且每一步都可在有限时间内完成。 2.确定性 算…...

STL简介(了解)

1.什么是STL STL(standard template libaray)是标准模板库&#xff0c;它是C标准库的一部分。C标准库中还有一些其它东西&#xff0c;比如之前用的IO流。它主要是数据结构和算法的库。 2.STL的版本 C3.0出来后就有了模板&#xff0c;此时大家已经深受没有数据结构算法库的痛苦…...

使用 Oh My Posh 自定义 PowerShell 提示符

使用 Oh My Posh 自定义 PowerShell 提示符 由于ai生图&#xff0c;ai视频这方面mac太差了&#xff0c;买N卡&#xff0c;转windows了&#xff0c;这里也记录一下 PowerShell 配置Oh My Posh 先上效果图 一、下载 PowerShell7 默认的 PowerShell5 太差了&#xff0c;下载地…...

4月17号

//1.编码 String str "ai你哟"; byte[] bytes1 str.getBytes(); System.out.println(Arrays.toString(bytes1)); byte[] bytes2 str.getBytes(charsetName: "GBK"); System.out.println(Arrays.toString(bytes2));//2.解码 String str2 new String(byt…...

react-native搭建开发环境过程记录

主要参考&#xff1a;官网的教程 https://reactnative.cn/docs/environment-setup 环境介绍&#xff1a;macos ios npm - 已装node18 - 已装&#xff0c;通过nvm进行版本控制Homebrew- 已装yarn - 已装ruby - macos系统自带的2.2版本。watchman - 正常安装Xcode - 正常安装和…...

自然语言处理(NLP)技术。

自然语言处理&#xff08;NLP&#xff09;技术可以应用于多个领域&#xff0c;以下是一些示例&#xff1a; 情感分析&#xff1a;NLP可以用来分析文本中包含的情感&#xff0c;帮助企业了解用户对他们产品或服务的感受。例如&#xff0c;社交媒体平台可以利用情感分析技术来监测…...

Ubuntu 安装WPS Office

文章目录 Ubuntu 安装WPS Office下载安装文件安装WPS问题1.下载缺失字体文件2.安装缺失字体 Ubuntu 安装WPS Office 下载安装文件 需要到 WPS官网 下载最新软件&#xff0c;比如wps-office_12.1.0.17900_amd64.deb 安装WPS 执行命令进行安装 sudo dpkg -i wps-office_12.1…...

【WPF】 自定义控件的自定义属性

文章目录 前言一、自定义控件部分二、在页面中使用总结 前言 在一个页面&#xff0c;重复用到同一个自定义控件时&#xff0c;该如何对控件分别进行数据绑定呢&#xff1f;这时候可以赋予控件一个自定义的属性&#xff0c;来完成此操作。 一、自定义控件部分 为自定以控件设置…...

Unity URP Moblie AR示例工程,真机打包出来,没阴影

效果&#xff1a; unity ar示例演示 现象&#xff1a; 真机打包测试私活没有阴影 Unity版本&#xff1a;2022.3.4f1c1 分析原因&#xff1a; Prefab &#xff1a;ARFeatheredPlane中也有材质&#xff0c;一个用于环境遮挡&#xff0c;一个用于阴影接受。 按理说有啊。 urp …...

如何删除word中的长横线(由三个减号---自动生成/由三个等号===自动生成/由三个###自动生成)_word三个减号回车的横线怎么删除-CSDN博客

方法1、选中前后行ctrlX剪切掉 方法2&#xff1a;如果文件中没有表格就非常简单&#xff0c;直接CtrlA全选整个文档&#xff0c;然后在表格边框里面选择“无框线”OK&#xff0c;如果有表格的话&#xff0c;就从横线的下行开始向上随意选取一部分&#xff0c;同样在表格边框中选…...

函数返回const引用,使用const修饰变量接收

函数返回const引用&#xff0c;使用const修饰变量接收 1、背景 想获取红绿灯时长数组并添加新的值。有个函数是返回红绿灯时长数组的。函数返回类型为const引用&#xff0c;我使用无修饰的变量接收。但是感觉有些问题&#xff0c;并且之前看到const变量变成非const还需要使用…...

在激烈竞争下B端HMI设计怎样打造独特用户体验?

在当今数字化高度发展的时代&#xff0c;B 端市场竞争愈发激烈。对于 B 端 HMI&#xff08;人机界面&#xff09;设计而言&#xff0c;打造独特的用户体验已成为在竞争中脱颖而出的关键因素。B 端用户在复杂的工作场景中&#xff0c;对 HMI 设计有着独特的需求和期望&#xff0…...

数理逻辑(Mathematical Logic)综论与跨学科应用

李升伟 整理 数理逻辑&#xff08;Mathematical Logic&#xff09;是现代逻辑学与数学交叉的核心学科&#xff0c;以严格的数学方法研究逻辑推理的形式与规律。其发展深刻影响了数学基础、计算机科学、语言哲学等领域。以下从多个维度综论数理逻辑&#xff1a; 1. 核心分支 命…...

4.17---实现商铺和缓存与数据库双写一致以及宕机处理

实现商铺和缓存与数据库双写一致&#xff08;以及强双写一致策略&#xff09; redis点评项目采用的是延时双删策略 双删&#xff1a; 我们更新完数据库之后删除缓存&#xff0c;这样即使有线程并发进来查询&#xff0c;会发现缓存中没有数据&#xff0c;从而会去mysql中查找…...

qt与html通信

**Cef视图&#xff08;CefView&#xff09;**是指在使用Chromium Embedded Framework&#xff08;CEF&#xff09;时&#xff0c;嵌入到应用程序中的浏览器视图。CEF是一个开源项目&#xff0c;它基于Google的Chromium浏览器&#xff0c;允许开发者将Web浏览器功能嵌入到自己的…...

【从零实现高并发内存池】thread cache、central cache 和 page cache 回收策略详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

算法5-16 对二进制字符串解码

输入样例&#xff1a; 5 a 4 b 3 c 2 w 1 z 1 100001110101101101100111输出样例&#xff1a; baaacabwbzc ac代码&#xff1a; #include<iostream> #include<queue> #include<map> using namespace std; const int N10010; int idx; int a[N][2]; char b…...

[MySQL数据库] InnoDB存储引擎(三): 内存结构详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

TDengine 存储引擎剖析:数据文件与索引设计(一)

TDengine 存储引擎简介 在物联网、工业互联网等快速发展的今天&#xff0c;时间序列数据呈爆发式增长。这些数据具有产生频率高、依赖采集时间、测点多信息量大等特点&#xff0c;对数据存储和处理提出了极高要求。TDengine 作为一款高性能、分布式、支持 SQL 的时序数据库&am…...

CentOS更换yum源

CentOS更换yum源 视频教程&#xff1a; https://www.bilibili.com/video/BV1yWaSepE6z/?spm_id_from333.1007.top_right_bar_window_history.content.click 步骤&#xff1a; 第一步&#xff1a; cd /etc/yum.repos.d第二步&#xff1a;cp CentOS-Base.repo CentOS-Base.repo…...

【Kubernetes基础--持久化存储原理】--查阅笔记5

目录 持久化存储机制PV 详解PV 关键配置参数PV 生命周期的各个阶段 PVC 详解PVC 关键配置参数PV 和 PVC 的生命周期 StorageClass 详解StorageClass 关键配置参数设置默认的 StorageClass 持久化存储机制 k8s 对于有状态的容器应用或对数据需要持久化的应用&#xff0c;不仅需…...

数据库子查询实验全解析

目录 一、验证性实验&#xff1a;夯实基础&#xff08;一&#xff09;查询同班学生信息&#xff08;二&#xff09;查询成绩相关信息&#xff08;三&#xff09;查询课程选课人数&#xff08;四&#xff09;相关子查询&#xff08;五&#xff09;EXISTS嵌套子查询&#xff08;六…...

HTML:表格数据展示区

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人员信息表</title><link rel"styl…...

webgl入门实例-08索引缓冲区的基本概念

WebGL 索引缓冲区 (Index Buffer) 索引缓冲区(也称为元素数组缓冲区)是WebGL中一种优化渲染性能的重要机制&#xff0c;它允许您重用顶点数据来绘制复杂的几何图形。 基本概念 索引缓冲区的工作原理&#xff1a; 您创建一个顶点缓冲区(包含所有顶点数据)然后创建一个索引缓…...

大数据应用开发——大数据平台集群部署

目录 前言 目录 基础环境 安装虚拟机 基础环境 VMware Workstation 虚拟机版本 &#xff1a; centos7 主机名 ip 用户名 密码 master192.168.245.100root123456slave1192.168.245.101root123456slave2192.168.245.102root123456 安装虚拟机 安装 名称、路径自己改 我有16核&…...

GPT对话UI--通义千问API

GPT对话UI 项目介绍 一个基于 GPT 的智能对话界面&#xff0c;提供简洁优雅的用户体验。本项目使用纯前端技术栈实现&#xff0c;无需后端服务器即可运行。 功能特点 &#x1f4ac; 实时对话&#xff1a;支持与 AI 进行实时对话交互&#x1f313; 主题切换&#xff1a;支持…...

智能体数据分析

数据概览&#xff1a; 展示智能体的累计对话次数、累计对话用户数、对话满意度、累计曝光次数。数据分析&#xff1a; 统计对话分析、流量分析、用户分析、行为分析数据指标&#xff0c;帮助开发者完成精准的全面分析。 ps&#xff1a;数据T1更新&#xff0c;当日12点更新前一天…...

泛型算法——只读算法(一)

在 C 标准库中&#xff0c;泛型算法的“只读算法”指那些 不会改变它们所操作的容器中的元素&#xff0c;仅用于访问或获取信息的算法&#xff0c;例如查找、计数、遍历等操作。 accumulate std::accumulate()是 C 标准库**numeric**头文件中提供的算法&#xff0c;用于对序列…...

树莓派超全系列教程文档--(29)config.txt介绍

config.txt介绍 什么是 config.txt &#xff1f;文件格式高级功能include条件过滤 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 什么是 config.txt &#xff1f; Raspberry Pi 设备使用名为 config.txt 的配置文件&#xff0c;而不是传统 PC …...

第十六届蓝桥杯大赛软件赛省赛 C++ 大学 B 组 部分题解

赛时参加的是Python组&#xff0c;这是赛后写的题解&#xff0c;还有两题暂时还不会&#xff0c;待更新 题目链接题目列表 - 洛谷 | 计算机科学教育新生态 A 移动距离 答案&#xff1a;1576 C 可分解的正整数 Python3 import itertools from functools import cmp_to_ke…...

C++栈与堆内存详解:Visual Studio实战指南

C++栈与堆内存详解:Visual Studio实战指南 IDE环境:Visual Studio 2022 一、内存分区与核心概念 在C++程序中,内存分为**栈(Stack)和堆(Heap)**两大核心区域,两者的管理方式、生命周期和适用场景差异显著。 1. 栈内存(Stack Memory) • 特性: • 自动管理:由编…...

在Ubuntu服务器上部署xinference

一、拉取镜像 docker pull xprobe/xinference:latest二、启动容器&#xff08;GPU&#xff09; docker run -d --name xinference -e XINFERENCE_MODEL_SRCmodelscope -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 # 启动一个新的Docker容…...

非洲电商争夺战:中国闪电战遭遇本土游击队的降维打击

2024年5月&#xff0c;南非电商市场爆发史诗级对决——Temu闪电突袭下载量破百万&#xff0c;却在30天内遭遇Takealot的本土化反击致留存率腰斩。这场价值500亿美元市场的攻防战&#xff0c;揭开了非洲电商最残酷的生存法则&#xff1a;低价利刃砍不动本土化铁壁。 一、跨境模式…...

亚瑟阿伦36问

问 36 个问题&#xff0c;你就能爱上一个人&#xff0c;对方也能爱上你。 第一组 聚焦个人背景与价值观 例如“你最感激生命中的什么&#xff1f;”、“如果可以改变成长经历&#xff0c;你会改变什么&#xff1f;” 1、如果可以跟世上任何人共进晚餐&#xff0c;你会选择谁&…...

Ubuntu 20.04.6编译安装COMFAST CF-AX90无线网卡驱动

目录 0 前言 1 CF-AX90无线网卡驱动 1.1 驱动下载 1.2 驱动准备 2 编译安装驱动 2.1 拷贝驱动依赖到系统 2.2 驱动安装编译 3 重启 0 前言 COMFAST CF-AX90或者说AIC8800D80的Linux版本驱动不支持高版本的linux内核&#xff0c;实测目前仅支持最高5.15的内核。Ubuntu2…...

函数的极限与连续(强化和真题)

强化错题如下&#xff1a;...

4.15【Q】netsafe

我正在学习网络空间安全&#xff0c;” Cookie&#xff1a;使用防hash技术防御SYN泛洪攻击&#xff0c;减少服务器内存消耗“什么意思&#xff1f;什么是SYN泛洪攻击&#xff1f;什么又是防hash技术防御&#xff1f; &#xff1f;详细解释&#xff0c;越细节越好 连接成功率 …...

多个路由器互通(静态路由)无单臂路由(简单版)

多个路由器互通&#xff08;静态路由&#xff09;无单臂路由&#xff08;简单版&#xff09; 开启端口并配ip地址 维护1 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(config-if)#ip address 192.168.10.254 255.255.255.0 Ro…...

opencv HSV的具体描述

色调H&#xff1a; 使用角度度量&#xff0c;取值范围为0\~360&#xff0c;从红色开始按逆时针方向计算&#xff0c;红色为0&#xff0c;绿色为120&#xff0c;蓝色为240。它们的补色是&#xff1a;黄色为60&#xff0c;青色为180&#xff0c;紫色为300。通过改变H的值&#x…...

ubuntu磁盘挂载

1、‌查看磁盘设备及分区‌ 命令‌&#xff1a;列出所有块设备&#xff08;磁盘及分区&#xff09; lsblk 0表示此块未挂载 2、格式化分区 sudo mkfs.ext4 /dev/sdb 注意sdb换成自己的块名称 3、创建挂载点目录‌ sudo mkdir -p /mnt/data4、永久挂载 sudo blkid /dev…...

Visual Studio C++引入第三方库

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理visual studio C导入第三方库的注意事项与操作 bilibili配套视频:【visual studio C导入第三方库-哔哩哔哩】 https://b23.tv/vphfXnv 运行库选项 右键项目 -> 属性 -> C/C ->代码生成->…...

2025中国移动云智算大会回顾:云智变革,AI+跃迁

4月10日&#xff0c;2025中国移动云智算大会在苏州举办。会上&#xff0c;中国移动开启“由云向智”新范式&#xff0c;以“智”为核心开辟算网新生态&#xff0c;彰显其在AI新时代的战略远见与技术引领力。 “云智算”将如何通过算网基础设施与人工智能核心技术的深度融合&am…...

海珠区公示人工智能大模型应用示范区第二批资金奖励企业名单,助力产业蓬勃发展

2025 年 4 月 15 日&#xff0c;广州琶洲人工智能与数字经济试验区管理委员会在广州市海珠区人民政府门户网站发布重要通知&#xff0c;对人工智能大模型应用示范区政策兑现工作&#xff08;第二批&#xff09;&#xff08;大模型专题&#xff09;资金奖励企业名单予以公示。这…...

golang处理时间的包time一次性全面了解

本文旨在对官方time包有个全面学习了解。不钻抠细节&#xff0c;但又有全面了解&#xff0c;重点介绍常用的内容&#xff0c;一些低频的可能这辈子可能都用不上。主打一个花最少时间办最大事。 Duration对象: 两个time实例经过的时间,以长度为int64的纳秒来计数。 常见的durati…...