当前位置: 首页 > news >正文

S32K324 MCAL中的Postbuild和PreCompile使用

文章目录

    • 前言
    • Postbuild和PreCompile的概念
    • MCAL中配置差异
    • 总结

前言

之前一直看到MCAL配置中有这个Postbuild和PreCompile的配置,但是不太清楚这两个的区别和使用方法。最近在使用中出现了相关问题,本文介绍一下MCAL中这两种配置的区别和使用。

Postbuild和PreCompile的概念

Postbuild和PreCompile的概念来自于AUTOSAR_RS_ECUConfiguration中的需求,具体描述如下:
在这里插入图片描述
顾名思义,PreCompile体现在编译之前,进行一些参数的配置,例如.h中的宏定义,一般以 _cfg.h结尾,示例如下:

Example: /* File: CanTp_Cfg.h                             */ 
/* Pre-compile time configuration             */ … 
#define CANTP_USE_NORMAL_ADDRESSING         STD_OFF 
#define CANTP_USE_NORMAL_FIXED_ADDRESSING   STD_OFF 
#define CANTP_USE_EXTENDED_ADDRESSING       STD_ON 
… /* File: CanTp.c                                 */ 
… 
#include "CanTp_Cfg.h" 
… 
#if (CANTP_USE_NORMAL_ADDRESSING == STD_OFF) 
… 
#endif 

使用这种方法,可以减少源码的改动量,通过修改配置来实现不同的功能的开启和关闭
在这里插入图片描述
Postbuild是在编译之后可以修改的配置,一般都是一些const定义,这样的话,只要知道其map中的位置,可以通过修改生成的可执行文件(hex,s19等),来修改对应的配置项,已达到不改代码不编译即可修改配置项。该文件一般以 _PBcfg.h, _PBcfg.c来命名,示例如下:

Example: 
/* File: ComM_PBcfg.h                           */ 
… 
/* Type declaration of the Configuration Type   */ 
struct ComM_ConfigType_Tag { 
… 
}; 
… 
/* File: ComM_PBcfg.c                             */ 
#include <ComM.h> 
… 
/* post-build time configurable data   */ 
const ComM_ConfigType ComM_Config = 
{ … 
}; 
… /* File: ComM.h                                 */ 
#include <ComM_PBcfg.h> 
… 
/* Forward declaration:                         */ 
typedef struct ComM_ConfigType_Tag ComM_ConfigType; 
extern void ComM_Init(const ComM_ConfigType * 
ComMConfigPtr); 
… 

通过修改ComM_Config内存值即可修改对应的一些配置项。

由于Postbuild是在编译后都可以修改的,所以支持Postbuild一定是可以支持PreCompile的,而支持PreCompile的一些宏定义肯定是不能支持Postbuild的,标准中描述如下:
在这里插入图片描述

MCAL中配置差异

在NXP S32K324MCAL中,一般有两个相关选项,一个为Post Build Variant Used ,另一个为Config Variant。
在这里插入图片描述
实测第一个勾选与否对生成的代码没有影响,可能主要是为了提示开发者吧。

Config Variant配置有VariantPreCompile和VariantPostBuild

以CAN模块为例,当配置为VariantPreCompile时,对应的宏CAN_PRECOMPILE_SUPPORT被打开,其主要使能的功能是Can_Init初始化时传递的参数是否为NULL_PTR

    #if (CAN_PRECOMPILE_SUPPORT == STD_ON)#if (CAN_MULTICORE_ENABLED == STD_ON)if (NULL_PTR != Can_Config[u32CoreId]){/* Update config pointer with default configuration if precompile support on. */Can_apxConfig[u32CoreId] = Can_Config[u32CoreId];bValidCoreID = TRUE;}#else/* Update config pointer with default configuration if precompile support on. */Can_apxConfig[u32CoreId] = &Can_Config;#endif(void)Config; /* Prevent compiler warning */#else#if (CAN_MULTICORE_ENABLED == STD_ON)if (u32CoreId == Config->Can_u32CoreID){#endif /* (CAN_MULTICORE_ENABLED == STD_ON) *//* Copy pointer to current Can Driver configuration. */Can_apxConfig[u32CoreId] = Config;#if (CAN_MULTICORE_ENABLED == STD_ON)bValidCoreID = TRUE;}#endif /* (CAN_MULTICORE_ENABLED == STD_ON) */#endif /* (CAN_PRECOMPILE_SUPPORT == STD_ON) */

