DEENESPTFRRUARHIKOZHNL

Platform Types (Platform_Types)

ModulPlatform (Platform Types)
BSW-Modul-ID199
Standard-Header#include "Platform_Types.h"
SWS-SpezifikationAUTOSAR_SWS_PlatformTypes.pdf
ClusterGeneral & Standard Types

模块指南人工智能生成

为目标处理器的寄存器宽度和字节序提供统一定名的基础类型和特征符号。
AI 生成 未审核 模型: claude-opus-5-5 · 推理强度: high · 温度: 不可控 · 提示词: 7e73f6d7bb31 来源 未决问题(3)
因果锚点:R20-11 自 R20-11 起有效 为此规范版本重新合成。
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

为目标处理器的寄存器宽度和字节序提供统一定名的基础类型和特征符号。

Platform_Types.h 提供 Classic Platform 的平台相关基础类型:从 uint8 到 sint64 的固定宽度整数类型、优化的 *_least 类型、float32/float64、带有 TRUE/FALSE 的 boolean 以及缓冲区指针 VoidPtr 和 ConstVoidPtr。此外,CPU_TYPE、CPU_BIT_ORDER 和 CPU_BYTE_ORDER 标识目标的寄存器宽度和字节序 [SWS_Platform_00046]。boolean 只能与 TRUE 和 FALSE 一起使用,且不得使用算术或位运算符 [SWS_Platform_00034]。不得扩展该头文件,否则将失去 AUTOSAR 一致性。

Platform_Types.h 是 Classic Platform 的平台相关类型基础。该头文件将目标的字长和字节序封装在统一定名之后,且不得进行扩展,因为任何扩展都会破坏 AUTOSAR 一致性 [SWS_Platform_00002]。在模型视图中,这些类型位于固定路径下,如 /AUTOSAR_Platform/ImplementationDatatypes/uint8 TPS StandardizationTemplate 第77页。

该头文件提供以下类型组:

typwahl start Datum festlegen zeiger 指向缓冲区的指针? start->zeiger richtung 将缓冲区传递给 被调用方? zeiger->richtung 是 wahr Wahrheitswert? zeiger->wahr 不 cvp ConstVoidPtr (const void*) richtung->cvp 是 vp VoidPtr (void*) Daten an Aufrufer richtung->vp 不 bool boolean 仅与 TRUE/FALSE wahr->bool 是 gleit Gleitkommazahl? wahr->gleit 不 flt float32 / float64 (IEEE 754-2008) gleit->flt 是 least 最小宽度是否足够 (例如循环计数器、 switch 实参)? gleit->least 不 opt uint8_least … sint32_least least->opt 是 fest uint8 … uint64 / sint8 … sint64 least->fest 不

活动图:选择合适平台类型遵循的问题:缓冲区指针、布尔值、浮点数、最小宽度还是精确宽度。来源:[SWS_Platform_91001]、[SWS_Platform_00026]、SWS PlatformTypes 第17页

boolean 在 R20-11 中被实现为最短的原生支持无符号整数类型,通常为 8 位 [SWS_Platform_00027]。后续版本对此有所偏离,使用 _Bool SWS PlatformTypes 第18页。该类型必须支持指针 [SWS_Platform_00060],并且只能与 TRUE 和 FALSE 一起使用。禁止使用算术和位运算符 [SWS_Platform_00034],并且应通过条件检查避免符号的重复定义 [SWS_Platform_00054]。

每个平台还必须指定三个符号:用于寄存器宽度的 CPU_TYPE [SWS_Platform_00045]、带有 MSB_FIRST 或 LSB_FIRST 的 CPU_BIT_ORDER [SWS_Platform_00048] [SWS_Platform_00049] 以及带有 HIGH_BYTE_FIRST 或 LOW_BYTE_FIRST 的 CPU_BYTE_ORDER [SWS_Platform_00050] [SWS_Platform_00051]。在此过程中不得混淆位名称和权值,因为 MSB 在累加器中始终位于左侧 SWS PlatformTypes 第15页。Interpretation:该模块不知道运行时错误;错误分配仅在集成或一致性测试时才会显现。 问题 (未决)

