5.2 AI数据接口

本文探讨了AI数据接口的设计,包括初始化、读写操作、属性管理、取代操作和遥测越限。介绍了如何构建AI模块的接口函数,如apiAIInit、apiGetAI和属性读取接口,强调了互斥锁的封装和资源管理。此外,文章还讨论了取代操作的两种策略,并指出遥测越限不应内嵌在AI模块内部,以保持AI属性的简洁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本小节,我们尝试从一个相对简单的模块出发,尝试提炼接口抽象函数,而在基本数据模型中,模拟量输入AI模块就是最基础的数据模型。

欲构建AI模块抽象接口,需先进行需求分析。AI是基础数据模型,不仅是各种高级数据模型的基础,也是各种应用模块的基础,如规约、液晶等。汇总后AI的需求主要包括:

  1. 初始化。
  2. AI值,包括读写操作。
  3. 属性,包括个数、名称、描述、单位、精度等属性值。
  4. 取代操作。
  5. 遥测越限等高级应用。

◇◇◇

除了没有状态量的简单模块,大部分模块都需要一个初始化接口函数,示例如下:

/* AI模块初始化 */
BOOL apiAIInit(void);

不同于其他接口,apiAIInit接口函数一般不是由应用层直接调用的,大概率是被api层统一的初始化接口函数调用的,这表明apiAIInit接口函数是一层内部函数。

还记得我们在文件全局观中的约定吗?一个模块对应3个文件,因此AI模块对应ai.c,ai.h和aiPrivate.h三个文件,而apiAIInit接口函数就应该位于aiPrivate.h文件中。

◇◇◇

AI模块最基本的操作是读取单个AI值,此时有两种命名风格:apiGetAI和apiAIGet,哪一种风格好呢?apiGetAI阅读起来会更加自然一些,但apiAIGet命名规范隐含面向对象思维,且程序输入更友好,也便于记忆。因此,我们团队习惯使用“名词+动词”命名风格。

读取AI值,如果仅从字面翻译,接口函数应该命名为apiAIRead(…)。但如果全部遵从最佳文学用词,可能仅基本数据模型就会有很多组动词。这种命名习惯会增加大家的编码和记忆难度,我们团队内部反复协商后,最后大家一致同意采取统一的中性动词对:get/set。

一些类库命名接口函数时,为了减少编码键入工作量,喜欢将最常使用的接口函数压缩到最短,如将读AI压缩为apiAI(…)。这种策略一则需要决定哪个函数最常用,二则增加接口函数记忆负担,额外考虑目前接口函数编码一般都是借助自动输入工具,我们团队不允许使用这种命名策略。

AI接口函数,对外提供接口,对内功能封装,其中很重要的一点就是对互斥锁的封装。AI读写存在互斥,但很多初级程序员难以驾驭互斥信号量,因此最佳策略就是将互斥锁操作封装在AI接口函数内部。这样,仅需要少量高级程序员编写AI模块,而大量的应用功能可以由初级程序员完成,提高人力资源利用率。

目前,基于cortex-m核的单片机都已经是32位的,其中M4核的单片机还支持单精度浮点数运算,这些不仅为微机保护设备研发带来了诸多便利,也将计算能力提升到了32位,也即常规的单精度浮点数操作可以单指令内完成,单个读写之间不存在互斥了。顺势而为,我们将AI的数据类型约定为单精度浮点数。汇总前面的所有分析,读取单个AI值的接口函数如下:

/*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值