TC397 Tasking CMake Gitlab CI CD 环境配置

本篇先演示了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 directories
    while(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_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.elf ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.hex
  COMMAND ${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 `
  ).Sum
  cmake --build build -- -j $totalLogicalCores

  # if cmake or make failed, exit with the same error code
  if ($LASTEXITCODE -ne 0) {
    exit $LASTEXITCODE
  }

  $endTime = Get-Date
  $timeSpan = New-TimeSpan -Start $startTime -End $endTime
  Write-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) {
  Help
  exit 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:
  - build

tasking_build:
  tags:
    - 这里填入服务器设置的tag
  stage: build
  only:
    - tags
  script:
    - 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:
      - build
    expire_in: '60'
    when: on_success
  allow_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:

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值