项目介绍
KQD开发平台致力零代码实现单片机的软件开发。
单片机软件开发一般分为两部分。一部分是驱动(基础软件)的开发。电路板上的各种器件控制,都由驱动软件来控制。一部分是应用软件的开发,应用软件用于实现具体的控制策略。
驱动层
在驱动层面上,KQD开发平台通过一些自动化编程工具,可以将驱动程序像积木一样自由搭配。传统的单片机软件开发与PC的软件开发有所不同,往往需要花费大量的精力用于硬件驱动的开发与测试。这种状况一方面是因为单片机的操作系统往往比较精简,不会集成太多的底层驱动,另一方面也是因为单片机的硬件系统的千差万别:行业习惯、成本因素、采购渠道等,常常使同一个功能需求存在很多的硬件设计方案。一般来说确定了硬件方案后,除了芯片厂商提供的硬件抽象层(HAL)代码,往上的驱动都需要结合实际电路从头开始编写与测试。同一款模数采集芯片,为了与自己的硬件系统进行匹配,整个单片机行业存在大量的重复劳动:阅读芯片手册、编写芯片驱动、反复测试等。KQD驱动平台正是为了改善这一状况而出现的,为了实现驱动程序的最大复用和自由组装,开发平台需要具备以下几点:
-
驱动模块的分层会比较细:
为了驱动程序能够最大可能的复用,每一个驱动模块的功能往往会比较单一,原来一个单一的驱动在KQD驱动平台下可能会被拆分成多层驱动。例如使用ENC28J60来实现以太网,传统方式下,往往会将ENC28J60做成一个驱动,供应用程序使用:

若有操作系统支持,ENC28J60驱动提供的接口可以是标准Socket接口,读写数据操作往往直接挂起任务,等待Socket完成操作后再返回。若没有操作系统支持,则除了Socket操作接口,往往还有驱动向上调用的Notification接口,来通知异步操作已经完成。
如果使用了标准的协议栈,例如Lwip,则会引入协议层:

出于通用性的考虑,Lwip的下级可能还挂载了其他Eth链路芯片,于是我们需要一个EthIf接口层来管理多个链路芯片:

注意到ENC28J60必须通过Spi来操作,ENC28J60可以调用标准的Spi驱动来实现其功能:

注意到有的芯片自带TCP/IP协议栈,例如W5500,如果需要将这类芯片也加入到这个系统中来,则需要引入一个TcpIpIf层来对各种TCP/IP的协议栈进行管理,那么最终整个以太网接口的驱动模块调用关系如下:

KQD开发平台中,考虑到同一个Spi端口会被不同的器件通过CS片选来分时复用,Spi会被继续细分成Spi和SpiL模块。SpiL模块用于处理数据的发送与接收,而Spi用于Spi通讯任务的管理和片选线的驱动:
-
每个驱动模块是可配置的:
KQD平台中的驱动在设计时会尽量考虑可配置性,以提高驱动模块的复用能力。驱动模块的配置一般有以下几种形式:
- 编译前配置:
顾名思义,配置行为发生在编译前,这也是传统单片机项目的主要配置方式。例如代码中通过一个宏定义来修改代码中的某些常量或者是某些行为,就是一种典型的编译前配置。宏的值一旦修改,则驱动模块必须重新编译才能生效。典型的,修改代码的优化等级,也是一种编译前配置。
- 链接期配置:
配置发生在链接期,这样在修改配置时,驱动模块可以不用重新编译。不用重新编译意味着以目标文件或者库文件发布的驱动模块同样具有配置能力。链接期配置一般将需要配置的值声明成外部常量(extern const),然后在链接的时候,根据配置生成一个专门的常量定义文件,最后一起连接生成最终文件。典型的,修改项目的内存加载文件,是一种链接期配置。
- 生成后配置:
 如上图所示,模块PduR的代码实现分成两部分,配置无关的部分PduR.c、配置相关的部分PduR_PBcfg.c。这两部分独立编译独立链接。通过链接加载控制文件控制代码和常量生成的位置。一般说来控制器在出厂时,MCU中首先烧录PduR.o文件。在调试和使用时,用户编译生成PduR_PBcfg.o并烧录到MCU。因为链接加载控制文件,PduR_PBcfg.o的烧录地址是确定的,PduR可以直接使用用户生成的PduR_PBcfg.o中的常量甚至是函数。
在KQD开发平台中,通过链接期配置完成硬件定义,通过生成后配置来调整驱动行为以及应用层逻辑的部署。为了避免用户编写硬件配置代码,我们为此专门发明了一种硬件配置语言,可以自动生成硬件配置界面,并且完成硬件配置有效性的检查:
配置界面脚本 | 配置界面呈现 |
 |  |
-
驱动的组装自动化完成:
驱动模块需要组合起来共同工作,就需要进行装配。人工编写代码进行装配费事费力而且容易出错;因此需要一套自动化的方案来完成所有驱动模块的装配工作,并最终生成编译项目,调用编译器生成用户可下载的HEX文件。
下面是KQD Designer的模块自动装配界面:

如图中所示:ECU状态管理模块EcuM,在单片机上电初始化时,会激活AL_DriverInitOne信号量,然后依次调用其他驱动模块中的Init槽。
应用层
目前通过KQD Application Editor来编辑应用层控制策略与逻辑。各种逻辑编写方式以插件的方式集成到KQD Application Edito软件中来。
目前POU程序单元的编写支持:
- 梯形图方式

- C语言方式:

除了POU逻辑的编写,KQD Application Editor还支持扩展功能,目前实现的扩展功能有:
- TinyLcd文本屏数据组态:

平台部署
KQD开发平台的部署如下图所示:添加电脑图标 编辑机组改成服务器图标

- 1. 控制器制造商通过KQD Designer将控制器的硬件配置上传到KQD固件编译服务器。
- 2. KQD固件编译服务器分析硬件配置信息后,将配置发送给编译器机组,调用编译器进行固件编译和连接,生成固件。
- 3. KQD固件编译服务器将固件发送给硬件配置的提交者:控制器制造商。
- 4. 控制器制造商通过KQD Designer将固件烧录到控制器中。
- 5. 控制器的使用者通过KQD Application Editor进行应用层策略和逻辑的开发,并下载到控制器中。
平台优势
- 中心化的驱动服务器
KQD开发平台可以慢慢积累常用器件的驱动程序,减少社会的重复性劳动。因为历史积累和使用量级的优势,服务器中的驱动会比临时需要而开发的驱动更加健壮与可靠。
- 自动化的系统配置过程
驱动的装配,硬件资源的分配,各种约束条件的检查均通过软件自动完成。不仅节约了时间,也杜绝了人工操作出错的可能性。
- 图形化的应用层工具
目前KQD开发平台提供梯形图编程工具和液晶屏组态工具。后续会针对行业应用开发更多的应用编辑工具,方便工艺人员进行开发。同时各种在线调试工具,使得控制器具备工业现场调试与编程的能力。
|