TC397 Tasking CMake Gitlab CI CD 环境配置

news2025/3/2 4:10:00

文章目录

    • 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 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:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 热部署。

SpringBoot 热部署。 文章目录 SpringBoot 热部署。 pom.xml。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional…

Java项目:40 springboot月度员工绩效考核管理系统009

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统的功能分为管理员和员工两个角色 管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&#xff0c;添加管理员账号和修改…

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题 1.冯诺依曼体系2.CPU是怎么构成的3.指令表4.CPU执行代码的方式5.CPU小结&#xff1a;6.编程语言和操作系统7. 进程/任务&#xff08;Process/Task&#xff09;8.进程在系统中是如何管理的9. CPU分配 -- 进程调度10.内存分配 -- 内存管理11.进程间通信 1.冯诺依曼…

WordPress建站入门教程:phpMyAdmin4.8.5出现Fatal error: Unparenthesized错误怎么办?

我们在本地电脑使用小皮面板phpstudy安装phpMyAdmin4.8.5成功后&#xff0c;但是点击【管理】功能打开时却出现如下错误&#xff1a; Fatal error: Unparenthesized a ? b : c ? d : e is not supported. Use either (a ? b : c) ? d : e or a ? b : (c ? d : e) in D:\…

SD-WAN专线对本地网络有哪些要求?

SD-WAN&#xff08;软件定义广域网&#xff09;是一种新型的网络架构&#xff0c;通过软件定义的方式&#xff0c;将网络控制平面和数据转发平面进行分离&#xff0c;从而实现网络的灵活性、可编程性和自动化管理。在部署SD-WAN专线时&#xff0c;本地网络需要满足一些要求&…

M2TS转MP4怎么转?超快的方法~

M2TS格式的优点主要体现在对高清视频的完美支持&#xff0c;能够提供极致的视觉体验。然而&#xff0c;由于其相对较大的文件大小&#xff0c;有时可能不太适合网络传输。此外&#xff0c;部分不支持M2TS的播放设备可能导致一定的兼容性问题。 想要播放m2ts视频&#xff0c;可…

C语言内存优化实用指南

一、引言 在C语言编程中&#xff0c;内存管理是一项至关重要的任务。有效的内存优化可以提升程序的性能&#xff0c;减少资源消耗&#xff0c;并防止可能出现的内存泄漏和溢出问题。以下是一些关于C语言内存优化的实用指南。 二、理解内存管理 在C语言中&#xff0c;程序员需…

【思考】crud接口命名规范

写代码时取名字真的是痛苦。 方法命名 1、阿里命名规范 Service/Dao 层命名规约 1&#xff09; 获取单个对象的方法用 get 做前缀。 2&#xff09; 获取多个对象的方法用 list 做前缀。 3&#xff09; 获取统计值的方法用 count 做前缀。 4&#xff09; 插入的方法用 save&am…

如何快速接入 使用Claude 3 opus和Claude 3 sonnet?最简单的Claude 3接入方法

3 月 4 日&#xff0c;被称为 OpenAI 最强竞争对手的大模型公司 Anthropic 宣布推出 Claude3 系列模型&#xff0c;与 Gemini 类似&#xff0c;模型按照大小分为三个&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。Opus 目前在官方发布的测试成绩中全方位超越…

航芯1-Wire安全认证新品上市,防抄板和耗材认证高性价比之选

随着用户产品附加值提升带来的对防抄板的需求&#xff0c;以及电池、医疗耗材、电子配件、IOT领域中对设备认证的需求&#xff0c;上海航芯经过多年的技术积累和对市场的理解&#xff0c;推出了高性价比的ACL16_Axx系列。 1-Wire单总线&#xff1a;小尺寸实现高效传输 ACL16_…

python_读取txt文件绘制多条曲线III

