以下の 2 つのコード ケースの違いを理解するのに問題があります。ケース 1は期待どおりに機能していますが、ケース 2はそうではありません。
問題の説明:デバイス ファイルに DWORDS のセットを書き込んで、DMA をトリガーする必要があります。DMA 容量は 128*4 バイト (128 DWORD) です。したがって、デバイスファイル記述子に128バイトを書き込んだ後、DMA(ioctlを使用)をトリガーして、容量を最大限に活用したいと考えています。個々の Dword に対してもこれを行うことができます。
2 つのケースの基本的な違い: 最初のケースでは 128 個の DWORD を一度にファイルに書き込み、2 番目のケースでは DWORD を個別に書き込み、128 個の DWORD が書き込まれた後に DMA をトリガーします。
どちらの場合も、ファイルに書き込まれるデータは同じですか? 2番目は機能していないため、何か問題があります。助けてください。動作しないということは、DMA コマンドの期待される結果が発生していないことを意味するため、2 番目のケースでは、ファイル記述子のデータは dma コマンドの直前の最初のケースと同じではありません。
ケース 1 (動作中)
int input_dwords[128] = {0xAABBCCDD, 0XBBCCDDAA, ....} //128 DWORDS (actually this data is in
//text file just putting in array for
//illustration)
int cmd_buf = (int*)malloc(sizeof(int) * 128); //space for 128 DWORDS
int* cur = cmd_buf;
for(int i = 0; i< 128; i++)
{
*cur = input_dword[i]
cur++;
}
//Write to file in one shot
write(fd, cmd_buf, sizeof(int)*128);
//trigger DMA (ioctl)
trigger_dma(fd);
ケース 2 (動作しない)
int input_dwords[128] = {0xAABBCCDD, 0xBBCCDDAA, ....}
int* cur = (int*)input_dwords;
for(int i = 0 ; i< 128 i++)
{
//writing to file one DWORD at a time.
write(fd, cur, sizeof(int));
cur++;
}
//trigger DMA (ioctl)
trigger_dma(fd);