Davinci生成代码语法

生成的代码语法很特别,所以在这里加更一章,持续更新。

__cplusplus

#ifdef __cplusplus
extern "C" {
#endif
    ……
#ifdef __cplusplus
}
#endif

这段代码的整体作用在于创建一个包装区,使得在C++程序中包含的C语言编写的代码(例如库函数或接口)能够正确地被C++编译器识别并处理为C语言格式,从而避免因链接时的名称修饰差异导致的链接错误。对于C编译器来说,由于它不理解 extern "C",所以这两个部分都会被忽略,不影响C代码的正常编译。

CONST

#define CONST(type, memclass) const type 
typedef uint32 Dio_PortLevelType;
#define DIO_CONST
CONST(Dio_PortLevelType, DIO_CONST) Dio_aAvailablePinsForRead[5];

定义了一个宏 CONST,当你在代码中使用 CONST(type, memclass) 时,它会被展开为 const type。这里的 type 和 memclass 是传入宏的两个参数,但实际上 memclass 参数在这个宏定义中并未使用,仅保留了 const 关键字来修饰类型。

定义了一个新类型 Dio_PortLevelType,它是 uint32 类型的别名。这意味着之后在代码中提到 Dio_PortLevelType 就相当于使用 uint32 类型。

定义了一个宏 DIO_CONST,但它没有赋予任何值。通常这样的空宏定义要么是为了后续配合其他宏或条件编译使用,要么是作为一种标记,不过在这段代码中,它并没有实质性的效果。

上面定义的 CONST 宏来声明一个数组变量 Dio_aAvailablePinsForRead,因为 DIO_CONST 是一个空宏定义,所以 CONST(Dio_PortLevelType, DIO_CONST) 展开后实际上变成了 const Dio_PortLevelType。因此,这段代码声明了一个含有5个元素的常量数组,每个元素都是 Dio_PortLevelType 类型(实际上是 uint32 类型),整个数组也是常量,不可对其进行修改。即声明了一个固定大小(大小为5)的常量数组,用于存放5个 Dio_PortLevelType 类型的不可变值。

FUNC

#define MCU_CODE
#define P2CONST(ptrtype, memclass, ptrclass) const ptrtype* 
#define AUTOMATIC
#define MCU_APPL_CONST
FUNC(void, MCU_CODE) Mcu_Func(P2CONST(Mcu_SMC_ConfigType, AUTOMATIC, MCU_APPL_CONST) pConfigPtr)
{
    ……
}

FUNC(void, DIO_CODE) Dio_WriteChannel
(
    CONST(Dio_ChannelType, AUTOMATIC) ChannelId,
    CONST(Dio_LevelType,   AUTOMATIC) Level
);

定义了一个宏 P2CONST,它接受三个参数:ptrtype(指针指向的对象类型)、memclass(可能用于表示内存类别的参数,但在本例中实际未使用)和 ptrclass(也未明确使用)。宏展开后得到的是一个指向 const ptrtype 的指针。在这里,虽然传递了 memclass 和 ptrclass 参数,但宏定义并未利用这两个参数,仅保留了 ptrtype 类型的 const 指针。

声明了一个名为 Mcu_Func 的函数,其返回类型为 void,并带有 MCU_CODE 标志,表示该函数与MCU相关。函数接受一个参数 pConfigPtr,其类型由 P2CONST 宏定义展开,最终为指向 Mcu_SMC_ConfigType 结构体的 const 指针。尽管 AUTOMATIC 和 MCU_APPL_CONST 被传递给了 P2CONST 宏,但由于宏定义未使用这两个参数,所以它们在这里并不影响 pConfigPtr 的类型。

声明了一个名为 Dio_WriteChannel 的函数,其返回类型同样是 void,带有 DIO_CODE 标志,表示该函数与数字输入/输出(DIO)相关。函数接受两个参数,ChannelId 和 Level,它们的类型分别为 CONST(Dio_ChannelType, AUTOMATIC) 和 CONST(Dio_LevelType, AUTOMATIC)。这里的 CONST 可能是另外的宏定义(此处未给出),假设它用于声明常量类型的参数。然而,这里的 AUTOMATIC 参数传递给 CONST 宏,根据前面的宏定义,AUTOMATIC 本身并没有实际意义,所以在这种情况下,ChannelId 和 Level 应该是各自类型(Dio_ChannelType 和 Dio_LevelType)的常量副本。但是,如果没有额外的 CONST 宏定义,这里的 CONST 及其后的 AUTOMATIC 参数并不能直接形成有效的类型定义。在实际情况中,可能需要查阅更多的上下文或宏定义才能准确理解 CONST 和 AUTOMATIC 在这里的具体作用。

#define ADC_DEINIT_API   [!IF "AdcGeneral/AdcDeInitApi"!](STD_ON)[!ELSE!](STD_OFF)[!ENDIF!]

如果表达式 "AdcGeneral/AdcDeInitApi" 的值为 "STD_ON"(通常这会在某个配置文件或构建参数中设置),那么 ADC_DEINIT_API 将被定义为 "STD_ON";如果该表达式的值不是 "STD_ON",则假设为条件不满足,ADC_DEINIT_API 将被定义为 "STD_OFF"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值