cpu_symbole start Zielplattform portieren breite CPU 的寄存器宽度? start->breite t8 CPU_TYPE_8 breite->t8 8 Bit t16 CPU_TYPE_16 breite->t16 16 Bit t32 CPU_TYPE_32 breite->t32 32 Bit t64 CPU_TYPE_64 breite->t64 64 Bit bit Bitreihenfolge (Register)? t8->bit t16->bit t32->bit t64->bit msb CPU_BIT_ORDER = MSB_FIRST bit->msb Big Endian lsb CPU_BIT_ORDER = LSB_FIRST bit->lsb Little Endian byte Bytereihenfolge (Speicher)? msb->byte lsb->byte high CPU_BYTE_ORDER = HIGH_BYTE_FIRST byte->high Big Endian low CPU_BYTE_ORDER = LOW_BYTE_FIRST byte->low Little Endian ende Symbole als #define in Platform_Types.h high->ende low->ende

活动图:目标的寄存器宽度、位序和字节序分别精确映射到一个符号值。来源:[SWS_Platform_00045]、[SWS_Platform_00048]、[SWS_Platform_00050]

Platform_Types.h 的角色:平台相关的类型基础

该模块不是可执行组件,而是一个头文件。所有指定的类型和符号均为“Available via Platform_Types.h”,例如 uint8 [SWS_Platform_00013] 或 CPU_TYPE [SWS_Platform_00064]。该头文件将目标微控制器和编译器的特性隐藏在统一的名称之后:字宽、位序和字节序。因此,它属于 SRS_BSW_00161 中所要求的具有面向更高层标准接口的微控制器抽象 SRS BSWGeneral 第88页。字节序规则 SWS PlatformTypes 第16页 正是引用了这一上游需求。

系统边界被严格限定。该头文件不得扩展,因为任何扩展都会破坏 AUTOSAR 一致性 [SWS_Platform_00002]。相比之下,用于指示 API 调用成功或失败的返回类型位于 Std_Types.h SRS BSWGeneral 第68页 中。在模型视图中,平台类型作为蓝图存放,例如在 /AUTOSAR/Platform/ImplementationDatatypes_Blueprint/uint8 下。它们在 /AUTOSAR_Platform/ImplementationDatatypes/uint8 下实现,以便组件供应商可以通过可预测的路径访问它们 TPS StandardizationTemplate 第77页。

einbettung ziel 目标 µC / 编译器 (寄存器宽度、位序和字节序) pt Platform_Types.h (Basistypen, boolean, TRUE/FALSE, VoidPtr, ConstVoidPtr, CPU_*) ziel->pt bestimmt Belegung modell Modellsicht /AUTOSAR_Platform/ImplementationDatatypes pt->modell entspricht Blueprint-Pfad bfx Bfx (boolean, uint8 … uint64) pt->bfx Typen crc Crc (uint8, uint32, boolean) pt->crc Typen bmc Bmc (来自 boolean 的 Bmc_AtomicFlagType) pt->bmc Basistyp keym KeyM / Csm (ConstVoidPtr, VoidPtr, uint32) pt->keym Pufferzeiger cansm CanSM (boolean-Parameter) pt->cansm Typen

上下文图:目标平台决定 Platform_Types.h 的定义,其类型在模型视图中位于固定路径下,并被众多 BSW 模块使用。用户示例来自更高版本。来源:[SWS_Platform_00038]、TPS StandardizationTemplate 第77页、SWS BFXLibrary 第19页、SWS CRCLibrary 第41页、SWS BSWMulticoreLibrary 第16页、SWS KeyManager 第111页、SWS CANStateManager 第83页

具有保证宽度的整数和浮点类型

该模块的核心是宽度为 8 至 64 位的固定宽度无符号和有符号类型,以及两种浮点类型。需求规范性地规定了宽度和取值范围,例如针对 uint32 的“32 bit unsigned” [SWS_Platform_00015]。API 目录中的 C typedef(例如 typedef unsigned long uint32;)应当理解为一种典型映射,其可能因编译器而异(解读)。 问题 Q-d0ca377fc1abd98a (未决)