当VariantPreCompile使能时,直接使用Can_Config作为输入的参数(实际还是来自于Can_PBcfg.c中),在调用Can_Init函数时必须输入参数NULL_PTR,否则会DET报错,代码如下:

    #if (CAN_PRECOMPILE_SUPPORT == STD_ON)if (NULL_PTR != Config)#elseif (NULL_PTR == Config)#endif{(void)Det_ReportError((uint16)CAN_MODULE_ID, CAN_INSTANCE, CAN_SID_INIT, CAN_E_INIT_FAILED);}else{

而当使用VariantPostBuild时,Can_Init函数的输入作为配置项,默认使用Can_PBcfg.c中的Can_Config
在这里插入图片描述
所以,使用VariantPostBuild时,Can_Init初始化需要使用Can_Config,使用VariantPreCompile,Can_Init初始化需要使用NULL_PTR,示例如下:

    #if (CAN_PRECOMPILE_SUPPORT == STD_ON)Can_Init(NULL_PTR);#elseCan_Init (&Can_Config);#endif

其他的MCAL模块也是类似的,如果配置和初始化时传的参数不一致,会导致初始化报错(DET报错的API为初始化,错误码为E_INIT_FAILED)而导致模块无法实现正常功能

总结

合理使用Postbuild和PreCompile,可以减少代码的变种,也可以减少代码编译的次数。

相关文章:

S32K324 MCAL中的Postbuild和PreCompile使用

文章目录 前言Postbuild和PreCompile的概念MCAL中配置差异总结 前言 之前一直看到MCAL配置中有这个Postbuild和PreCompile的配置&#xff0c;但是不太清楚这两个的区别和使用方法。最近在使用中出现了相关问题&#xff0c;本文介绍一下MCAL中这两种配置的区别和使用。 Postbu…...

kubeadm_k8s_v1.31高可用部署教程

kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配&#xff08;8台虚拟机&#xff09;**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…...

【AI日记】24.12.22 容忍与自由 | 环境因素和个人因素

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容&#xff1a;看 OpenAi 这周的发布会和其他 AI 新闻&#xff0c;大佬视频时间&#xff1a;3 小时 读书 书名&#xff1a;富兰克林自传时间&#xff1a;1 小时评估&#xff1a;读完&#xff0c;总体…...

【Java基础面试题030】Java和Go的区别?

回答重点 可以从语言的设计理念、并发模型、内存管理、生态系统与应用场景来说&#xff1a; 1&#xff09;语言设计理念&#xff1a; Java&#xff1a;Java是一种面向对象编程语言&#xff0c;强调继承、多态和封装等OOP特性。它运行在Java虚拟机&#xff08;JVM&#xff09…...

学习嵩山版《Java 开发手册》:编程规约 - 常量定义(P5)

概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结&#xff0c;他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南&#xff0c;对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...

洛谷 P1595 信封问题 C语言递归

题目描述 某人写了 n 封信和 n 个信封&#xff0c;如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。 输入格式 一个信封数 n&#xff0c;保证 n≤20。 输出格式 一个整数&#xff0c;代表有多少种情况。 输入输出样例 输入 #1 2 输出 #1 1 输入 #2 …...

QT创建一个模板槽和信号刷新UI

文章目录 信号与槽的声明work.cpp 信号与槽的连接 在Qt中&#xff0c;若您想设计一个仅含一个信号和槽函数框架&#xff0c;用以刷新UI上多个类型相同但可能属性各异的控件&#xff0c;我们可以借助QVariant的灵活性来传递不同种类的数据&#xff0c;同时利用控件的名称或某种标…...

【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图

1.计算机视觉定义 计算机视觉&#xff08;Computer Vision&#xff09;是一个多学科交叉的研究领域&#xff0c;它的核心目标是使计算机能够像人类一样“看”并“理解”视觉信息。换句话说&#xff0c;它希望赋予计算机从图像、视频中自动提取、有意义地分析、理解并解释视觉场…...

