历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2021年09月16日 | Freestanding C与交叉编译器的生成原理分析

2021-09-16 来源:eefocus

0 问题由来

以前也用过C51写过简单的裸机程序,但是并没有认真的考虑过其与Linux环境下一般C语言程序的不同,只是想当然地认为C是跨平台的语言,并没有考虑过C语言的标准问题。


今天在编译GCC交叉编译器时,遇到了种种问题,不得不重新考虑C语言的实现标准,否则很难清晰的了解交叉编译器的编译过程。


1 C编译器的两种实现要求

C语言标准的正式文档中明确提出了C编译器的两种实现标准:


1.1 conforming freestanding implementation

所谓的Freestanding,C编译器只需提供C语言语句的编译,外加



等基本的类型与数值范围定义头文件。


可以看出,在这种级别的编译器下写程序时,基本的printf都是不能够直接使用的。

此种实现,主要用于裸机开发,比如OS开发,bootloader,以及C库本身的开发。


1.2 conforming hosted implementation

这是一种更加全面的实现,除了包含Freestanding要求的功能外,必须包含完整的标准C库实现。这也是大多数应用程序员能接触到的环境。由于中的输入输出函数的实现需要OS系统调用的支持,Hosted编译器都是依赖于具体的操作系统而存在。


1.3 小结

可以看出,Hosted是比Freestanding更加全面的C实现要求,Hosted本身包含了Freestanding。例如Hosted的GCC实现,提供了-freestanding参数来作为Freestanding降级使用。


gcc -ffreestanding


C语言这种把语言本身和库独立对待的方式,使得它能够适应更广泛的开发环境。从单片机裸机开发到大型数据库系统,C语言的身影无处不在。


2 C语言的两种执行环境

与C语言的两种实现等级相对应,C语言的程序的执行环境也有两种,这里直接贴出C语言标准原文。


5.1.2 Execution environments

Tw o execution environments are defined: freestanding and hosted. In both cases,

program startup occurs when a designated C function is called by the execution

environment. All objects with static storage duration shall be initialized (set to their

initial values) before program startup. The manner and timing of such initialization are

otherwise unspecified. Program termination returns control to the execution

environment.


在Hosted环境下,C程序入口点必须是命名为main的函数,而且其函数原型必须符合标准。


而在Freestanding环境下,C程序的入口点没有指定的名称,由程序员自行决定。


3 C语言交叉编译器制作过程原理分析

3.1 为什么需要单独生成不同目标平台的编译器

理论上一个编译器可以通过命令行参数来编译生成各种不同平台的可执行程序。例如:


mycompiler -platform=arm-linux 1.c  # 生成可以运行在ARM平台上的Linux程序

mycompiler -platform=mips-linux 1.c # 生成可以运行在MIPS平台的Linux程序

mycompiler -platform=i386-linux 1.c # 生成可以运行在Intel X86平台的Linux程序


然而实际上,这种做法的代价是十分巨大的,因为


不同平台差异巨大,代码转换逻辑完全不同,在一个可执行程序中包含所有平台转换代码,导致编译器程序本身体积巨大


不同平台的C库实现严重依赖于平台,在一个库中包含所有平台的实现代码,造成C库体积巨大,管理混乱。


汇编器、连接器也存在同样的问题

所以在现实中,虽然GCC,GLIBC,binutils这样的项目本身能够支持很多的软硬件平台,但是支持方式是通过配置来进行选择性的编译部分源代码来生成针对具体平台二进制工具。


3.2 交叉编译器生成步骤原理分析

理论上一个C交叉编译器的生成非常简单:

(0)编译生成交叉汇编器和交叉链接器

之所以会存在这个步骤是因为,像GCC这样的C编译器本身只负责把C语言代码编译为汇编代码。把汇编代码转换为二进制机器码,以及把二进制对象文件链接为可执行文件的功能需要其他程序来实现。对Unix世界来说,提供汇编链接功能的就是著名的binutils包。


gcc编译器在生成时,需要使用binutils来测试相关功能,以动态生成各种配置与代码。所以,在编译GCC之前,必须要有可用的binutils。


对于汇编程序员来说,binutils已经提供了一个完整的汇编开发环境,完全可以停留这里享受汇编程序设计的美好。

然而,对于C程序员来说,这才刚刚开始。


(1)编译生成Freestanding的交叉编译器;

这个交叉编译器完全可以用来编译裸机C程序,编译OS,编译BootLoader,对于嵌入式底层开发者来说,这样一个编译器就足够了,完全可以到此为止。


然而对于一个在OS环境下的应用开发者来说,就需要一个功能更完整的编译器,以及完整的标准C库,这就需要进入步骤(2)。


(2)用刚生成的交叉编译器编译生成标准C库;