类型宽度 / 格式取值范围出处
uint88 位,无符号0..255[SWS_Platform_00013]
uint1616 位,无符号0..65535[SWS_Platform_00014]
uint3232 位,无符号0..4294967295[SWS_Platform_00015]
uint6464 位,无符号0..18446744073709551615[SWS_Platform_00066]
sint88 位,有符号-128..+127[SWS_Platform_00016]
sint1616 位,有符号-32768..+32767[SWS_Platform_00017]
sint3232 位,有符号-2147483648..+2147483647[SWS_Platform_00018]
sint6464 位,有符号-9223372036854775808..9223372036854775807[SWS_Platform_00067]
float32IEEE 754-2008 binary32-3.4028235e+38..+3.4028235e+38[SWS_Platform_00041]
float64IEEE 754-2008 binary64±1.7976931348623157e+308[SWS_Platform_00042]

对于有符号类型,AUTOSAR 在编译器和目标端仅支持二进制补码算术。由此产生了表 [SWS_Platform_00061] 中非对称的取值范围。其他规范始终以这些类型为前提。例如,CRC 库定义了 uint8 Crc_CalculateCRC8(const uint8*, uint32, uint8, boolean) SWS CRCLibrary 第41页。COM 必须支持 uint16 至 float64 的端序转换 RS COM 第14页。这两处均来自更高版本,仅用于说明其用法。

用于计数器和状态的优化类型 *_least

除了精确宽度的类型外,该模块还定义了六种优化类型。它们仅保证最小宽度,并分别派生自 uint 或 sint:

因此,实现可以选择更宽的表示形式。目录签名将所有六种类型映射到 unsigned int 或 signed int [SWS_Platform_00020]。

作为应用示例,规范列举了循环计数器(最多 124 次迭代 ⇒ uint8_least)和 switch 参数(17 个状态 ⇒ uint8_least)。详细信息请参见通用 BSW 需求中“AUTOSAR Integer Data Types”一章 SWS PlatformTypes 第17页。

合规使用 boolean、TRUE 和 FALSE

boolean 的取值范围为 FALSE = 0 和 TRUE = 1,并且只能与这些定义一起使用 [SWS_Platform_00026]。对于 R20-11,规则为:boolean 实现为平台原生支持的最短位长的无符号整数类型,通常为 8 位 [SWS_Platform_00027]。来自 R24-11/R25-11 的一处文档对同一标识符的表述有所不同:在其中,boolean 通过 C99 类型 _Bool 实现,并且 AUTOSAR 不再规定确切大小 SWS PlatformTypes 第18页。对于 R20-11,这一后续版本不具有规范性。

boolean 还必须映射到指针可以指向的类型,以便可以通过 API 传递参数。某些硬件的高效位类型无法使用指针,因此不予考虑 [SWS_Platform_00060]。对于符号 TRUE 和 FALSE,适用三条规则:

对 boolean 变量赋值时,禁止使用算术和按位运算符:+、++、-、--、*、/、%、<<、>>、~ 和 &。仅允许赋值 TRUE 或 FALSE,以及关系运算、逻辑运算和(不)等式检查的结果。比较时仅使用 == 或 != 与 TRUE/FALSE 进行,或通过 if (var) 或 if (!var) 进行 [SWS_Platform_00034]。使用该类型的模块遵循此模式。例如,Bfx_GetBit 明确将位测试的结果作为 TRUE 或 FALSE 返回 SWS BFXLibrary 第19页。

boolean_regeln start 对 boolean 变量的操作 art 赋值还是比较? start->art zuw 右侧:TRUE/FALSE、 关系(<、>、<=、>=)、 逻辑(&&、||、!)还是(==、!=)? art->zuw Zuweisung verg 形式:== TRUE/FALSE、!= TRUE/FALSE、 if (var) 还是 if (!var)? art->verg Vergleich ok 允许 zuw->ok 是 nok 不允许 (例如 +、++、-、--、*、/、%、<<、>>、~、&) zuw->nok 不 verg->ok 是 nokv 未作为允许的形式列出 verg->nokv 不

活动图:对于 boolean 变量,仅允许使用列出的赋值和比较形式,不允许使用算术和位运算符。来源:[SWS_Platform_00034]、[SWS_Platform_00026]

无类型缓冲区指针:VoidPtr 和 ConstVoidPtr

这两种指针类型在数据流方向上有所不同:

因此,数据流方向已隐含在类型名称中 SWS PlatformTypes 第27页 SWS PlatformTypes 第28页。

