AUTOSAR工程通过脚本 Vs. 在Tasking IDE中编译

目录

一、背景

二、Tasking IDE工程导入Guide

1. 新建空白工程

         2. 导入待编译代码

3. 进行编译配置

1)Compiler

2)Assembler

3)Linker

三、编译速度:脚本 Vs IDE


一、背景

    手头上的AUTOSAR工程一直是通过scons脚本调用本地安装的Tasking编译器进行编译,完全正常使用;理论上工程导入Tasking IDE编译也不会有什么问题,但导入后build会报上千个错误,一直没解决。仔细研读了脚本中对编译器的配置代码,总结了以下导入Tasking IDE需注意的问题。

二、Tasking IDE工程导入Guide

导入时需要勾选芯片型号相关的配置,此处以英飞凌TC397芯片举例:

1. 新建空白工程

在Tasking IDE中 File -> New -> Tasking Tricore C/C++ Project -> Empty Project -> Infineon TriCore 1 Family -> AURIX 2G Family -> TC39xB -> 取消勾选Add startup files 与 linker script(此处按需选择勾选与否,我的工程自己编辑好了启动文件与链接文件,故此处不需要IDE生成的文件),点击Finish;

2. 导入待编译代码

将待编译的所有代码拷贝至新生成的空白工程路径下,拷贝完成后,右键工程,选择Refresh更新工程代码;

3. 进行编译配置

右键工程 -> Properties -> C/C++ Build -> Settings,这里主要配置三个大模块:Compiler,Assembler,Linker。

1)Compiler

点击C/C++ Compiler,右侧All Options中会出现很多指令,这些指令不可编辑,是基于C/C++ Compiler之下的子选项自动生成的,所以我们需要在子选项中,按照脚本中的编译配置进行设置。此处只详细说明两个容易被忽略的配置:Preprocessing+Include Paths,其他配置按照脚本配置即可:

Preprocessing:配置宏。检查脚本,若其中有-D_xxx则为宏定义,需要在Defined symbols中新建“_xxx”,注意,不要把-D加进来,-D只是宏定义的标识符;

Include Paths:所有头文件的路径,可以使用脚本自动提取工程目录下所有的路径,再按照.cproject中的xml格式将所有路径都添加至.cproject文件中,如下示例代码:

①提取路径:

 ## The following codes are to extract paths under the project repository.
import os
from pathlib import Path

def get_all_dirs(root_path, exclude_dirs=None, relative=False):
    root = Path(root_path).resolve()
    dir_list = []

    exclude = set(exclude_dirs) if exclude_dirs else set()

    for dirpath, dirnames, _ in os.walk(root):
        dirnames[:] = [d for d in dirnames if d not in exclude]
        current_dir = Path(dirpath)
        
        if relative:
            dir_str = str(current_dir.relative_to(root))
        else:
            dir_str = str(current_dir)

        dir_str = dir_str.replace('\\', '/')
        dir_list.append(dir_str)
    
    return dir_list

if __name__ == "__main__":
    PROJECT_ROOT = "XXXXXXX" # set it to your project absolute path
    OUTPUT_FILE = "project_paths.txt"
    EXCLUDE_DIRS = ['.git', 'build', 'dist', '__pycache__']

    # to get all the paths
    all_dirs = get_all_dirs(PROJECT_ROOT, exclude_dirs=EXCLUDE_DIRS)

    with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
        for path in all_dirs:
            f.write(f"{path}\n")
    
    print(f"Finish generating!There are alltogether {len(all_dirs)} paths")
    print(f"Output file: {OUTPUT_FILE}")

② 将提取到的路径改编为.cproject中xml的格式:

<listOptionValue buildIn="false" value="&quot; xxxxxxxx&quot;"/>

同样使用脚本,将前一步骤中提取到的project_paths.txt中的所有路径转化成xml格式:

# Convert path to xml 
input_file = "project_paths.txt"
output_file = "output.xml"

with open(input_file, 'r') as f_in, open(output_file, 'w', encoding='utf-8') as f_out:
    for line in f_in:
        clean_path = line.strip()
        if not clean_path:
            continue
    escaped_path = clean_path
    xml_line = f'<listOptionValue buildIn="false" value="&quot;{escaped_path}&quot;"/>\n'
    f_out.write(xml_line)

print(f"Finish converting! Generated file: {output_file}")

③ 将转化好的xml内容,添加至.cproject中:

打开工程目录下的.cproject,该文件包含工程配置,搜索name="Include paths",将上述生成的output.xml中的所有内容,添加至搜索到的下一行,并缩进一级。

④Refresh工程后,重新打开Properties -> C/C++ Build -> Settings -> C/C++ Compiler -> Include Paths,会看到刚才在.cproject中加入的所有路径,此时都被添加至该选项下。

2)Assembler

无特殊注意的,按照脚本配置即可。