C# cad启动自动加载启动插件、类库编译 多个dll合并为一个

可以通过引用costura.fody的包&#xff0c;编译后直接变为一个dll 自动加载写入注册表、激活码功能: 【CAD二次开发教程-实例18-启动加载与自动运行-哔哩哔哩】 https://b23.tv/lKnki3f https://gitee.com/zhuhao1912/cad-atuo-register-and-active...

Mybatis增删改查(配置文件版)

准备环境 1、数据库表tb_brand 2、实体类Brand 3、测试用例 3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java 4、安装MyBatisX插件 添加插件后&#xff0c;因为在Mapper代理开发时&#xff0c;Mapper接口要和Mapper.xml映射文件放在同一个报下&#xff0…...

【Spring Security系列】5 次密码错误触发账号锁定?Spring Security 高效实现方案详解

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【Spring Security系列…...

笔记day5

文章目录 1 复习2 最完美的解决方案&#xff0c;解决轮播图问题3 开发Floor组件4 把首页中的轮播图拆分为一个共用全局组件5 search模块开发 1 复习 完成商品分类三级列表路由跳转一级路由传参&#xff08;合并参数&#xff09;完成search模块中对于typeNav的使用&#xff08;…...

Linux快速入门-兼期末快速复习使用

Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一&#xff1a;Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二&#xff1a;linux的桌面…...

浅谈文生图Stable Diffusion(SD)相关模型基础

1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法&#xff0c;它采用了U型的网络结构&#xff0c;由编码器&#xff08;下采样路径&#xff09;和解码器&#xff08;上采样路径&#xff09;两部分组成。 编码器负责提取输入图像的特征&#xff0c;…...

Vivado使用VScode编译器

旧版Vivado使用Vscode编译器偶尔会出现VScode界面卡死的情况&#xff0c;在新版的Vivado中&#xff08;我的是Vivado 2023.2&#xff09;&#xff0c;可以使用如下方式&#xff1a; 在设置中选择Text Editor&#xff0c;选择Custom Editor 在对话框中输入以下语句&#xff1a;…...

CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)

1. 引言 在完成了所有必要工具的安装和配置后&#xff0c;我们进入到获取 CEF 源码的阶段。对于 macOS 平台&#xff0c;CEF 的源码获取过程需要特别注意不同芯片架构&#xff08;Intel 和 Apple Silicon&#xff09;的区别以及版本管理。本文将详细介绍如何在 macOS 系统上获…...

Jenkins 中 写 shell 命令执行失败,检测失败问题

由于项目的 依赖复杂&#xff0c;随着版本的增多&#xff0c;人工操作&#xff0c;手误几率太大&#xff0c;我们选取kenins 来自动化发布、更新。 这里主要解决&#xff0c;发布 的 每个阶段&#xff0c;确保每个阶段执行成功。 比如&#xff1a; js 运行&#xff0c;…...

Java程序打包成exe,无Java环境也能运行

Java程序开发完成后&#xff0c;通常情况下以jar包的形式发布。但有时我们需要给非软件开发人员使用程序&#xff0c;如制作好窗体应用&#xff0c;把它发给没有java开发环境的人使用&#xff0c;此时就需要制作exe安装包。本文介绍如何将java程序制作成exe安装包&#xff0c;并…...

【java 正则表达式 笔记】

文章目录 快速入门匹配中文或数字或大小写字母(一个或多个) 正则表达式底层实现(重要)mather.find() 完成的任务mather.group(0) 分析 正则表达式基本语法元字符转义字符区分大小写限定字符选择匹配符特殊字符字符匹配符定位符 分组、捕获和反向引用捕获特别分组反向引用经典结…...

基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码

一、麋鹿群优化算法EHO 基本概念 麋鹿群优化算法&#xff08;EHO&#xff0c;Elephant Herding Optimization&#xff09;是2024年提出的一种启发式优化算法&#xff0c;它的灵感来自麋鹿群的繁殖过程。麋鹿有两个主要的繁殖季节&#xff1a;发情和产犊。在发情季节&#xff0…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...