这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】RTD 驱动库 memmap 管理

共1条 1/1 1 跳转至

【S32K3XX】RTD 驱动库 memmap 管理

高工
2025-09-01 08:28:17     打赏

【简介】

在RTD 的驱动库中经常能看到如下的代码编写方式,以下是LP_UART 的驱动代码中截取的代码段。

#define UART_START_SEC_CONST_BOOLEAN
#include "Uart_MemMap.h"

/** @brief Table storing DMA capabilities for LPUART instances. */
static const boolean Lpuart_Uart_Ip_InstHasLoopbackEnabled[LPUART_INSTANCE_COUNT] = LPUART_UART_IP_ENABLE_INTERNAL_LOOPBACK_PER_INSTANCE;

#define UART_STOP_SEC_CONST_BOOLEAN
#include "Uart_MemMap.h"

上述代码的目的是为了将变量放到特定的section 中进行管理。

首先定义UART_START_SEC_CONST_BOOLEAN宏,然后包含Uart_MemMap.h头文件。在这个头文件中,对应的宏控制代码如下:

image.png

上述代码展开后如下

#define UART_START_SEC_CONST_UNSPECIFIED 
# 1 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h" 1
# 57 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h"
#define UART_MEMMAP_VENDOR_ID 43
#define UART_MEMMAP_AR_RELEASE_MAJOR_VERSION 4
#define UART_MEMMAP_AR_RELEASE_MINOR_VERSION 7
#define UART_MEMMAP_AR_RELEASE_REVISION_VERSION 0
#define UART_MEMMAP_SW_MAJOR_VERSION 4
#define UART_MEMMAP_SW_MINOR_VERSION 0
#define UART_MEMMAP_SW_PATCH_VERSION 0
# 81 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h"
#define MEMMAP_ERROR 
# 6802 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h"
#undef UART_START_SEC_CONST_UNSPECIFIED
#define ENTERED_UART_START_SEC_CONST_UNSPECIFIED 

#define MEMMAP_MATCH_ERROR 
# 6814 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h"
#undef MEMMAP_ERROR
#pragma GCC section rodata ".mcal_const"
# 167 "../RTD/src/Lpuart_Uart_Ip.c" 2


static LPUART_Type * const Lpuart_Uart_Ip_apBases[(16u)] = { ((LPUART_Type *)(0x40328000u)), ((LPUART_Type *)(0x4032C000u)), ((LPUART_Type *)(0x40330000u)), ((LPUART_Type *)(0x40334000u)), ((LPUART_Type *)(0x40338000u)), ((LPUART_Type *)(0x4033C000u)), ((LPUART_Type *)(0x40340000u)), ((LPUART_Type *)(0x40344000u)), ((LPUART_Type *)(0x4048C000u)), ((LPUART_Type *)(0x40490000u)), ((LPUART_Type *)(0x40494000u)), ((LPUART_Type *)(0x40498000u)), ((LPUART_Type *)(0x4049C000u)), ((LPUART_Type *)(0x404A0000u)), ((LPUART_Type *)(0x404A4000u)), ((LPUART_Type *)(0x404A8000u)) };

同理 UART_STOP_SEC_CONST_BOOLEAN 定义如下

image.png

UART_START_SEC_CONST_BOOLEAN/UART_STOP_SEC_CONST_BOOLEAN  的调用需要配对使用不配对使用会触发编译错误分支以下代码定义时也是成对使用

image.png


上面只是RTD 代码中的一处使用方式,RTD中这样的使用方法随处可见,RTD驱动中对memory 的管理都是采用的这种方式统一进行管理。

【总结】

RTD(Runtime Run-Time Driver)驱动库采用了一种非常系统化的内存区域管理机制,这种机制在嵌入式系统开发中非常常见且重要。我来详细解析一下这种机制的设计思路和优势:

核心机制:基于宏的内存段管理这种方式通过宏定义UART_START_SEC_xxx和UART_STOP_SEC_xxx来包裹变量定义,配合Uart_MemMap.h头文件实现:

  1. 内存段划分:将不同类型的变量(常量、变量、函数等)分配到特定的内存区域
    • UART_START_SEC_CONST_BOOLEAN:标记常量布尔值段的开始

    • 类似还有其他类型如UART_START_SEC_CONST_UNSPECIFIED等

  2. 编译指令控制:通过#pragma指令告诉编译器将后续定义的变量放置到指定的内存段
    • 例如#pragma GCC section rodata ".mcal_const"指定只读数据到.mcal_const段

  3. 配对检查机制:通过MEMMAP_MATCH_ERROR等宏确保START和STOP宏成对使用,否则触发编译错误



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]