TC397 Tasking CMake Gitlab CI CD 环境配置

文章目录

    • Aurix Development Studio 新建工程与配置
    • Tasking 环境配置
    • CMake 集成
      • Win CMake MinGW 安装
      • Tasking Toolchain 工具链
      • CMakeLists.txt
      • Powershell 脚本
    • Gitlab CI CD
    • Github Link

本篇先演示了ADS新建激活编译工程, 讲述了浮点模型, 链接脚本文件, 静态库集成等的设置, 接着配置了Tasking的终端环境和Toolchain, 给出了TC397 CMake集成使工程可以在终端命令行编译的方法, 最后展示了如何集成到Gitlab, 如何CI CD, 自动编译MCU工程和分发二进制文件, 最后给出了整个工程的源码以供参考.

Aurix Development Studio 新建工程与配置

安装并打开最新的 AURIX™ Development Studio, 这里版本用的是 1.9.20. 对应的 Infineon Low Level Drivers for AURIX™ TC3xx devices 的版本是 iLLD 1.0.1.17.0.1.

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

如果有多个工程同时打开, 加粗加黑的工程是激活工程, 想让某个工程激活, 可以工程右键-> Set Active Project.

新加入的文件工程右键Refresh会自动包含路径, 所以没有用的源文件(.c, .cxx等)最好不要放到工程目录及子目录下, 如 Simulink 生成的 ert_main.c

编译 或 重新编译, 默认生成 .elf, .hex, .map 文件等, 可以自己写脚本从hex生成12个或以上的bin文件(6个核, 每个核2个bin文件, 还有 ucb 文件 或 可能标定使用的 DFlash 文件)

请添加图片描述

浮点模型: 默认单精度浮点模型, double 会被当作 float 对待, sizeof(double)=4, 如想自己修改可参考下图:
请添加图片描述
请添加图片描述

链接脚本文件: 默认是 Lcf_Tasking_Tricore_Tc.lsl

请添加图片描述

静态库集成: 如果有第三方的.a静态库或者为了加快编译自己弄的静态库可以在这里添加

请添加图片描述

重命名工程: 如果复制了工程, 想改工程名, 可以右键 Rename… 然后输入新工程名即可

请添加图片描述

更新到最新的 iLLD 库: 工程右键, Project updater, Update iLLD

虽然 ADS 也是用的类似 Tasking 的编译器, 但有时候版本不同, 默认的编译链接选项也可能不一样, 可能会发生诸如 const volatile , overlay 等功能编译出的标定文件的位置不一样. 用到复杂功能时两个IDE编出来的文件可能的不一致是需要注意的地方.

Tasking 环境配置

商业开发一般使用付费的 Tasking 从命令行编译或者走CI CD方便一些, Win 或者 Linux 平台都有. 有 限定一台PC使用的Node-Locked锁定许可, 服务器许可网络多用户使用的Floating(同一时间仅限一个用户且切换用户需要数十分钟的间隔)浮动许可 等类型.

正常安装供应商给的 Tasking 安装包.

打最新补丁(patch): TriCore and AURIX Toolset Support | TASKING, 如 v6.3r1p8 update patch, 之前是能随便下的, 现在如果下载不了, 找供应商或者跳过.

添加到环境变量

请添加图片描述

新开终端检查

cctc --version

浮动版有时候服务器IP改变, 可手动修改 Tasking安装目录/etc 目录下的 licopt.txt 文件

TSK_LICENSE_KEY_SWxxxx = xxxx-xxxx-xxxx-xxxx
TSK_LICENSE_SERVER = <IP>:<Port>

CMake 集成

这里以 Windows 为例(Linux下 CMake GCC要简单很多, 不再赘述)

Win CMake MinGW 安装

CMake: Download CMake 下载最新或指定版本的 Windows x64 Installer.

MinGW: mingw-w64.org/downloads/#mingw-builds 到 Github Release 下载最新或指定版本的 x86_64-版本-release-win32-seh-msvcrt-rt_v版本-rev0.7z, 解压到指定文件夹即可, 无需安装

把 CMake 和 MinGW 路径添加到环境变量

请添加图片描述

新开一个终端检查