Key Manager 展示了这在接口中的表现形式。KeyMServiceCertificateByCertId 将 RequestData 作为 ConstVoidPtr 连同类型为 uint32 的长度一起传递。响应由类型为 VoidPtr 的 ResponseData 接收;此时 ResponseDataLength(INOUT)指定可用的缓冲区长度 SWS KeyManager 第111页。更多示例:

在这全部三个示例中,长度都作为独立的 uint32 参数或独立的结构体成员传递,因为无类型指针不携带长度信息。

使用 ConstVoidPtr 和 VoidPtr 传递缓冲区(以 KeyM 为例)调用方KeyM将请求数据存入缓冲区Antwortpuffer bereitstellenKeyM_ServiceCertificateByCertId(Service, RequestData: ConstVoidPtr,RequestDataLength: uint32,ResponseData: VoidPtr,ResponseDataLength: uint32 [INOUT])ConstVoidPtr:缓冲区被传递给被调用方VoidPtr:缓冲区为调用方接收数据altOperation angenommenE_OK未接受E_NOT_OK / KEYM_E_BUSY /KEYM_E_KEY_CERT_SIZE_MISMATCH /KEYM_E_PARAMETER_MISMATCH

时序图:在服务调用期间,ConstVoidPtr 将请求传递给被调用者,VoidPtr 接收返回给调用者的响应。来源:SWS KeyManager 第111页、[SWS_Platform_91001]、[SWS_Platform_91002]

typwahl start Datum festlegen zeiger 指向缓冲区的指针? start->zeiger richtung 将缓冲区传递给 被调用方? zeiger->richtung 是 wahr Wahrheitswert? zeiger->wahr 不 cvp ConstVoidPtr (const void*) richtung->cvp 是 vp VoidPtr (void*) Daten an Aufrufer richtung->vp 不 bool boolean 仅与 TRUE/FALSE wahr->bool 是 gleit Gleitkommazahl? wahr->gleit 不 flt float32 / float64 (IEEE 754-2008) gleit->flt 是 least 最小宽度是否足够 (例如循环计数器、 switch 实参)? gleit->least 不 opt uint8_least … sint32_least least->opt 是 fest uint8 … uint64 / sint8 … sint64 least->fest 不

活动图:类型选择遵循以下问题:缓冲区指针、真值、浮点数、最小宽度还是精确宽度。来源:[SWS_Platform_91001]、[SWS_Platform_91002]、[SWS_Platform_00026]、[SWS_Platform_00041]、[SWS_Platform_00020]、SWS PlatformTypes 第17页

平台标识:CPU_TYPE、CPU_BIT_ORDER、CPU_BYTE_ORDER

必须在头文件中为每个平台指定三项属性:

两个顺序符号均为 #define,且取允许值中的恰好一个 [SWS_Platform_00038] [SWS_Platform_00039]。

cpu_symbole start Zielplattform portieren breite CPU 的寄存器宽度? start->breite t8 CPU_TYPE_8 breite->t8 8 Bit t16 CPU_TYPE_16 breite->t16 16 Bit t32 CPU_TYPE_32 breite->t32 32 Bit t64 CPU_TYPE_64 breite->t64 64 Bit bit Bitreihenfolge (Register)? t8->bit t16->bit t32->bit t64->bit msb CPU_BIT_ORDER = MSB_FIRST bit->msb Big Endian lsb CPU_BIT_ORDER = LSB_FIRST bit->lsb Little Endian byte Bytereihenfolge (Speicher)? msb->byte lsb->byte high CPU_BYTE_ORDER = HIGH_BYTE_FIRST byte->high Big Endian low CPU_BYTE_ORDER = LOW_BYTE_FIRST byte->low Little Endian ende Symbole als #define in Platform_Types.h high->ende low->ende

活动图:移植到目标平台时,确定寄存器宽度、位序和字节序,并分别映射到恰好一个符号值。来源:[SWS_Platform_00045]、[SWS_Platform_00048]、[SWS_Platform_00049]、[SWS_Platform_00050]、[SWS_Platform_00051]

