CPU-I/Oカードデータ同期問題


1553B通信I/Oドライバの開発で発生した問題点をまとめます.

もんだいげんしょう


CPUとI/Oカード(1553 B)は、同時にデータブロックに非同期でアクセスすることができ、新旧データの混在の問題をもたらす.

プロセス

  • I/Oチップメニュー説明は、データ同期技術(Double Buffering)を用いて上記の操作が可能であるが、メーカーが提供するソフトウェアライブラリではこれらの機能は提供されていない.
  • の製造元に連絡したところ、リポジトリにこの機能が欠けていることがわかり、製造元は内部的な理由で変更できないとしています.
  • の複数回の協議を経て、私たちは最終的にセキュリティプロトコルを書き、メーカーからソースコードを取得し、リポジトリを直接修正し、使用することにしました.
  • はメーカーのソースコードを取得し、デュアルバッファ技術を採用し、Ping-Pongロジックを直接実施し、以下に示すように、お客様に信頼できるデバイスドライバを提供します.
  • Before

    dwDataBlkAddr = pNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr;

    After

    dwOldDataBlkAddr = FLEXMEMREAD(DevNum, (pMsgNode->U.Message.pMemNode->U.MemBlock.dwAceAddr + 2));
    
    if (dwOldDataBlkAddr == pDataNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr)
    {
    	dwNewDataBlkAddr = pDataNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr + BC_DUAL_MSG_SIZE;
    }
    else
    {
    	dwNewDataBlkAddr = pDataNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr;
    }