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

回归-嵌入式与c概念

回归-嵌入式与c概念


本节的起源来自于一个嵌入式中的函数

#ifdef GD_ECLIPSE_GCC
/* retarget the C library printf function to the USART, in Eclipse GCC environment */
int __io_putchar(int ch)
{usart_data_transmit(EVAL_COM0, (uint8_t)ch);while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));return ch;
}
#else
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{usart_data_transmit(USART0, (uint8_t)ch);while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));return ch;
}
#endif /* GD_ECLIPSE_GCC */

这不是一个普通的函数,它来自于标准c库
什么是标准c库呢?
c语言本质是语法,它定义了变量、循环、条件语句等基本结构,没有官方设计的函数
而标准c库其实就是C语言的扩展:是一组预定义的函数、常量和头文件的集合,它提供了基本的输入/输出、内存管理、字符串处理、数学计算等功能
当c语言(语法)结合标准c库,他俩就组成了C语言标准(如C89, C99, C11),也就是说c语言标准同时定义了语言语法和标准库

c语言与c++的关系:
1,C++包含了整个C标准库:C++兼容C,所以C标准库的所有功能在C++中都可用
2,C++有自己的标准库:除了C标准库外,C++还有自己的标准库(STL),提供了更高级的功能(如容器、算法、流等)
3,在C++中使用C标准库:通常通过, 等头文件(注意前缀’c’和没有.h)

然而在嵌入式领域,标准C库通常是裁剪过的版本:
1,由于嵌入式系统资源受限,完整的标准c库可能太大,所以裁剪
2,某些功能(如文件操作)在没有操作系统的嵌入式系统中没有意义
3,需要适配:像printf()这样的函数需要适配到特定硬件(如您项目中重定向到UART)

回到了前面提到的函数(printf重定向),为什么要将printf重定向呢?
因为printf来自于标准c库,所以printf是标准输出,默认连接到屏幕

在标准C语言中,有三个预定义的"标准流":
标准输入 (stdin) - 通常是键盘
标准输出 (stdout) - 通常是屏幕/控制台
标准错误 (stderr) - 也通常是屏幕/控制台,但用于错误消息

在桌面计算机上:
当你使用printf()函数时,输出会显示在命令行窗口或IDE的控制台窗口中。这是因为标准输出默认连接到显示器。

但在嵌入式系统中:
没有显示器或控制台窗口
没有操作系统来管理这些标准流
标准C库的printf()函数没有默认的输出目的地
所以,如果不做任何处理,printf()在嵌入式系统中实际上不会产生任何输出。

这时我们就可以将printf的输出目的地重定向到嵌入式的串口中
那为什么我们在上面的函数中修改的是fputc()和__io_putchar()而不是直接修改printf呢?
因为printf实际上就是调用fputc实现功能的,在标准C库实现中,printf()→vfprintf()→fputc()形成一个调用链
通过重写底层的fputc()函数,我们改变了字符的最终输出目的地,而不需要修改printf()本身

上面的代码中,我们使用了一个宏GD_ECLIPSE_GCC,去决定重定向fputc()还是__io_putchar()

基本概念
编程语言:用于编写程序的形式化语言,如C、C++、Python等。它定义了语法规则和语义,让人类能够编写计算机可以理解的指令。
编辑器:用于编写和修改代码的软件工具。VSCode就是一个编辑器,它提供代码高亮、自动完成等功能,但本身不负责编译代码。
编译器:将高级编程语言(如C/C++)转换为机器代码的程序。例如,GCC是一个C/C++编译器,它把C代码转换为处理器能理解的机器码。
开发平台:指特定的硬件和软件环境,如Windows、Linux或特定的嵌入式平台(如您的GD32F470)。

集成开发环境(IDE)
集成开发环境(IDE)是将编辑器、编译器、调试器等工具集成在一起的软件套件,提供一站式开发体验。
Eclipse:开源IDE,通过插件支持多种语言
Keil MDK:专为ARM微控制器设计的IDE
VSCode:严格来说是编辑器,但通过插件可以变成类似IDE的环境

插件系统
插件是扩展软件功能的附加组件。例如:
VSCode可以通过安装C/C++插件来支持C语言开发
Eclipse可以通过安装CDT插件支持C/C++开发

编译器相关概念
GNU编译器集合(GCC):开源编译器套件,支持多种语言(C、C++、Fortran等)和多种处理器架构。
编译器工具链:完成从源代码到可执行文件的一系列工具,包括:
预处理器:处理#include、#define等指令
编译器:将C/C++代码转换为汇编代码
汇编器:将汇编代码转换为目标文件
链接器:将多个目标文件链接成可执行文件
C/C++编译器:专门用于编译C和C++语言的编译器,如GCC中的gcc©和g++(C++)。

Eclipse IDE配合GCC是一种常见的嵌入式开发环境组合:
Eclipse IDE:一个开源的集成开发环境,可以通过插件支持多种编程语言和开发平台
GCC:GNU编译器集合,一套开源的编译器工具链,包括C/C++编译器

http://www.xdnf.cn/news/1004023.html

相关文章:

  • docker 单机部署redis集群(一)
  • 股指期货入门基础知识
  • 【笔记】Blockchain
  • 微机原理与接口技术,期末习题(一)
  • 突破微小目标检测瓶颈:智能无人机在蓝莓产量估算中的解决方案
  • Smart Form Adobe form
  • 华为云Flexus+DeepSeek征文|基于华为云一键部署的 Dify LLM 应用平台三种方案横评:单机、知识库增强、高可用容器化比较
  • DAY 52 神经网络调参指南
  • yolov5环境配置
  • linux共享内存解析
  • 完整 Bootloader 框架
  • 智能制造:解读41页中小工厂数字化新路径【附全文阅读】
  • CoSchedule Headline Analyzer:分析标题情感强度与可读性
  • 在 Flask 或 Tornado 中返回渲染后的页面内容
  • 爱普生SG5032EEN差分晶体振荡器的特点
  • Element UI 表格el-table宽度不能自适应的问题解决方法
  • 深度学习编译器
  • Docker搭建2FAuth服务
  • 数据结构 (树) 学习 2025年6月12日12:59:39
  • Vue 生命周期
  • 铸铁平台的制造工艺复杂而精细
  • 音视频之H.264/AVC编码器原理
  • 头歌之动手学人工智能-Pytorch 之torch.nn进阶
  • 算法导论第二章:递归与分治的数学艺术
  • 【MV】为什么需要DeepSeek 的分析: AI 替代编舞师
  • Docker 常用命令大全
  • 基于LangChain构建一个RAG多轮对话问答应用
  • LeetCode 868.二进制间距
  • 第三十八课:实战案例-飞鸟和飞机的识别
  • EtherCAT主站转Profinet网关与禾川伺服驱动器X4E快速通讯案例