Freestanding编译器可以用来编译标准C库,这个是很重要的。


此时虽然编译器和C库都有了,却存在两个缺陷:


编译器可执行文件本身并不知道对应的C库的路径,所以编译程序时就需要额外的命令行参数来提供这些信息。


编译器不能提供Hosted类型C程序初始化环境,因为Hosted环境的建立需要标准C库的支持,而Freestanding编译器在生成时还没有可用的标准C库。这就是一个“鸡生蛋蛋生鸡”的问题了。


为了解决上述问题,需要额外的一个步骤:

(3)重新编译生成Hosted的交叉编译器。

这次编译时,可以有(2)生成的标准C库的支持了,所以可以产生出一个完整的Hosted交叉编译器了。

推荐阅读

史海拾趣

Hirel Systems Ltd公司的发展小趣事

对于四通道红外遥控器接收器电路,网友可能提出的问题涉及多个方面,以下是一些可能的问题及回答:

一、技术原理类问题

  1. 问题:四通道红外遥控器接收器电路是如何工作的?
    回答:四通道红外遥控器接收器电路主要通过光电二极管接收遥控器发射的红外信号,经过放大、解码等处理,最终识别出不同的按键指令,并控制相应的设备执行操作。具体来说,当遥控器发射出特定频率的红外光信号时,光电二极管将光信号转换为电信号,经过放大电路放大后,送入解码器进行解码,解码器根据解码结果输出相应的控制信号,控制设备执行相应的操作。

  2. 问题:接收器电路中的关键元件有哪些?
    回答:接收器电路中的关键元件包括光电二极管(用于接收红外光信号)、放大器(用于放大微弱的电信号)、解码器(用于解码信号并输出控制信号)以及可能的滤波电路(用于滤除噪声干扰)等。这些元件共同协作,实现红外信号的接收和处理。

二、故障排查与维修类问题

  1. 问题:接收器无法接收到信号,可能的原因有哪些?
    回答:接收器无法接收到信号的可能原因包括:

    • 光电二极管损坏或老化,导致无法有效接收红外光信号。
    • 接收器电路中的连接线松动或接触不良,导致信号传输中断。
    • 放大器或解码器故障,无法对接收到的信号进行正常放大或解码。
    • 接收器受到外界干扰(如光线、电磁干扰等),影响信号的接收和处理。

    针对以上问题,可以逐一检查光电二极管、连接线、放大器、解码器等元件的状态,并采取相应的维修或更换措施。同时,注意避免将接收器放置在易受干扰的环境中。

  2. 问题:如何排查和解决接收器响应延迟或误动作的问题?
    回答:排查和解决接收器响应延迟或误动作的问题可以从以下几个方面入手:

    • 检查遥控器发射的红外信号是否正常,包括信号的频率、强度等是否符合接收器的要求。
    • 检查接收器电路中的滤波电路是否设置得当,以避免噪声干扰导致误动作。
    • 检查解码器的解码逻辑是否正确,以确保能够准确识别出遥控器发射的指令。
    • 如果以上均正常,可以考虑检查接收器的电源系统是否稳定,以及是否有其他电路元件故障导致的影响。

    针对具体问题,可以采取相应的调整或维修措施来解决。

三、应用与拓展类问题

  1. 问题:四通道红外遥控器接收器电路可以应用于哪些场景?
    回答:四通道红外遥控器接收器电路可以广泛应用于各种需要遥控控制的设备中,如智能家居系统(如电视、空调、灯光等的遥控控制)、工业自动化控制(如电机、阀门等的远程控制)、安防监控系统(如摄像头、报警器的遥控操作)等。通过扩展通道数量和增加控制逻辑,还可以实现更复杂的控制功能。

  2. 问题:如何对四通道红外遥控器接收器电路进行升级或改造?
    回答:对四通道红外遥控器接收器电路进行升级或改造时,可以考虑以下几个方面:

    • 升级光电二极管或放大器等关键元件的性能,以提高接收灵敏度和信号处理能力。
    • 增加滤波电路或改进解码算法,以减少噪声干扰和提高解码准确性。
    • 扩展通道数量或增加控制逻辑,以实现更复杂的控制功能。
    • 引入无线通信模块(如Wi-Fi、蓝牙等),将红外遥控与无线控制相结合,提高控制的灵活性和便捷性。

    在进行升级或改造时,需要根据具体的应用需求和技术条件进行选择和设计。

Denyo Europa Gmbh公司的发展小趣事

随着技术的成熟,Denyo Europa Gmbh公司开始将目光投向国际市场。公司利用自身的技术优势,结合对目标市场的深入调研,制定了一系列市场拓展策略。通过与当地合作伙伴的紧密合作,公司成功将产品打入多个国家和地区,实现了业务的全球化布局。这一过程中,公司不仅积累了宝贵的国际市场经验,也为公司的持续发展奠定了坚实基础。

