新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > EMC2的硬件抽象层原理与实现

EMC2的硬件抽象层原理与实现

作者:时间:2009-12-28来源:网络收藏

4 HAL架构
系统软件架构如图2所示。用HAL将各I/O通道、ADC通道、DAC通道、脉冲通道、编码器通道成Pin,将对各模块的操作成各个Function,将Pin和Function封装在命名为hal_CNC的Component中。

本文引用地址:http://www.eepw.com.cn/article/152181.htm

在Component中被映射为如下数据结构:


由上述结构可以看出,每个Pin对应一个相应类型的指针,该指针指向的内存区便存放该引脚的值。


5 基于HAL的驱动程序编写
hal_CNC由源文件hal_CNC.c和hal_CNC.h构成。hal_CNC.c定义了对hal_CNC的初始化、底层驱动函数、hal_CNC退出时的操作等。rtapi_app_main()函数是载入Component时的程序入口。
首先申请当前Component的ID号,对Component的每个操作都由该ID号索引。
comp_id=hal_init(“hal_CNC”);
//hal_CNC为Component的名字
其次,分配组件运行时所需内存,代表Pin的指针指向的内存区域便是在此分配:
CNC_driver=hal_malloc(sizeof(CNC_struct));
接着将所定义Pin导出到HAL。该操作通过调用自定义的export()函数来完成。以DAC模块为例,操作如下:
for(n=0;n8;n++)
export_dac(n,CNC_driver); //导出Pin
每次调用export_dac()时,都会调用如下语句注册一个Pin。
rtapi_snprintf(buf,HAL_NAME_LEN,“CNC.DAC.%d.value”,num);
hal_pin_float_new(buf,HAL_IN,(addr->dac_value[num]),comp_id);
其中“CNC.DAC.XXX.value”是Pin的名称。软PLC通过该名称对此Pin进行引用。hal_pin_float_new()是HAL提供的函数,在新建Type为FLOAT型的Pin时使用。该函数一共有4个参数,依次是Pin名、Pin方向、Pin内存指针地址、Component ID。引脚方向HAL_IN表示该值是从软件层“输入”到HAL中的,该方向针对软件层与HAL层而言。
对Pin进行操作的Function也要导出到HAL:
hal_export_[unct(“CNC.DAC.write”,CNC_dac_write,CNC_driver,1,0,comp_id);其中“CNC.DAC.write”为软件层使用该Function时引用的名字;CNC_dac_write为函数在C源文件中实际对应的C函数名称;CNC_driver为Component的内存指针;1表示函数用到了浮点数;0表示该函数不可重入;comp_id为Component ID。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