3)Linker

Output Format中勾选Generate Intel Hex format File;

Libraries中添加工程中的.a文件,并勾选Link default libraries与Rescan libraries to solve unresolved externals;

Script File中勾选自己的链接文件;

Map File中勾选Generate map file(.map)


以上即为所需的配置操作,笔者在Include Path与Preprocessing的宏添加处卡了很久,Include Path若工程繁大,手动一个个添加非常低效,且容易漏选;Preprocessing的宏也是很容易忽略添加的内容。

三、编译速度:脚本 Vs IDE

通常来讲,脚本编译速度比IDE快很多,笔者的情况脚本只用10min,IDE需要半小时。可以通过

1. 在IDE中Setting->Compilation Speed选项中,勾选Cache generated code to improve the compilation speed;

2. C/C++ Build中Enable parallel build -> Use parallel jobs:24,加快编译速度。

Tasking软件的安装目录下,ctc->doc里,《ctc_user_guide.pdf》Chapter 11详细阐述了对编译时间长短的影响,可参考查阅。

<think>好的,我现在需要帮助用户编译一个AUTOSAR工程。首先,我应该回忆一下AUTOSAR的基本概念和相关工具链。AUTOSAR(Automotive Open System Architecture)是汽车电子系统的开放标准,旨在提高软件的可重用性和可扩展性。用户可能正在开发汽车电子控制单元(ECU)的软件,需要按照AUTOSAR标准进行编译和集成。 接下来,用户的问题是关于如何编译AUTOSAR工程。根据之前的对话历史,用户之前询问了CMake和Bazel的编译速度比较,现在转向具体的AUTOSAR工程编译。这可能意味着用户正在考虑选择合适的构建工具,或者已经决定使用某种工具但需要指导。 首先,我需要确认AUTOSAR工程通常使用的工具链。AUTOSAR开发通常依赖于特定的工具,如Vector的DaVinci工具链、ETAS的ISOLAR、EB tresos等。这些工具通常提供代码生成、配置和管理功能,可能集成到构建流程中。但用户的问题是关于编译,可能需要了解如何将生成的代码与构建系统结合。 用户可能已经生成了AUTOSAR的软件组件(SWCs)的代码,现在需要将它们编译成可执行文件,可能用于ECU的闪存或测试。编译过程可能涉及多个步骤,包括配置编译器选项、处理AUTOSAR特定的文件结构、链接RTE(Runtime Environment)等。 接下来,我需要考虑常见的构建系统在AUTOSAR项目中的应用。根据用户之前的问题,CMake和Bazel是可能的选项,但AUTOSAR工程可能有特定的要求。例如,汽车行业常用的编译器如Green Hills、Tasking、HighTec等,通常需要特定的编译脚本配置。此外,AUTOSAR的模块化结构可能需要严格的依赖管理和构建顺序控制。 可能的挑战包括处理AUTOSAR XML文件(ARXML)生成的代码,集成RTE,确保符合AUTOSAR标准,以及处理多ECU的协同编译。用户可能需要配置不同的构建目标,如不同的ECU配置或硬件平台。 用户可能没有明确说明他们使用的具体工具链或构建环境,因此我需要给出一般性的指导,同时建议根据具体工具进行调整。例如,如果用户使用Vector的工具,可能需要使用其提供的构建脚本;如果使用开源工具链,可能需要手动设置构建系统。 此外,编译AUTOSAR工程可能涉及大量的配置和集成测试,需要确保所有软件组件正确交互,并且符合时序和资源约束。因此,构建系统不仅要处理编译,还要支持自动化测试和持续集成流程。 总结一下,用户的真实需求可能是如何设置一个高效、可靠的构建流程来编译符合AUTOSAR标准的工程,可能需要结合特定的工具链和构建系统,同时考虑汽车行业的特殊要求如安全性(ISO 26262)和实时性。需要分步骤指导用户配置构建环境,处理代码生成后的编译,并确保符合AUTOSAR标准。</think>编译AUTOSAR(Automotive Open System Architecture)工程需要结合其标准化架构和专用工具链。以下是分步指南和关键注意事项: --- ### **1. 环境准备** #### **(1) 安装AUTOSAR工具链** - **常用工具**: - **Vector DaVinci**:用于配置SWC(Software Component)和生成代码。 - **ETAS ISOLAR-A**:支持ARXML设计、RTE生成。 - **EB tresos**:适用于基础软件(BSW)配置。 - **编译器选择**: - 根据目标硬件选择编译器(如Green Hills、Tasking、GCC for Automotive)。 #### **(2) 配置开发环境** - 确保安装对应MCU的SDK(如Infineon Aurix、NXP S32K)。 - 配置工具链路径(如`ARXML_TOOL_PATH`、`COMPILER_PATH`)。 --- ### **2. 工程结构与代码生成** #### **(1) 设计SWC并导出ARXML** - 使用工具(如DaVinci Developer)定义SWC接口、端口和Runnables。 - 导出ARXML描述文件(包含组件拓扑、数据类型等)。 #### **(2) 生成RTE和BSW代码** - 通过工具链生成: - **RTE(Runtime Environment)**:实现SWC间通信。 - **BSW(Basic Software)**:如ECU抽象层、通信协议栈(CAN/LIN)。 - 生成代码目录示例: ```plaintext Project/ ├── Rte/ # RTE接口代码 ├── Bsw/ # 基础软件模块 ├── Swc/ # 手写或生成的SWC代码 └── arxml/ # ARXML配置文件 ``` --- ### **3. 配置构建系统** #### **(1) 选择构建工具** - **AUTOSAR专用工具链集成**: - 部分工具(如Vector DaVinci)内置编译支持,可直接生成可执行文件。 - **通用构建系统(如CMake)**: ```cmake cmake_minimum_required(VERSION 3.10) project(AUTOSAR_Project) # 添加编译器特殊选项(如Tasking) set(CMAKE_C_COMPILER "cctc") add_compile_options(--cpu=TC39x --lsl-file=memory.lsl) # 包含生成的RTE和BSW代码 include_directories(Rte Bsw) add_executable(ecu.elf Swc/main.c Rte/Rte_Generated.c Bsw/Can_Stack.c) ``` #### **(2) 处理依赖关系** - **显式声明头文件依赖**: - 在`CMakeLists.txt`中使用`target_include_directories`指定路径。 - **链接硬件库**: ```cmake target_link_libraries(ecu.elf ${COMPILER_PATH}/lib/cpu_support.a ${MCU_SDK}/drivers/can_lib.a ) ``` --- ### **4. 编译与调试** #### **(1) 编译命令示例** ```bash # 使用CMake生成Ninja构建文件 cmake -G Ninja -B build cd build && ninja # 直接调用工具链编译(如HighTec) hightec-cc -mtc162 -o ecu.elf Swc/*.c Bsw/*.c ``` #### **(2) 调试配置** - 使用 Lauterbach TRACE32 或 iSYSTEM WinIDEA 连接硬件调试器。 - 在IDE中加载生成的ELF文件,设置断点并监控变量。 --- ### **5. 关键注意事项** #### **(1) 内存分配对齐** - 确保`.lsl`链接脚本正确配置内存分区(如Code/Data/Stack)。 - 示例(Tasking链接脚本片段): ```lsl memory mpu_region0 { type = rom; size = 2M; base = 0x80000000; } ``` #### **(2) 符合ISO 26262标准** - 启用编译器安全选项(如MISRA-C检查、代码覆盖率分析): ```bash # 使用GCC安全扩展 gcc -fstack-protector-all -Wmisra-c=2012 -o ecu.elf src/*.c ``` #### **(3) 多核ECU处理** - 若目标为多核MCU(如Aurix TC3xx),需为每个核单独编译并定义核间通信(IPC): ```cmake # 编译核0和核1的代码 add_executable(core0.elf Swc/core0_main.c) add_executable(core1.elf Swc/core1_main.c) ``` --- ### **6. 自动化与持续集成** - **CI/CD流水线示例**: ```yaml # GitLab CI配置 stages: - build autosar_build: stage: build script: - cmake -B build -DMCU_TYPE=TC39x - cd build && ninja artifacts: paths: - build/ecu.elf ``` --- ### **总结** | **步骤** | **工具/方法** | **输出** | |------------------------|---------------------------------------|-----------------------------| | 设计SWC | Vector DaVinci, ETAS ISOLAR | ARXML文件 | | 生成RTE/BSW代码 | 工具链内置生成器 | Rte_Generated.c, Can_Stack.c| | 配置构建系统 | CMake + 专用编译器 | Makefile/Ninja构建脚本 | | 编译与链接 | Tasking/Green Hills编译器 | ECU可执行文件(.elf) | | 调试与验证 | Lauterbach TRACE32, CANoe | 运行时日志、信号跟踪 | --- ### **常见问题解决** - **错误:未找到Rte_Type.h** **原因**:ARXML未正确生成RTE代码。 **解决**:重新运行RTE生成工具,检查ARXML端口定义。 - **链接阶段内存溢出** **原因**:`.lsl`脚本未正确分配内存分区。 **解决**:调整内存区域大小或优化代码体积。 - **MISRA-C规则冲突** **原因**:手写代码不符合汽车安全规范。 **解决**:使用PC-lint或Coverity静态分析工具修正代码。 --- 若需进一步优化构建速度,可参考以下策略: 1. **增量代码生成**:仅重新生成受ARXML变更影响的代码模块。 2. **分布式编译**:通过Incredibuild或distcc加速多文件编译。 3. **缓存机制**:为CMake配置`ccache`减少重复编译耗时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值