cmake --version
gcc --version

Tasking Toolchain 工具链

CMake 3.25 版本及以后新增了 CMAKE_TASKING_TOOLSET, 用法参考 Tasking Toolchain: How to properly use it? - Usage - CMake Discourse

常用编译或链接选项还是参考 ADS 或者 Tasking 的默认配置来

请添加图片描述

或者命令行查看帮助

cctc -h
astc -h
ltc -h
objsize -h
objdump -h

一个最简单的示例如下, 这里命名为 tasking_tricore.cmake

set(CMAKE_SYSTEM_NAME Generic)find_program(COMPILER_C cctc PATHS ENV TOOLCHAIN_ROOT PATH_SUFFIXES bin)
find_program(COMPILER_ASM astc PATHS ENV TOOLCHAIN_ROOT PATH_SUFFIXES bin)set(CMAKE_C_COMPILER ${COMPILER_C})
set(CMAKE_CXX_COMPILER ${COMPILER_C})
set(CMAKE_ASM_COMPILER ${COMPILER_ASM})set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)add_compile_options(--misrac-version=2012 -D__CPU__=tc39xb --iso=99 --c++14 --language=+volatile --exceptions --anachronisms --fp-model=3 -O0 --tradeoff=4 --compact-max-size=200 -g -Wc-w544 -Wc-w557 -Ctc39xb -Y0 -N0 -Z0
)add_link_options(-d${PROJECT_SOURCE_DIR}/Lcf_Tasking_Tricore_Tc.lsl -Wl-Oc -Wl-OL -Wl-Ot -Wl-Ox -Wl-Oy -Wl-mc -Wl-mf -Wl-mi -Wl-mk -Wl-ml -Wl-mm -Wl-md -Wl-mr -Wl-mu --no-warnings= -Wl--error-limit=42 --fp-model=3 -lrt --lsl-core=vtc --exceptions --strict --anachronisms --force-c++ -Ctc39xb--format=ihex
)

这个 CMake 文件是用于配置交叉编译环境的工具链文件。它设置了一些变量来定义目标系统和编译器。

  • CMAKE_SYSTEM_NAME 设置为 “Generic”,表示目标系统是一个通用的系统(Windows Linux)。
  • find_program 命令用于查找名为 “cctc” 的 C 编译器和名为 “astc” 的汇编编译器,查找路径是环境变量 TOOLCHAIN_ROOT 指定的路径,以及该路径下的 “bin” 子目录。
  • CMAKE_C_COMPILERCMAKE_CXX_COMPILER 设置为找到的 C 编译器,CMAKE_ASM_COMPILER 设置为找到的汇编编译器。
  • CMAKE_FIND_ROOT_PATH_MODE_* 变量控制了在查找程序、库、头文件和包时,是否应考虑到 CMake 的根路径。在这个文件中,所有的查找都只在根路径中进行,除了程序查找,它永不在根路径中查找。这是因为在交叉编译的情况下,你可能只想在目标系统的路径中查找,而不是在主机系统的路径中查找。

接下来,add_compile_optionsadd_link_options 命令分别添加了编译和链接选项。这些选项包括 MISRA C 2012 规则、C99 和 C++14 标准、优化级别、警告级别等。

CMakeLists.txt

可以一个目录一个目录添加, 这里选择了另外一种, 排除不要的文件夹或源文件, 剩下的全部包含

