小柴带你学AutoSar系列一、基础知识篇(4)编译

小柴带你学AutoSar总目录icon-default.png?t=N7T8https://blog.csdn.net/qianshang52013/article/details/138140235?spm=1001.2014.3001.5501

Flechazoicon-default.png?t=N7T8https://www.zhihu.com/people/jiu_sheng

编译真的很重要!了解一下机器是如何工作的吧。当然啦!通过学习这篇文章还可以学习制作库文件哦!隐藏你的源码,依然可以调用函数。这样代码发给别人就不怕源码暴漏哦!🍔

实际项目中确实也会接触到这块,所以想拿出来入门一下。

目录

GCC编译

1. 预处理阶段(Preprocessing)

2. 编译阶段(Compilation)

3. 汇编阶段(Assembly)

4. 链接阶段(Linking)

示例

GHS编译

1. 源代码准备

2. 预处理阶段

3. 编译阶段

4. 汇编阶段

5. 链接阶段

总结

静态库.lib

1.制作静态库

2.使用静态库

1. 创建或打开你的C项目

2. 将静态库文件添加到项目

3. 添加库文件路径和库文件名到项目设置


GCC编译

GCC 编译器是一个开源的编译器套件,用于编译多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 等。它是一个功能强大且灵活的编译器,支持多种平台和架构。

1. 预处理阶段(Preprocessing)

