LinuxCNC学习(七)HAL硬件抽象

简单说明

以下内容主要参考《LinuxCNC开放式数控平台系统分析及应用》华南理工大学出版社出版一书,仅供参考,不当之处请以该书或LinuxCNC官网为准。本文仅用于个人学习记录。

HAL在LinuxCNC中的用途

linuxCNC为使得运动控制器可以忽略底层硬件平台的差异,集中实现运动控制相关的轨迹规划与插补计算功能,屏蔽不同平台的驱动细节,引入了硬件抽象层HAL(hardware abstracton layer)屏蔽底层具体硬件平台,实现平台无关与平台相关代码的分离。整个LinuxCNC数控系统的软件结构图:
LinuxCNC软件结构体

HAL的基本概念

数控机床包括了主轴控制器、伺服控制器、步进电机、编码器、限位开关、按钮等外部硬件,HAL的设计理念是将这些设备抽象成一个个组件,每个组件都有其特有的参数、输入输出信号以及特定功能的函数模块。通过配套的软件工具或脚本文件,将各个组件的输入输出信号进行配置连接,设置需要的参数项,编写功能函数,将全部组件完成互联,实现一个完整的HAL系统,将生成的HAL系统模块导入LinuxCNC中即可完成复杂的系统。

HAL的基本概念

  • component(组件)
    一个HAL组件就是一个软件模块,其内有明确的输入、输出和行为等,并且可以按需进行安装和与其他组件进行内联连接。
  • parameter(参数)
    对类似伺服驱动器调速按钮、测试点的抽象。参数有两种:输入参数,类似于电位器,可以被用户进行调整,一旦设定将不能改变;输出参数,不能被用户调整,类似于允许内部信号被检查的测试点。
  • pin(引脚)
    HAL组件的端子也叫HAL引脚,所有引脚都有名称,引脚的名字用于和组件之间互相连接。HAL引脚是内部的软件实体,和实际硬件不关联。
  • phsical_pin(物理引脚)
    实际的物理引脚,如I/O,并口等。
  • signal(信号)
    连接各个组件的引脚,等价于导线,允许断开或重新连接。
  • type(类型)
    限定引脚和信号类型,同类型的信号或引脚才能互联。包括bit型(TRUE/FALSE,ON/OFF)、float型(64位浮点数)、u32型(无符号32int)、s32型(有符合32int)。
  • function(函数)
    组件在收到输入信号后,在实时线程内执行的函数实体。
  • Thread(线程)
    创建一个特定运行顺序的实时任务。

HAL基本原理

HAL在原理上与设计PCB电路板相似。首先选定主控,然后将主控和各功能芯片以及附属元件连接形成一个具有一定功能的PCB电路板,最后进行连接并测试系统的完整性。HAL依照PCB电路设计的基本原则,提出以模仿硬件芯片功能为核心的Componed(组件)模块机制,以及以signal(信号,模拟硬件电路中的导线功能)为媒介的模块互联机制。
Component的功能由Function体现,Component的特异性由Parameter决定,输入与输出数据由其pin(引脚)完成。
Function每次运行的流程:读取输入引脚数据->执行相应的处理逻辑->输出数据到输出引脚上。沟通不同Component之间数据传递的通道是Signal。Thread是HAL模块的"发动机",Component将自身的功能Function按一定的次序加入到Thread任务,由Thread周期的执行这些Function,从而依次触发各模块运算后状态更新。以下是一个典型HAL模块互联与工作原理示意图。
HAL模块互联与工作原理示意图
组件的功能函数加入到Thread的顺序决定了其更新的先后次序。最终在Thread周期调度时,数据将按照图中所示的模块之间流通。用户在新增功能模块时,只要将功能模块封装成HAL格式的软件模块即可。HAL通过config脚本文件配置各个模块之间的连接关系,从而将各个功能模块相互连接,完成最终的功能整合,就如同一块完整的PCB电路板的连线。

HAL在LinuxCNC下的实现

标准的Linux并非实时内核,而LinuxCNC作为数控系统,需要强的实时保证。因此,LinuxCNC被开发者编码成支持两种实时的Linux内核,即RTLinux和RTAI实时内核。这两种实时内核都提供了实时任务的创建、调试以及实时任务间的实时通信机制,但不同的实时系统对应的实时任务相关API接口在函数定义、参数类型等方面各有不同,为了屏蔽所支持的两种实时平台的接口函数差异,LinuxCNC抽象了RTAI实时接口层,从而给上层HAL库提供了一个统一的实时接口RTAPI。HAL库构建于统一的实时接口RTAPI之上,用一个软件框架封装了HAL的实现。用户则根据HAL库提供的API,将硬件驱动或软件算法封装成一个个的HAL下的Component,从而整合进LinuxCNC中得以运行。软件结构图如图所示:
HAL软件结构
LinuxCNC将RTAPI以及HAL库均编写成Linux内核模块,从而动态地提供Linux实时调度与HAL软件模块功能。在LinuxCNC中,HAL被实现成一块大小约26KB的全局共享内存,并存储了所有HAL模块向HAL库申请的软件HAL实体,包括Component及其导出的pin引脚、作为导线模拟的Signal、作为芯片功能模拟的Function软件实体等。用户通过调用HAL库提供的API,向HAL模块注册登记自己申请的组件资源。在HAL库内部,所有的抽象的软件实体(包括Component、pin、Signal、Parameter、Function、Thread)均被封装成一个结构体作为其描述,并以链表的形式加以管理,HAL库提供了向对应链表中增加、删除、搜索对应元素的功能函数。用户编写任何HAL组件,均会将此块内的数据映射进自己的地址空间,实现访问向HAL库申请的资源。

结束

其中HAL内的Motion组件、Axis组件、iocontrol组件、通用组件等,以及硬件设备驱动添加到HAL请参考《LinuxCNC开放式数控平台系统分析及应用》一书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值