cmake_minimum_required(VERSION 3.15)
project(tc397_min_project LANGUAGES CXX C ASM)set(EXCLUDE_DIRS "build" "TriCore Debug (TASKING)" "TriCore Release (TASKING)")# source files
set(EXCLUDE_FILES "ert_main.c")
file(GLOB_RECURSE SOURCES${CMAKE_CURRENT_SOURCE_DIR}/*.c${CMAKE_CURRENT_SOURCE_DIR}/*.cpp${CMAKE_CURRENT_SOURCE_DIR}/*.cc
)
foreach(_dir IN ITEMS ${EXCLUDE_DIRS})file(GLOB_RECURSE FILES RELATIVE ${PROJECT_SOURCE_DIR} "${_dir}/*")list(FILTER SOURCES EXCLUDE REGEX "${_dir}/.*")
endforeach()
foreach(_file IN ITEMS ${EXCLUDE_FILES})list(FILTER SOURCES EXCLUDE REGEX "${_file}")
endforeach()# include directories
set(INCLUDE_DIRS "")
file(GLOB_RECURSE FILES RELATIVE ${PROJECT_SOURCE_DIR} "*.h")
foreach(_dir IN ITEMS ${EXCLUDE_DIRS})list(FILTER FILES EXCLUDE REGEX "${_dir}/.*")
endforeach()
foreach(_source IN ITEMS ${FILES})get_filename_component(_source_path "${_source}" PATH)string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")list(APPEND INCLUDE_DIRS "${_source_path}")# append upper directorieswhile(NOT "${_source_path}" STREQUAL "")get_filename_component(_source_path "${_source_path}" DIRECTORY)list(APPEND INCLUDE_DIRS "${_source_path}")endwhile()
endforeach()
list(APPEND INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
list(REMOVE_DUPLICATES INCLUDE_DIRS)add_executable(${PROJECT_NAME} ${SOURCES}
)set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIRS})# postbuild mv .elf .hex
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.elf ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.hexCOMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.elf
)

这个 CMakeLists.txt 文件定义了一个名为 tc397_min_project 的项目,该项目使用 C++、C 和汇编语言。

首先,它定义了一些需要排除的目录和文件。然后,使用 file 命令和 GLOB_RECURSE 选项在当前目录及其子目录中查找所有的 .c.cpp.cc 文件,并将找到的文件存储在 SOURCES 变量中。接下来,它遍历排除目录和文件,从 SOURCES 中排除这些目录和文件。

然后,它查找所有的 .h 文件,并将这些文件的路径添加到 INCLUDE_DIRS 变量中。这个过程也会排除在 EXCLUDE_DIRS 中定义的目录。对于每个找到的 .h 文件,它还会将该文件的上级目录添加到 INCLUDE_DIRS 中,直到路径为空为止。最后,它将当前目录添加到 INCLUDE_DIRS 中,并删除其中的重复项。

接下来,它使用 add_executable 命令创建一个可执行文件,该文件的名称是项目名称,源文件是 SOURCES 变量中的文件。然后,它设置了目标的链接语言为 C,并将 INCLUDE_DIRS 中的目录添加到目标的公共包含目录中。

最后,它添加了一个自定义命令,该命令在构建目标后执行。这个命令将 .elf 文件复制为 .hex 文件,然后删除 .elf 文件。

Powershell 脚本

Windows 下的命令不太好记, 这里可以写一个PS脚本, 使用 build clean 来编译或清理

function Build {$startTime = Get-Date$exePath = (Get-Command cctc.exe).Source$env:TOOLCHAIN_ROOT = (Split-Path (Split-Path $exePath -Parent) -Parent).Replace("\", "/")Write-Host "TOOLCHAIN_ROOT: $env:TOOLCHAIN_ROOT"if (!(Test-Path -Path "build")) {New-Item -Path "build" -ItemType "directory" -ErrorAction SilentlyContinue}# cross-compiling toolchain$env:CMAKE_TOOLCHAIN_FILE = "$PSScriptRoot\tasking_tricore.cmake"Write-Host "CMAKE_TOOLCHAIN_FILE: $env:CMAKE_TOOLCHAIN_FILE"cmake -B build -G "MinGW Makefiles" .$totalLogicalCores = ( `(Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors | `Measure-Object -Sum `).Sumcmake --build build -- -j $totalLogicalCores# if cmake or make failed, exit with the same error codeif ($LASTEXITCODE -ne 0) {exit $LASTEXITCODE}$endTime = Get-Date$timeSpan = New-TimeSpan -Start $startTime -End $endTimeWrite-Host "Build time taken: $($timeSpan.Minutes) minutes $($timeSpan.Seconds) seconds"
}function Clean {if (Test-Path -Path "build") {Remove-Item -Path "build" -Recurse -Force}
}function Help {Write-Host "Usage: win.ps1 [command]"Write-Host "Commands:"Write-Host "  build: build the project"Write-Host "  clean: clean the project"Write-Host "  help: show this help message"
}if ($args.Length -eq 0) {Helpexit 0
}switch ($args[0]) {"build" {Build}"clean" {Clean}"help" {Help}default {Write-Host "Unknown command: $args[0]"Help}
}

这个 PowerShell 脚本提供了三个功能:构建项目(build)、清理项目(clean)和显示帮助信息(help)。

  • Build 函数首先使用 CMake 生成 MinGW Makefiles,然后获取逻辑处理器的数量,并使用这个数量作为并行构建的作业数。如果 CMake 或 make 失败,脚本将以相同的错误代码退出。最后,它计算并打印构建所花费的时间。
  • Clean 函数检查是否存在名为 “build” 的目录,如果存在,就删除它。
  • Help 函数打印脚本的使用方法和可用的命令。

脚本的主体部分首先检查是否有传入的参数,如果没有,就显示帮助信息并退出。然后,它使用 switch 语句根据第一个参数选择要执行的函数。如果参数不是 “build”、“clean” 或 “help”,它将打印一个错误消息,并显示帮助信息。

Gitlab CI CD

先确保Gitlab工程有足够的权限, 设置里面开启 Pipelines, 别忘了点击下面的 Save changes 按钮

请添加图片描述

在装有Tasking的服务器上安装好 GitLab Runner, 一般用 Docker 或直接 Shell 集成, 这里以 Shell 为例, 在CI / CD 的 Runners里面复制一下 URL 和 token

请添加图片描述

这里以 Linux 的Tasking服务器为例(Windows的也类似), 登录到服务器

$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=3684564 revision=12335144 version=15.8.0
Running in system-mode.Enter the GitLab instance URL (for example, https://gitlab.com/):
这里粘贴上面复制的URL
Enter the registration token:
这里粘贴上面复制的token
Enter a description for the runner:
填入描述
Enter tags for the runner (comma-separated):
设置一个tag, 如gitlab的组或者工程名, 这个tag用来配置后面`.gitlab-ci.yml`
Enter optional maintenance note for the runner:
填入维护note
WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872
Registering runner... succeeded                     runner=xxxx
Enter an executor: docker-ssh+machine, custom, parallels, shell, ssh, instance, kubernetes, docker, docker-ssh, virtualbox, docker+machine:
shell   这里填入shell, 也可以根据实际情况用docker等
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

服务器配置完后, 回到Gitlab工程设置页面刷新, Settings, CI/CD, Runners, Runners activated for this project 应该就能看到上面输入tag名字的 runner 了

请添加图片描述

Gitlab工程Settings, CI/CD, Variables 根据情况填入gitlab 或者 jfrog 等的 variable.

这里略去 prebuild, 更新 submodule, deploy 的过程, 仅给出 build 的最简 .gitlab-ci.yml 示例,

stages:- buildtasking_build:tags:- 这里填入服务器设置的tagstage: buildonly:- tagsscript:- export TSK_LICENSE_KEY_SWxxxx=xxxx-xxxx-xxxx-xxxx- export TSK_LICENSE_SERVER="<ip>:<port>"- export TOOLCHAIN_ROOT=/opt/Tasking/TriCore6.3r1/ctc- cmake -B build -DCMAKE_TOOLCHAIN_FILE=tasking_tricore.cmake -G 'Unix Makefiles' .- cmake --build build -j$(nproc)artifacts:paths:- buildexpire_in: '60'when: on_successallow_failure: false

工程打 tag 可以触发CI流程.

请添加图片描述

对于工程有 submodule 的, 一般会有个 prebuild 拉代码的阶段, 如果报错误

$ git submodule update --init --recursive
...
remote: ========================================================================
remote: 
remote: Your account has been blocked.
remote: 
remote: ========================================================================

一种不算好但简单的方法是到服务器的gitlab ci该仓库的位置

$ find xxx -name 工程名
$ cd gitlab_ci_的工程路径# 查看本地git配置
$ git config --local  --list# 一般是 submodule.xxxx.url 没有 token
# 从其它工程抄一个可用的 用户oauth2 或者 远程仓库的 gitlab-ci-token
$ sudo git config --local submodule.xxxx.url "http://oauth2:xxxx@yyyy.git"
# sudo git config --local submodule.xxxx.url "http://gitlab-ci-token:xxxx@yyyy.git"

另外一个需要注意的地方是 Windows 文件名不区分大小写, Linux 下区分, 如 A.h, Windows 下 #include "a.h" 编译是不会报错的, 但是Linux下 cannot open #include file "a.h", 最好一开始就大小写区分好.

Github Link

欢迎Star:

  • domain_controller_orin_x2_tc397/tc397_min_project at main · weifengdq/domain_controller_orin_x2_tc397 (github.com)
  • 也可到csdn下载: tc397_min_project

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/519790.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3的开发小技巧

「总之岁月漫长&#xff0c;然而值得等待。」 目录 父组件调用子组件函数如何访问全局api 父组件调用子组件函数 ref, defineExpose //父组件 代码 <child ref"ch">this.$refs.ch.fn();//子组件 函数抛出 const fn () > { }; defineExpose({ fn });如何…

01背包问题 刷题笔记

思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…

和为K的子数组

题目&#xff1a; 使用前缀和的方法可以解决这个问题&#xff0c;因为我们需要找到和为k的连续子数组的个数。通过计算前缀和&#xff0c;我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum&#xff0c;其中prefixSum[i]表示从数组起始位…

基于YOLOv5的驾驶员疲劳驾驶行为​​​​​​​检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了疲劳驾驶行为检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析。 博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量…

MySQL事务隔离级别

文章目录 一、前置知识1、为什么要隔离级别&#xff1f;1、隔离级别种类2、查看/设置隔离级别3、手动控制事务4、事务的锁信息查看 二、实战1、READ UNCOMMITTED2、READ COMMITTED3、REPEATABLE READ4、SERIALIZABLE 三、总结 一、前置知识 1、为什么要隔离级别&#xff1f; …

9款世界级垂直领域软件架构师Visio平替作图工具!

1 LucidChart 一个基于HTML5的在线流程图绘制和协作应用平台&#xff0c;用户可以通过它方便快速的实现流程图表的绘制&#xff0c;同时还可以实现与他人进行实时的流程图绘制和修改功能&#xff0c;对需要群组协作功能的团队来说&#xff0c;这点非常方便。 由于LucidChart是…

vue el-avatar 使用require提示无法找到图片

报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案

Android 13 WMS-动画流程

动画的类型如下 IntDef(flag true, prefix { "ANIMATION_TYPE_" }, value {ANIMATION_TYPE_NONE,ANIMATION_TYPE_APP_TRANSITION,ANIMATION_TYPE_SCREEN_ROTATION,ANIMATION_TYPE_DIMMER,ANIMATION_TYPE_RECENTS,ANIMATION_TYPE_WINDOW_ANIMATION,ANIMATION_TYPE_…

片上网络(NoC)技术的发展及其给高端FPGA带来的优势

片上网络(NoC)技术的发展及其给高端FPGA带来的优势 1. 概述 在摩尔定律的推动下,集成电路工艺取得了高速发展,单位面积上的晶体管数量不断增加。 片上系统(System-on-Chip,SoC)具有集成度高、功耗低、成本低等优势,已经成为大规模集成电路系统设计的主流方向,解决了…

【Linux】Linux原生异步IO(一):libaio-介绍

1、IO模型 1.1 简述 相信大家在搜索的时候,都会看到下面这张图,IO的使用场景:同步、异步、阻塞、非阻塞,可以组合成四种情况: 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可…

量化交易日记 基础概念篇

联系方式 17710158550 NBEATS (Neural Basis Expansion Analysis for Time Series)、NHiTS (Neural Hierarchical Interpolation for Time Series Forecasting)、LSTNet (Long Short-Term Memory Network)、TCN (Temporal Convolutional Network)、Transformer、DeepAR (DeepAR…

2024.3.7每日一题

LeetCode 找出字符串的可整除数组 题目链接&#xff1a;2575. 找出字符串的可整除数组 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的字符串 word &#xff0c;长度为 n &#xff0c;由从 0 到 9 的数字组成。另给你一个正整数 m 。 word 的 …