在预处理阶段,GCC 将源代码中的预处理指令(以 # 开头的指令,如 #include#define)处理成纯 C 代码。预处理器会将头文件包含到源文件中,执行宏替换等操作。

生成的文件:通常,预处理后的文件会以 .i 扩展名保存,如 source.i

2. 编译阶段(Compilation)

编译阶段将预处理后的源文件翻译成汇编语言。GCC 使用的是内置的 C 编译器(称为 cc1),它将 C 代码转换成目标机器的汇编代码。

生成的文件:通常,编译后的文件会以 .s 扩展名保存,如 source.s

3. 汇编阶段(Assembly)

在汇编阶段,汇编器将汇编代码转换成机器码指令,生成目标文件。这些目标文件包含了二进制代码和相关的元数据。

生成的文件:通常,汇编后的文件会以 .o 扩展名保存,如 source.o

4. 链接阶段(Linking)

链接阶段将所有的目标文件(包括程序的主文件和所有的库文件)链接在一起,生成最终的可执行文件。链接器(ld)负责解析符号引用、符号重定位等任务,将各个目标文件中的代码和数据段组合成一个可执行文件。

生成的文件:最终生成的可执行文件通常没有扩展名,如 a.out

示例

假设有一个 C 源文件 hello.c

#include <stdio.h>

int main() {
   printf("Hello, world!\n");
   return 0;
}

通过 GCC 编译该文件时,可以执行以下命令:

gcc -o hello hello.c

这个命令会依次执行预处理、编译、汇编和链接四个阶段,并生成最终的可执行文件 hello

  • hello.i:预处理后的文件。

  • hello.s:编译后的汇编文件。

  • hello.o:汇编后的目标文件。

  • hello:最终的可执行文件。

这就是 GCC 编译器的工作过程以及每个阶段生成的文件。

GHS编译

RH850 是一种用于嵌入式系统的微控制器(MCU),通常用 Green Hills Software(GHS)编译工具进行编译和链接。GHS 工具链包含编译器、汇编器、链接器等,支持各种目标平台和架构。编译过程包括使用链接脚本,这是生成嵌入式系统二进制文件的关键步骤。下面是一个典型的 RH850 使用 GHS 编译器的编译过程,详细介绍了每个阶段及其生成的文件,特别是链接器脚本的作用。

1. 源代码准备

假设有一个简单的 C 源文件 main.c

#include <stdio.h>

void main(void) {
   printf("Hello, RH850!\n");
}

2. 预处理阶段

预处理器将处理所有的预处理指令,例如 #include#define,生成一个预处理后的文件。

命令

ccrh850 -E main.c -o main.i

生成的文件

  • main.i:预处理后的文件。

3. 编译阶段

编译器将预处理后的 C 代码转换为汇编代码。

命令

ccrh850 -S main.i -o main.s

生成的文件

  • main.s:汇编代码文件。

4. 汇编阶段

汇编器将汇编代码转换为机器代码,生成目标文件。

命令

asrh850 main.s -o main.o

生成的文件

  • main.o:目标文件(对象文件)。

5. 链接阶段

链接器将多个目标文件和库文件链接在一起,生成可执行文件。链接器脚本在这个阶段非常重要,用于指定代码和数据段在内存中的布局。

链接器脚本(linker script)

一个典型的链接器脚本可能如下所示(linker.ld):

SECTIONS
{
  .text : {
       *(.text)
  }
  .data : {
       *(.data)
  }
  .bss : {
       *(.bss)
  }
}

这个脚本指定了 .text 段(代码段)、.data 段(数据段)和 .bss 段(未初始化数据段)的布局。

命令

librh850 main.o -T linker.ld -o main.elf

生成的文件

  • main.elf:最终的可执行文件(ELF 格式)。

总结

  • 预处理:

    ccrh850 -E main.c -o main.i
    • 生成预处理后的文件 main.i

  • 编译:

    ccrh850 -S main.i -o main.s
    • 生成汇编代码文件 main.s

  • 汇编:

    asrh850 main.s -o main.o
    • 生成目标文件 main.o

  • 链接:

    librh850 main.o -T linker.ld -o main.elf
    • 生成最终的可执行文件 main.elf,使用链接器脚本 linker.ld 指定内存布局。

每个阶段都生成特定的中间文件和最终的可执行文件,链接器脚本在链接阶段至关重要,它定义了程序的内存布局,使得生成的二进制文件能够正确地运行在目标硬件上。

静态库.lib

通过静态库,开发者可以隐藏实现细节,仅暴露接口(头文件)。这增加了代码的安全性,并使得接口的更改不会影响到使用该库的代码,只要接口保持不变。

真的太好玩啦!

1.制作静态库

  • VS创建一个新项目

  • 打印一些信息,并在头文件声明这个函数

  • 生成lib

看到他啦

2.使用静态库

1. 创建或打开你的C项目

首先,确保你已经在Visual Studio中创建了一个C项目或打开了现有的C项目。

2. 将静态库文件添加到项目

假设你的静态库文件是 StaticLib1.lib

  1. StaticLib1.lib 文件拷贝到你的项目目录中,通常放在一个特定的文件夹中,比如 libs 文件夹。我懒哈哈!随便放啦

3. 添加库文件路径和库文件名到项目设置

  1. 打开项目属性

    • 在解决方案资源管理器中,右键点击你的项目名称,选择“属性”(Properties)。

  2. 配置包含目录

    • 在项目属性窗口中,导航到 Configuration Properties -> C/C++ -> General

    • Additional Include Directories 字段中,添加你的头文件目录的路径。如果你的头文件在 include 文件夹中,输入相对路径 include 或者绝对路径。

  3. 配置库目录

    • 在项目属性窗口中,导航到 Configuration Properties -> Linker -> General

    • Additional Library Directories 字段中,添加你的静态库目录的路径。如果你的库文件在 libs 文件夹中,输入相对路径 libs 或者绝对路径。

  4. 添加库文件

    • 在项目属性窗口中,导航到 Configuration Properties -> Linker -> Input

    • Additional Dependencies 字段中,添加你的库文件名称 mylibrary.lib。如果有多个库文件,用分号分隔。

最后就可以调用静态库里的函数啦!同时又看不到函数的具体实现。是不是贼有意思呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在AUTOSAR系统中,可以通过IO驱动来控制外围设备。其中,控制LED灯是一个常见的需求。 实现方法如下: 首先,在AUTOSAR中,需要定义一个Port模块,用于控制IO口。Port模块负责将应用程序中的请求转化为一个数据结构,然后将其传递给驱动层。在驱动层中,需要连接到硬件设备,执行具体的操作。这里以Infineon TriCore AURIX MCU为例,控制LED需要使用Port模块和GPT模块: 1. 定义并初始化Port模块: ``` Port_Init(&Port_ConfigSet); // 初始化Port ``` 2. 配置对应的GPIO口和方向: ``` Port_SetPinDirection(LED_PORT, LED_PIN, PORT_PIN_OUT); // 配置LED口方向 ``` 3. 配置GPT模块,并设置定时器的周期: ``` Gpt_Init(&Gpt_ConfigSet); // 初始化GPT Gpt_StartTimer(LED_TIMER, LED_INTERVAL); // 开始定时器 ``` 4. 在定时器的中断处理函数中,进行LED的亮灭控制: ``` void LED_ISR(void){ static uint8_t led_status = 0; // 控制LED状态的变量 if(led_status == 0){ Port_SetPinLevel(LED_PORT, LED_PIN, PORT_PIN_HIGH); // LED置高 led_status = 1; }else{ Port_SetPinLevel(LED_PORT, LED_PIN, PORT_PIN_LOW); // LED置低 led_status = 0; } } ``` 具体实现中,需要注意以下几点: 1. 在配置IO口时,需要确保与硬件连接的引脚号和标号一致。 2. 定时器的间隔时间需要根据具体的硬件环境进行确定。 3. 在实现LED控制时,需要注意保持Port和GPT模块在线程中运行,并配置合适的中断处理函数。 通过以上步骤,可以实现一个基本的LED控制功能。在实际应用中,可以根据需要进行参数调整和扩展功能。 ### 回答2: autosar是一种面向车联网系统的通信标准,用于提高汽车电子系统之间的互操作性和可靠性,支持多种硬件平台和软件模块的灵活组合。在autosar中,各种功能被定义为软件组件,可以跨越不同的ECU进行交互,形成一个分布式的系统。在实际开发过程中,我们常常需要使用autosar进行一些基本操作,如闪烁一颗led灯。 首先,闪烁LED灯是一个基本的硬件操作,它需要通过读写寄存器来控制硬件的状态。在autosar中,我们使用driver模块来管理硬件和软件之间的通信,例如GPIO模块控制外设IO口状态。由于autosar是一种通用的标准,它的驱动模块是可移植的,可以在不同的硬件平台上使用。因此,我们可以将所有和硬件有关的函数封装在driver模块中,以便于移植和替换。 其次,对于闪烁LED灯这种动作,我们可以使用task任务来进行控制。在autosar中,task是指按照一定规律定时执行的函数,例如周期性地更新系统状态。我们可以在autosar中定义一个闪烁LED灯的任务,设置一定的时间间隔,并将其添加到scheduler调度器中。调度器会安排任务的执行顺序,并在适当的时候调用任务函数。 最后,autosar还支持事件和状态机的编程模式,这可以帮助我们更好地管理系统状态和控制流程。例如,在闪烁LED灯的过程中,可能需要处理一些中断或者响应用户的命令操作。我们可以使用事件或状态机模块来定义状态和事件,以便灵活控制系统行为。 总之,在autosar中,闪烁LED灯是一个简单而基本的硬件操作,但从中我们可以看到autosar的通用性和灵活性,以及如何使用autosar来管理和控制整个车联网系统。 ### 回答3: Autosar(汽车电子开放系统架构)是一种汽车电子的标准化平台,它的发展改善了汽车电子系统的可靠性、可重用性和效率性,并使得不同车型之间的硬件和软件可以互相兼容和互换。 在Autosar中,我们可以使用通用的软件架构来开发各种功能,包括闪烁一颗LED灯。实现这个功能需要两个模块:GPIO(通用输入/输出)驱动程序和定时器中断程序。 GPIO驱动程序用于控制LED灯的状态,也就是控制LED灯的亮灭。我们需要将一个GPIO口配置为输出模式,然后通过读取/写入GPIO寄存器来控制LED灯的状态。 除此之外,我们还需要使用定时器中断程序来控制LED灯的闪烁频率。我们可以在定时器中断程序中设置一个定时器,当定时器溢出时,我们就可以改变LED灯的状态从而实现闪烁效果。 具体步骤如下: 1. 配置GPIO口为输出模式,并将LED灯初始状态设置为关闭。 2. 配置定时器,设置定时器中断时间(可以根据需要调整闪烁频率)。 3. 实现定时器中断程序,在定时器溢出时改变LED灯的状态。 4. 启动定时器并等待定时器中断事件的发生。 5. 在定时器中断事件发生时改变LED灯的状态,然后等待下一次定时器中断事件的发生。 总之,Autosar使得开发嵌入式系统变得更加简单和高效。使用通用的软件架构可以快速地实现各种功能。当我们掌握了GPIO驱动程序和定时器中断程序的原理,就可以方便地实现闪烁LED灯的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlechazoCLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值