Linuxから移植して、イーサネットカード用のRTEMSドライバーを実装しています。ほとんどの作業が完了し、プロセッサ IO モードは正常に動作し、割り込み処理も行われています。現在、DMA の実装に問題があります。
具体的には、私がベースとして使用している Linux ドライバーでは、関数 dma_alloc_coherent() が使用されています。この関数は 2 つの異なるアドレスを返します。1 つはドライバー コード (ホスト CPU) が参照するアドレスで、もう 1 つはカードが DMA 中に PCI 経由で同じメモリ領域にアクセスするために使用するアドレスです。
適切な代替関数を見つけるのに問題があります。最初に malloc() を使用し、次に pci_pci2cpu を使用してこのアドレスを 1 つのカードがアクセスできるアドレスに変換することを考えましたが、pci_pci2cpu は IO に対して 0xFFFFFFFF を返し、残りの 2 つのモードに対して 0x0 を返します。
私が検討した2番目のアプローチは、デュアルポートメモリマネージャーを使用することですが、その使用法の有用な例が見つかりません。たとえば、rtems_port_create() 関数にはポインター *internal_start と *external_start を指定する必要がありますが、このポインターがどこから来ているのかわかりません。
Gaisler RTEMS バージョン 4.11 と Sparc アーキテクチャ (LEON3 cpu) を使用しています。
ベスト、イヴァン