回归-嵌入式与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++编译器