概述说明
嵌入式系统最主要的目标就是并行处理各种任务。由于各种外设的事务到达时间的差异,导致容易出现一段时间内出现大量的任务处理需求。对于FPGA来说还好,但是对于ARM来说就是多个中断的同时处理,容易出现问题。而且驱动之间的通信往往也需要进行并行处理,所以选择一个可以并行运行的模型很重要。 之前一般是通过函数进行区分,但是对于复杂的任务无法满足需求。后续通过技术储备学习,找到了一个相对通用的模型:节点模型。节点将每个模块划分为节点对象和输入输出以及连线。通过可视化的节点连接去描述设计的关系,可以提高对象的封装程度可以大幅提高程序的一致性和稳定性。 节点系统的实现方法很多,QT中有QtNode现成的框架实现,RTOS可以封装C的信号与槽实现固定的节点系统。FPGA本身就是并行节点,只需要用SV完成封装即可。目前通过一个[开源项目](https://gitcode.com/m0_46570640/logic),基本验证了节点模型在嵌入式的大部分场景下的封装效果。后续的设计说明基本上也是基于这个节点模型的开发验证。节点模型的组成
节点对象
一般在原型设计阶段,会对设计进行功能划分,划分出来的就是节点对象。这里顺带推荐一个软件:drawio,用于绘制原型设计非常高效,后续在嵌入式设计流程中会详细说明如何从头到尾开发一个嵌入式系统。这个属于嵌入式系统的功能定义的内容,不过在采用节点模型后,在节点定义的时候更加追求封装性,这样对洗头膏划分的准确性要求也有所提高,这个在后续的设计中会有所体现。输入输出
在可视化节点中,输入输出就是节点和其他节点的交互接口。对于非可视化的节点,则是具体的总线端口。ARM一般是一个指针加上数据长度,对于QT则是信号和槽,对于FPGA则是一组封装好的interface。统一的输入节点输出是节点系统标准化的关键,所以一般尽可能精简输入输出,将特殊逻辑集中到节点内部完成。节点连线
可视化节点一般采用现有的UI框架直接手动连线,而对于非可视化节点直接连接信号与槽就可以。通过精简的信号去表达节点之间的连接关系,也是设计封装性的体现。实际设计中,保证输入输出之间的连线兼容性,就可以提高灵活性,但是会提高设计复杂度,需要根据嵌入式系统的复杂度进行详细细分。节点模型部署方法
QtNode
QtNode是基于QT6的一个开源项目,可以可视化完成节点的设计,提供内置的节点封装模型。节点的各个要素都可以在QT中完成。还有一个python的节点系统的版本,这个在算法开发部分会涉及到。两个节点系统效果是等效的,开发区别就是一个C++,一个Python,两者在开发嵌入式系统的交互系统具备很好的效果。
QT5
一些嵌入式设备会搭建linux系统,一般部署的都是一些低版本的QT进行图形界面的开发。这个时候一般直接适用QT的信号与槽去实现节点,舍弃可视化节点的灵活性以换取性能。QT5的信号与槽天然就可以作为节点的输入和输出,而OOP的设计方法就可以完成节点的封装。在实际使用中,Qt5实现的固化节点系统基本上可以满足大部分的嵌入式系统开发的需求。RTOS
相较于完整的linux操作系统的支持,RTOS对于C++的支持偏弱,而且靠近终端的嵌入式系统也不大会去部署C++的程序。所以在RTOS上实现节点系统会稍微麻烦一点,需要在底层封装信号与槽的基础结构以及基于C的OOP设计方法。根据实际实现的效果,用结构体可以完成节点系统的封装以及信号与槽的实现。不过信号与槽之间的仲裁需要内置在节点内,这个需要内置模板去提高设计效率。System Verilog
SV对于OOP的支持较高,但是那个是用于仿真的,在RTL设计中,interface在一定程度上替代了class的作用。目前实测可以用interface实现类似C的OPP效果,然后配置自带的输入输出的效果,就可以完成节点系统的部署。与PS设计不同,PL天然的并行性对于节点系统的开发是简化了的。这里PL由于全部作为通用的bit数据处理,所以可以使用兼容性更广的总线完成节点模型的灵活性的提高。节点模型的标准化
从上章可以看出,节点在不同的嵌入式系统中实现的方法差异都比较大,要想实现标准化的输出,则需要在基本的节点要求下,增加一些设计的约束,以保证每个节点系统实现的框架基本一致。节点子系统(subsystem)
一般的嵌入式系统都包含很多基础的子系统,比如升级和存储等。所以节点模型一般作为节点子系统加入设计,负责应用层的功能统一开发。将节点划分为子系统,可以和一些其他的子系统完成并行存在,可以更好满足嵌入式系统的功能需求。节点模块(mdle)
节点模块,就是节点的集合,将节点进行分类开发,主要目标是提高节点的继承性和标准性。对于支持OOP的程序,构建一个基类节点去实现特定类型的节点需求是合理的。这个实际设计中也具备较高的价值,QtNode这类可视化节点则强制要求每个节点模块都包含一个基类。节点对象(node)
完成节点定义的类或者类似的语法结构,主要是节点的所有功能都封装为节点对象以及输入输出。这个也是节点开发拓展的基础单元,其他的模块都需要围绕这个对象进行展开。总线定义(interface)
输入输出的标准化单元,可以完成节点输入输出的兼容性保证。一般是由统一的数据结构加上数据结构的解析方法构成,可以体现节点之间是否可以相互连接的关系,是节点标准化处理的关键。总结说明
本文主要是描述节点模型的定义以及部署的方法,为后续的实战总结做好准备。节点模型是后面所有设计的方法学,基本上所有的设计都会用这个方法学进行展开,所以将这篇文章作为嵌入式设计的第二篇。后续如果在设计中有了对于节点模型新的感悟,会多节点模型的方法进行进一步补充,本次主要是对现有设计的方法进行总结,以保证可以按照这个模型的方法进行新的功能开发。