先把文件中指定列&#xff0c;去重提取出来&#xff0c;然后根据指定列去匹配数据&#xff0c;最后完成多条数据的绘图&#xff1b; import matplotlib.pyplot as plt import re from datetime import datetime from pylab import mplmpl.rcParams["font.sans-serif"…

算法沉淀——动态规划之其它背包问题与卡特兰数(leetcode真题剖析)

算法沉淀——动态规划之其它背包问题与卡特兰数 二维费用的背包问题01.一和零02.盈利计划 似包非包组合总和 Ⅳ 卡特兰数不同的二叉搜索树 二维费用的背包问题 01.一和零 题目链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/ 给你一个二进制字符串数组 strs…

selenium中ChromeDriver配置,一把过,并且教你伪装

最近正值毕业季&#xff0c;我之前不是写了个问卷星代码嘛&#xff0c;昨晚上有人凌晨1点加我&#xff0c;问我相关内容。 由于我之前C盘重装了一下&#xff0c;导致我很多东西空有其表&#xff0c;实际不能用&#xff0c;借此机会&#xff0c;向大家编写ChromeDriver配置&…

Nginx启动服务

Nginx启动服务 一、启动前置 下载地址 如已安装Docker&#xff0c;下一步拉取Nginx最新的Docker镜像&#xff1a; docker pull nginx:latest查看拉取下来的镜像&#xff1a; docker images二、启动服务 创建Docker容器&#xff1a; docker run --name {projectname} -p 80…

开发充电桩APP提高管理效能

随着社会的发展&#xff0c;电动车已经成为城市交通的重要组成部分&#xff0c;用户所下载的充电类的APP也非常大&#xff0c;而充电桩的建设和利用效率成为了一个亟待解决的问题。在这个背景下&#xff0c;物联网技术的应用成为了提高充电桩效能的关键。虎克技术公司在此领域提…

3Dmax中VR渲染太阳光渲染参数怎么设置?渲染100云渲染助力

我们用3Dmax建模时一些场景会用到太阳光&#xff0c;那么渲染参数是如何设置的呢&#xff1f; 我们一起来看看&#xff0c;直接上图 以上就是详细的参数设置&#xff0c;大家可以用做参考&#xff0c;如果本地渲染慢的朋友可以考虑使用云渲染100 机器多&#xff0c;渲染稳定不…

Qt6.6搭建WebAssembly

1.首先安装python &#xff0c; 链接&#xff1a;https://www.python.org/ 2.下载并安装qt6. 3.克隆emsdk工程 3.1 进入emsdk目录&#xff0c;然后更新emsdk代码 3.2 下载并安装最新的SDK工具。&#xff08;C:\Qt\emsdk>emsdk install --global latest&#xff09; 3.3…

收银系统源码-智慧新零售2.0小助手全新升级!

欢迎后台私信&#xff0c;测试体验&#xff01; 新零售助手是智慧新零售系统的移动管理端&#xff0c;尤其针对商户/门店日常经营必不可少的一环。智慧新零售2.0版小助手也进行了全新升级&#xff0c;使用起来更简单&#xff0c;页面更美观。小助手采用微信小程序登陆&#xf…

QEMU调试——通过获取设备树(dtb文件)查询开发板的外设地址信息

1、适用场景 使用qemu时&#xff0c;想快速知道开发板的地址空间映射情况&#xff0c;特别是某些外设控制器的寄存器基地址 2、查询QEMU支持的开发板 qemu-system-riscv32.exe -M ? 3、获取开发板对应的dtb文件 1、qemu-system-riscv32.exe -M nuclei_evalsoc 2、dumpdtb nucl…

【linuxC语言】系统调用IO文件操作

文章目录 前言一、文件描述符介绍二、系统调用IO API介绍2.1 open函数2.2 close函数2.3 read函数2.4 write函数2.5 lseek函数 三、示例代码总结 前言 在Linux系统中&#xff0c;C语言通过系统调用实现对文件的输入输出&#xff08;I/O&#xff09;操作。系统调用提供了访问操作…