Daykin Electric Corp公司的发展小趣事

1969年,大金成功开发了一台室外机连接多台室内机的家用多联系统空调。这一创新产品不仅提高了空调的能效比,还满足了大型住宅和办公场所的多样化需求。多联系统空调的诞生,使得大金在家用中央空调领域取得了领先地位。

D1 International Inc公司的发展小趣事

作为一家有社会责任感的企业,D1 International Inc公司始终关注环境保护和可持续发展。公司在生产过程中采取环保措施,减少废弃物排放,同时积极推广绿色电子产品。此外,D1 International Inc公司还积极参与社会公益活动,回馈社会,为构建和谐社会贡献自己的力量。

Excelsys公司的发展小趣事

在市场拓展方面,Excelsys公司采取了多元化的战略。除了深耕国内市场外,公司还积极开拓国际市场,与全球多家知名企业建立了长期稳定的合作关系。这些合作伙伴不仅为Excelsys提供了广阔的市场空间,还带来了先进的技术和管理经验,推动了公司的快速发展。

BLACK&DECKER公司的发展小趣事

BLACK&DECKER公司的历史可以追溯到1910年,由Alonzo G. Decker和Duncan S. Black在美国马里兰州巴尔的摩共同创立。两位创始人的初始投资来自于Black先生卖掉他的二手车所得的600美元,再加上1200美元的贷款。公司起初主要生产牛奶瓶装盖机、棉花采集机、糖果浸包机等工业用设备。然而,真正让BLACK&DECKER崭露头角的,是1916年他们发明的现代手枪钻原型。这一创新产品解决了当时德国电动工具笨重、难以操控的问题,为电动工具行业带来了革命性的变革。

问答坊 | AI 解惑

程控音频

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 我们做程控音频放大器! 请求帮助!!!  …

查看全部问答>

汽车离合器电子控制研究

摘要:通过对传统离合器操纵系统加以改进,将机械式人工操纵过程由电子控制的液压系统来完成,实现离合器的自动化控 制。本文从分析离合器工作原理方面入手,结合电子与液压控制技术的特点,将汽车行驶过程中的所有工况分解为起步、换挡、点 刹、制动4 ...…

查看全部问答>

请教一个zebra的问题,

请问一下下面的宏定义应该怎么理解?它的作用是什么? #define DEFUN(funcname, cmdname, cmdstr, helpstr) \\   int funcname (struct cmd_element *, struct vty *, int, char **); \\   struct cmd_element cmdname = \\ ...…

查看全部问答>

VC++1.52使用问题?

我安装了,vc1.52但是没有帮助文档,现在程序编译遇到问题。 大家有没有关于vc1.52的学习资料或文档?提供连接也可以。 谢谢!…

查看全部问答>

XP下驱动开发 的初级问题

要做一个文件过滤的东西,决定用驱动做. 可是网上的资料不全,折磨了一星期, 连最简单的sys都没弄出来过。 那个大侠能给个例子啊?谢谢 xp & 2K DDK…

查看全部问答>

红外解码 LPC214X

在一个教程里看到了如下的红外代码结构   不解的是表示0 的1.125ms的周期是如何换算成 0x109c0的?  表示1 的2.25ms的周期是如何换算成 0x109c0的?这个和系统时钟有关系么? 请高手赐教! 谢谢!以脉宽为0.565ms,间隔0.56ms, 周期为1.1 ...…

查看全部问答>

CPLD与CPU通信问题

需要用Altera的一款CPLD来进行IO扩展与CPU进行通信,CPLD内部逻辑比较简单,基本是组合逻辑,现在的问题是怎样确定CPU和CPLD的最快通信时间?CPU的地址线、数据线、控制线之间的延时怎样确定?说得具体一点:比如CPU的写控制线WR上升沿的时候,往CP ...…

查看全部问答>

请教以下warming所表达的意思

我的代码在完成了编译之后出现了一种warming,内容如下: Warning: LATCH primitive  \"ether_mac:ether_mac|ethermac_recv:recv|fsm_ram_wr_ns.RECV_PRENUM_7327\" is permanently enabled 其中引号内的东西除了最后的“_7327”以外, ...…

查看全部问答>

请教一下!

请教一下!LM358双运放如何改成单电源供电…?…

查看全部问答>

监控人都想知道的东西

很多朋友都弄不清监控摄像机不同镜头的可视距离与监控角度是怎么样的,下图很清楚的表达了闭路电视监控系统中摄像机的镜头的可监控角度与监控距离,供大家参考。 一、常见镜头视角角度焦距规格角度2.1 mm小镜头1/3150°2.5mm小镜头1/3130°2.8mm ...…

查看全部问答>