<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

EMC2的硬件抽象層原理與實(shí)現

作者: 時(shí)間:2009-12-28 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/152181.htm

在Component中被映射為如下數據結構:


由上述結構可以看出,每個(gè)Pin對應一個(gè)相應類(lèi)型的指針,該指針指向的內存區便存放該引腳的值。


5 基于HAL的驅動(dòng)程序編寫(xiě)
hal_CNC由源文件hal_CNC.c和hal_CNC.h構成。hal_CNC.c定義了對hal_CNC的初始化、底層驅動(dòng)函數、hal_CNC退出時(shí)的操作等。rtapi_app_main()函數是載入Component時(shí)的程序入口。
首先申請當前Component的ID號,對Component的每個(gè)操作都由該ID號索引。
comp_id=hal_init(“hal_CNC”);
//hal_CNC為Component的名字
其次,分配組件運行時(shí)所需內存,代表Pin的指針指向的內存區域便是在此分配:
CNC_driver=hal_malloc(sizeof(CNC_struct));
接著(zhù)將所定義Pin導出到HAL。該操作通過(guò)調用自定義的export()函數來(lái)完成。以DAC模塊為例,操作如下:
for(n=0;n8;n++)
export_dac(n,CNC_driver); //導出Pin
每次調用export_dac()時(shí),都會(huì )調用如下語(yǔ)句注冊一個(gè)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的名稱(chēng)。軟PLC通過(guò)該名稱(chēng)對此Pin進(jìn)行引用。hal_pin_float_new()是HAL提供的函數,在新建Type為FLOAT型的Pin時(shí)使用。該函數一共有4個(gè)參數,依次是Pin名、Pin方向、Pin內存指針地址、Component ID。引腳方向HAL_IN表示該值是從軟件層“輸入”到HAL中的,該方向針對軟件層與HAL層而言。
對Pin進(jìn)行操作的Function也要導出到HAL:
hal_export_[unct(“CNC.DAC.write”,CNC_dac_write,CNC_driver,1,0,comp_id);其中“CNC.DAC.write”為軟件層使用該Function時(shí)引用的名字;CNC_dac_write為函數在C源文件中實(shí)際對應的C函數名稱(chēng);CNC_driver為Component的內存指針;1表示函數用到了浮點(diǎn)數;0表示該函數不可重入;comp_id為Component ID。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>