硬件在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;n<8;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。