对于大端位序,适用 CPU_BIT_ORDER = MSB_FIRST;对于小端位序,适用 LSB_FIRST [SWS_Platform_00048] [SWS_Platform_00049]。位名称与位权必须严格区分。在累加器中,无论 CPU 类型如何,MSB 始终位于最左侧。在 Motorola 架构(大端位序)中,Bit0 表示最高有效位,而在所有其他架构中表示最低有效位 SWS PlatformTypes 第15页 SWS PlatformTypes 图 7.1 第14页。

bitordnung be CPU_BIT_ORDER = MSB_FIRST (Big Endian, z. B. Motorola) Bit0 = MSB msb Register-MSB (immer links) be->msb Bit0 bezeichnet le CPU_BIT_ORDER = LSB_FIRST (Little Endian) Bit0 = LSB lsb Register-LSB (immer rechts) le->lsb Bit0 bezeichnet w7 Wertigkeit 2^7 = 128 msb->w7 entspricht w0 Wertigkeit 2^0 = 1 lsb->w0 entspricht

基于图 7.1 的结构图:寄存器位的位权是固定的,只有 Bit0 的编号取决于 CPU_BIT_ORDER。来源:SWS PlatformTypes 图 7.1 第14页、SWS PlatformTypes 第15页

对于大端字节序,适用 CPU_BYTE_ORDER = HIGH_BYTE_FIRST:16 位值的最高有效字节位于地址 n,最低有效字节位于 n+1。对于小端字节序,适用 LOW_BYTE_FIRST,且映射相反 [SWS_Platform_00050] [SWS_Platform_00051]。名称 Byte0 和 Byte1 仅用于说明,在制造商的参考文档中可能会有所不同 SWS PlatformTypes 第16页。

byteordnung cluster_high HIGH_BYTE_FIRST (Big Endian) cluster_low LOW_BYTE_FIRST (Little Endian) wert uint16-Wert ms MS Byte (Byte1) Bits 15..8 wert->ms ls LS Byte (Byte0) Bits 7..0 wert->ls hn Adresse n ms->hn ln1 Adresse n+1 ms->ln1 hn1 Adresse n+1 ls->hn1 ln Adresse n ls->ln

基于图 7.2/7.3 的结构图:相同的 uint16 根据 CPU_BYTE_ORDER 以交换字节的方式映射到地址 n 和 n+1。来源:SWS PlatformTypes 图 7.2 第16页、SWS PlatformTypes 图 7.3 第15页、[SWS_Platform_00039]

其他规范解释了为什么需要这些规范。数据的内存表示在很大程度上取决于处理器架构和编译器设置。因此,SOME/IP 要求使用序列化算法将其转换为通用的网络表示 RS SOMEIPProtocol 第21页。据推测,实现中的此类转换可能依赖于 CPU_BYTE_ORDER;但有效载荷并未明确证实这一点。 问题 Q-87e212e9eb2a2047 (未决)

发生错误时的行为

解读:由于 Platform_Types.h 仅提供类型和符号,该模块不存在运行时错误和错误代码。 问题 Q-e504d08b84d7ff70 (未决)故障现象出现在编译、集成或一致性测试期间。需求指出了典型原因 [SWS_Platform_00002]:

进一步详细证据

基于 R20-11 需求及部分来自更高版本的关联文档位置的 AI 生成指南。以规范为准。

Platform Types (Platform_Types)

Platform-specific fundamental data types (integers, booleans, floating-point numbers) mapped to CPU architecture primitives.

Typen — Übersicht

Typen — Detailansicht

类型 float32 [SWS_Platform_00041] 📄 PDF

typedef float float32;

This standard AUTOSAR type shall follow the 32-bit binary interchange format according to IEEE 754-2008 with encoding parameters specified in chapter 3.6, table 3.5, column "binary32".

类型 float64 [SWS_Platform_00042] 📄 PDF

typedef double float64;

This standard AUTOSAR type shall follow the 64-bit binary interchange format according to IEEE 754-2008 with encoding parameters specified in chapter 3.6, table 3.5, column "binary64".

类型 VoidPtr [SWS_Platform_91001] 📄 PDF

typedef void* VoidPtr;

This standard AUTOSAR type shall be a void pointer Note: This type shall be used for buffers that contain data returned to the caller.

类型 ConstVoidPtr [SWS_Platform_91002] 📄 PDF

typedef const void* ConstVoidPtr;

This standard AUTOSAR type shall be a void pointer to const. Note: This type shall be used for buffers that are passed to the callee.

