新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > EMC2的硬件抽象層原理與實現

        EMC2的硬件抽象層原理與實現

        作者: 時間:2009-12-28 來源:網絡 收藏

        4 HAL架構
        系統軟件架構如圖2所示。用HAL將各I/O通道、ADC通道、DAC通道、脈沖通道、編碼器通道成Pin,將對各模塊的操作成各個Function,將Pin和Function封裝在命名為hal_CNC的Component中。

        本文引用地址:http://www.104case.com/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不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 墨脱县| 忻城县| 沾化县| 东宁县| 永仁县| 藁城市| 长垣县| 商水县| 泗洪县| 阜平县| 腾冲县| 博湖县| 荔浦县| 巍山| 永州市| 天津市| 吴忠市| 西林县| 乌兰浩特市| 灌云县| 澄江县| 泽州县| 社旗县| 威信县| 洱源县| 开远市| 渭源县| 沙雅县| 阜新| 贵南县| 库伦旗| 普洱| 陇西县| 疏勒县| 隆子县| 光泽县| 乡宁县| 开鲁县| 宜宾市| 宝应县| 青铜峡市|