首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
EMC2的硬件抽象层原理与实现
来源:本站整理  作者:佚名  2009-12-28 10:41:50




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

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

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:93,292.97000 毫秒