类型 CPU_TYPE [SWS_Platform_00064] 📄 PDF

This symbol shall be defined as #define having one of the values CPU_TYPE_8, CPU_TYPE_16, CPU_TYPE_32 or CPU_TYPE_64 according to the platform.

类型 CPU_BIT_ORDER [SWS_Platform_00038] 📄 PDF

This symbol shall be defined as #define having one of the values MSB_FIRST or LSB_FIRST according to the platform.

类型 CPU_BYTE_ORDER [SWS_Platform_00039] 📄 PDF

This symbol shall be defined as #define having one of the values HIGH_BYTE_FIRST or LOW_ BYTE_FIRST according to the platform.

类型 TRUE_FALSE [SWS_Platform_00056] 📄 PDF

The symbols TRUE and FALSE shall be defined as follows: #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif

Request a governed re-review of this record. The record is not changed immediately.

Record
AUTOSAR/AP/record/CP_MOD_Platform
Status
unspecified
Version
AUTOSAR/AP/record/CP_MOD_Platform@rel:R20-11#cf33ddd2
Content hash
cf33ddd2
Source
https://www.autosar.org/fileadmin/standards/R20-11/CP/AUTOSAR_SWS_PlatformTypes.pdf#nameddest=SWS_Platform_00026

类型

boolean 类型

This standard AUTOSAR type shall only be used together with the definitions TRUE and FALSE.

typedef unsigned char boolean;

This standard AUTOSAR type shall be a void pointer to const. Note: This type shall be used for buffers that are passed to the callee.

typedef const void* ConstVoidPtr;

This symbol shall be defined as #define having one of the values MSB_FIRST or LSB_FIRST according to the platform.

This symbol shall be defined as #define having one of the values HIGH_BYTE_FIRST or LOW_ BYTE_FIRST according to the platform.

CPU_TYPE 类型

This symbol shall be defined as #define having one of the values CPU_TYPE_8, CPU_TYPE_16, CPU_TYPE_32 or CPU_TYPE_64 according to the platform.

float32 类型

This standard AUTOSAR type shall follow the 32-bit binary interchange format according to IEEE 754-2008 with encoding parameters specified in chapter 3.6, table 3.5, column "binary32".

typedef float float32;
float64 类型

This standard AUTOSAR type shall follow the 64-bit binary interchange format according to IEEE 754-2008 with encoding parameters specified in chapter 3.6, table 3.5, column "binary64".

typedef double float64;
sint16 类型

This standard AUTOSAR type shall be of 16 bit signed.

typedef signed short sint16;

This optimized AUTOSAR type shall be at least 16 bit signed.

typedef signed int sint16_least;
sint32 类型

This standard AUTOSAR type shall be 32 bit signed.

typedef signed long sint32;

This optimized AUTOSAR type shall be at least 32 bit signed.

typedef signed int sint32_least;
sint64 类型

This standard AUTOSAR type shall be 64 bit signed.

typedef signed long long sint64;
sint8 类型

This standard AUTOSAR type shall be of 8 bit signed.

typedef signed char sint8;

This optimized AUTOSAR type shall be at least 8 bit signed.

typedef signed int sint8_least;
TRUE_FALSE 类型

The symbols TRUE and FALSE shall be defined as follows: #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif

uint16 类型

This standard AUTOSAR type shall be of 16 bit unsigned.

typedef unsigned short uint16;

This optimized AUTOSAR type shall be at least 16 bit unsigned.

typedef unsigned int uint16_least;
uint32 类型

This standard AUTOSAR type shall be 32 bit unsigned.

typedef unsigned long uint32;

This optimized AUTOSAR type shall be at least 32 bit unsigned.

typedef unsigned int uint32_least;
uint64 类型

This standard AUTOSAR type shall be 64 bit unsigned.

typedef unsigned long long uint64;
uint8 类型

This standard AUTOSAR type shall be of 8 bit unsigned.

typedef unsigned char uint8;

This optimized AUTOSAR type shall be at least 8 bit unsigned.

typedef unsigned int uint8_least;
VoidPtr 类型

This standard AUTOSAR type shall be a void pointer Note: This type shall be used for buffers that contain data returned to the caller.

typedef void* VoidPtr;