MAC_McpsDataAlloc的使用

zigbee數據幀由高層(應用層)發起,在ZigBee設備之問進行數據傳輸的時候,要傳輸的數據由應用層生成,經過逐層數據處理後發送給MAC層,形成MAC層服務數據單元(MSDU)。通過添加MAC層幀頭信息和幀尾,便形成了完整的MAC數據幀MPDU,其幀結構如附件內所示。


據載荷傳輸到MAC子層就稱之爲MSDU,在MSDU的前面加上MHR,後面加上MFR就構成了MAC數據幀,也就是MPDU。其中MFR包含幀控制域、序列號和尋址信息域。MFR由16bitFCS構成。MPDU傳輸到物理層後就作爲物理層數據靜載荷,也就是PSDU。PSDU的前面加上SHR和PHR就形成了PPDU,其中SHR包含前導序列和SFD域;PHR由PSDU的長度值(字節表示)組成。


MAC_McpsDataAlloc獲得的一段ram,裏面包含了tx buffer打包到MPDU中,其中一個固定的offset(24字節)後指向MSDU。
MAC_McpsDataAlloc分配幀緩衝區時,會分配出整個PSDU需要的空間,而msdu.p是指向PSDU中MAC payload對應的offset。但是MAC_CbackEvent返回 MAC_MCPS_DATA_CNF時,msdu.p指向出錯,誤指向了幀頭。
通過加入以下代碼可以修正


  if ( event == MAC_MCPS_DATA_CNF )
  {
    uint8 *originalMsdup = (uint8 *)pData->dataCnf.pDataReq + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET;
    pData->dataCnf.pDataReq->msdu.len -= (uint8)(originalMsdup - pData->dataCnf.pDataReq->msdu.p);
    pData->dataCnf.pDataReq->msdu.p = originalMsdup;
  }
發佈了67 篇原創文章 · 獲贊 22 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章