文章目录
-
- [Aurix Development Studio 新建工程与配置](#Aurix Development Studio 新建工程与配置)
- [Tasking 环境配置](#Tasking 环境配置)
- [CMake 集成](#CMake 集成)
-
- [Win CMake MinGW 安装](#Win CMake MinGW 安装)
- [Tasking Toolchain 工具链](#Tasking Toolchain 工具链)
- CMakeLists.txt
- [Powershell 脚本](#Powershell 脚本)
- [Gitlab CI CD](#Gitlab CI CD)
- [Github Link](#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, 之前是能随便下的, 现在如果下载不了, 找供应商或者跳过.
添加到环境变量
新开终端检查
bash'
cctc --version
浮动版有时候服务器IP改变, 可手动修改 Tasking安装目录/etc
目录下的 licopt.txt
文件
bash
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 路径添加到环境变量
新开一个终端检查
bash
cmake --version
gcc --version
Tasking Toolchain 工具链
CMake 3.25 版本及以后新增了 CMAKE_TASKING_TOOLSET
, 用法参考 Tasking Toolchain: How to properly use it? - Usage - CMake Discourse
常用编译或链接选项还是参考 ADS 或者 Tasking 的默认配置来
或者命令行查看帮助
bash
cctc -h
astc -h
ltc -h
objsize -h
objdump -h
一个最简单的示例如下, 这里命名为 tasking_tricore.cmake
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_COMPILER
和CMAKE_CXX_COMPILER
设置为找到的 C 编译器,CMAKE_ASM_COMPILER
设置为找到的汇编编译器。CMAKE_FIND_ROOT_PATH_MODE_*
变量控制了在查找程序、库、头文件和包时,是否应考虑到 CMake 的根路径。在这个文件中,所有的查找都只在根路径中进行,除了程序查找,它永不在根路径中查找。这是因为在交叉编译的情况下,你可能只想在目标系统的路径中查找,而不是在主机系统的路径中查找。
接下来,add_compile_options
和 add_link_options
命令分别添加了编译和链接选项。这些选项包括 MISRA C 2012 规则、C99 和 C++14 标准、优化级别、警告级别等。
CMakeLists.txt
可以一个目录一个目录添加, 这里选择了另外一种, 排除不要的文件夹或源文件, 剩下的全部包含
bash
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 来编译或清理
powershell
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的也类似), 登录到服务器
bash
$ 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
示例,
bash
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 拉代码的阶段, 如果报错误
bash
$ git submodule update --init --recursive
...
remote: ========================================================================
remote:
remote: Your account has been blocked.
remote:
remote: ========================================================================
一种不算好但简单的方法是到服务器的gitlab ci该仓库的位置
bash
$ 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: