嵌入式微系统架构是C#与CMSIS架构的复合体,如下图所示:
基于C#标准,分为应用层App与系统层System两层。采用两个大结构体AppStruct和SystemStruct把它们各自封装起来。
Appstruct里封装了两个结构体:Data和Menu。两者都是应用层的数据类型。
Data是应用层业务逻辑所涉及的传感器、驱动器等全局变量、过程变量、存储参数、设置参数等数据,Data结构体类似数据库概念,只是嵌入式系统数据一般不大,用一个结构体实现即可。
Menu是应用层需要的各种菜单显示页面,一个页面下可以加载多种控件,比如背景文字(BackText)、表(Chart)、标签(Label)和文本(TextBox)四种。目前版本msOS因为主要针对工控,支持本地支持黑白字库屏,所以只需要这四种控件即可,菜单结构相对简单,今后需要支持黑白点阵屏甚至是彩屏,需要支持的控件就更多了。
AppStruct可以认为是应用层App的数据库,里面包含了业务逻辑的数据库和菜单界面显示的各个页面。基于这种结构体封装的好处在于把全局变量统一到数据库中管理,尤其是业务逻辑中的全局变量都放到Data区中统一管理,这充分的利用了全局变量的使用便利性,又有效的避免全局变量满天飞,解决了长期以来引起极大争议的全局变量问题。
应用层分为三块,除了数据库意思的AppStruct外,还有业务逻辑(Logic)及菜单界面(Menu),两者分别跟工业自动化控制系统的可编程控制器(PLC)和组态屏(HMI)对应。在工业自动化中,PLC内部有业务逻辑参数存储单元,HMI内部有菜单页面存储单元,现在等价于把PLC和HMI的存储单元合并在AppStruct中来管理。
业务逻辑(Logic)响应各种传感器过来的信息,通过给定的算法或操作流程,及时指挥驱动器工作,所以需要设定在较高优先级的任务中。菜单界面(Menu)显示业务逻辑处理过程中需要显示的各种参数,只需要满足眼睛的刷新频率即可,所以刷新速度相对较慢,一般放在最低优先级任务中处理。需要注意的是,菜单界面不包括按键部分,按键产生按键消息,归入业务逻辑中,菜单界面只是显示各种参数,而不会去修改参数,这个保证了数据库只被业务逻辑一个任务修改,避免了一个数据同时被多个任务修改产生错误的问题。
SystemStruct封装了整个底层系统,抽象成一个面向应用的接口芯片。
Initialize为初始化函数,在系统应用前,必须要先初始化。
Device结构体中封装了各类设备,比如LCD、ADC、USART、IO、Timer等。
OS中封装了uC/OS-II的各种常用接口函数。
Gui中封装了界面处理接口。
AppStruct和SystemStruct都是一个自定义的结构体类型,需要用这两个类型定义一个对象。
定义应用层结构体。
定义系统层结构体。需要注意的是,因为采用结构体模拟类功能,System在定义的时候就指定了System的Initialize初始化函数,这样系统开始就可以使用System.Initialize功能,便于形式上的完美。
一个System结构体,封装了整个系统层,中间件接口及设备接口,都在System中体现,等价于一个面向于应用层的处理器,App运行于系统层之上,App只需要调用System中的接口即可,简单、易用,这样设计做到了跟实际的芯片无关性,比较容易跨平台,当需要更换芯片的时候,只需要保证System接口一致,应用层无需修改代码。