STM32printf重定向到串口含armcc和gcc两种方案

在STM32上实现printf函数的串口重定向

无论是在MDK(Keil)还是GCC编译器环境中,通过重写底层字符输出函数,使得标准库中的printf系列函数可以通过UART串口发送数据到PC端进行查看和分析。

核心思想
  • 重写或实现底层字符输出函数,使printf函数能够通过UART发送数据。
  • 针对不同的编译器环境,采取不同的实现方式。
MDK(Keil)环境下
  • 实现fputc()__io_putchar()函数:
    int fputc(int ch, FILE *f) {
        HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
  • 如果使用ARM Compiler 6(基于LLVM),建议优先使用__io_putchar()
GCC环境下
  • 实现_write()函数来捕捉write()调用:
    int _write(int fd, char *ptr, int len) {
        HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
        return len;
    }
    
兼容性处理

为提高代码复用性和可维护性,可以使用预处理器宏定义来统一代码风格,避免重复编写两个版本的重定向函数:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE {
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

#ifdef __GNUC__
int _write(int fd, char *ptr, int len) {
    HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
    return len;
}
#endif

切换编译器即可自动适配对应函数。

支持浮点数打印

  • 如果需要支持浮点数格式化:你需要在Makefile中添加特定的链接选项来确保浮点数的支持。这是因为默认情况下,为了节省空间,某些嵌入式C库可能会禁用浮点数支持。要启用它,你需要在Makefile中添加以下内容:
    LDFLAGS += -lc -lrdimon -u _printf_float
    
    这些选项的作用是:
    • -lc:链接标准C库。
    • -lrdimon:链接一个提供I/O支持的库,这对于一些运行时环境是必要的。
    • -u _printf_float:强制链接器包含浮点数处理相关的符号,使得printf能够处理浮点数格式化字符串。
### 关于 Transformer 模型可视化的工具和方法 #### Sankey Diagrams 应用于 Transformer 解释 Sankey 图是一种特定类型的流程图,它通过宽度变化的箭头表示流量的变化。在解释 Transformer 工作原理方面,这种方法被证明非常有效[^1]。这些图表能够清晰展示信息是如何在网络层间流动以及转换的。 #### 超越注意力机制可视化的方法 除了传统的基于注意力权重矩阵的热力图外,还有其他更先进的技术可以用来增强对 Transformer 行为的理解。例如,一些研究探索了利用特征重要性评分和其他形式的数据驱动指标来提供更加全面视角的方式[^2]。 #### 开源项目支持多种平台上的实现 对于希望在一个具体操作系统上运行此类功能的研究人员来说,存在专门为 Windows 设计并集成最新研究成果(如 Swin-Transformer 结合 GradCAM 技术)的开源解决方案可供选择[^5]。这不仅简化了安装配置的过程,还允许用户直接在其熟悉的环境中测试不同的参数设置效果。 #### CVPR 提出的新颖方案 另外,在计算机视觉领域内也有创新性的贡献,比如 FAIR 发布的一种新型 Transformer 可视化手段能够在多类别情况下给出精确的结果反馈[^4]。这种进步有助于研究人员进一步挖掘图像分类任务背后隐藏的信息模式。 ```python import torch from transformers import AutoModelForSequenceClassification, AutoTokenizer from captum.attr import LayerConductance, TokenReferenceBase model_name = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name) def analyze_transformer(input_text): inputs = tokenizer(input_text, return_tensors="pt") layer_conductance = LayerConductance( model, model.distilbert.transformer.layer[-1] ) attributions = layer_conductance.attribute(inputs['input_ids'], target=1) print(attributions.sum(dim=-1)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值