Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk mengoptimumkan pemacu kad rangkaian SylixOS

Bagaimana untuk mengoptimumkan pemacu kad rangkaian SylixOS

WBOY
WBOYke hadapan
2023-05-14 11:16:141282semak imbas

1. Persekitaran pembangunan

  • Sistem pengendalian: SylixOS

  • Persekitaran pengaturcaraan: RealEvo-IDE3.1

  • Platform perkakasan: Papan pembangunan AT9x25

1 Pelaksanaan teknikal

Selepas menulis pemacu kad rangkaian, yang boleh merealisasikan fungsi penghantaran dan penerimaan asas, Ini. artikel akan memperkenalkan secara ringkas cara mengoptimumkan fungsi penghantaran pemacu kad rangkaian dan meningkatkan prestasi penghantaran dan masa nyata penghantaran.

1.1 Pengoptimuman daya hantar kad rangkaian

Pemandu kad rangkaian boleh meningkatkan daya hantar melalui salinan sifar. Pemacu memanggil fungsi penghantaran enetCoreTx untuk merealisasikan penghantaran mesej Ethernet. Fungsi ini menerima dua parameter, iaitu penunjuk jenis struktur netdev dan penunjuk jenis pbuf. enetCoreTx akan menyalin kandungan yang ditunjuk oleh pbuf ke penimbal hantar DMA yang ditunjuk oleh deskriptor hantar. Salinan ini akan memberi kesan tertentu pada daya hantar penghantaran.

Oleh itu, apabila mengoptimumkan, anda boleh menukar alamat penimbal yang ditunjuk oleh deskriptor DMA kepada muatan ahli struktur pbuf untuk menunjuk ke alamat di mana mesej sebenarnya perlu dihantar. Pelaksanaan khusus adalah seperti yang ditunjukkan dalam penyenaraian program 21.

Senarai Program 21 Pengoptimuman salinan sifar

  if (usLen == pstPbuf->len) {
        if ((pstPbuf->type != PBUF_REF)&& (pstPbuf->type != PBUF_ROM)) {
            bCopy = LW_FALSE;
        }
    }
 
    if (!bCopy) {
        pbuf_ref(pstPbuf);
       pEnet->pTxRing[iHead].iTxBaddr = (UINT32)pstPbuf->payload;
        API_CacheFlushPage(DATA_CACHE,pstPbuf->payload, pstPbuf->payload, LW_CFG_VMM_PAGE_SIZE);
    } else {
       pEnet->pTxRing[iHead].iTxBaddr =(UINT32)pEnet->NET_pTxInfo[iHead].TXI_pvDmaAddr;
        pbuf_copy_partial(pstPbuf,(PVOID)(pEnet->pTxRing[iHead].iTxBaddr), usLen, 0);
    }

Dalam kod di atas, pembolehubah bCopy menunjukkan sama ada operasi salinan sifar diperlukan.

Apabila menggunakan pengoptimuman salinan sifar, anda perlu memberi perhatian kepada aspek berikut:

1. Apabila jenis pbuf adalah jenis REF atau ROM, salinan sifar tidak boleh dilakukan.

2. Apabila melakukan salinan sifar, anda perlu memanggil fungsi API_CacheFlushPage untuk mengosongkan cache. Pada masa yang sama, anda juga perlu memanggil fungsi pbuf_ref untuk meningkatkan nilai ref ahli pbuf sebanyak 1.

3. Selepas memanggil fungsi pbuf_ref, anda perlu membebaskan pbuf salinan sifar secara manual dalam gangguan. Panggil fungsi pbuf_free apabila percuma. Tetapi kerana operasi ini dilakukan dalam gangguan, jika fungsi ini dipanggil terus dalam fungsi perkhidmatan gangguan, ralat akan dilaporkan. Dalam pelaksanaan khusus, baris gilir kerja boleh digunakan untuk menambah operasi yang perlu melepaskan pbuf ke baris gilir kerja.

2.2 Pemacu kad rangkaian menghantar dalam masa nyata

Apabila pemacu kad rangkaian menghantar, ia perlu menentukan sama ada deskriptor semasa boleh digunakan untuk menghantar mesej Operasi umum adalah menunggu melalui gelung sementara Apabila deskriptor tersedia, operasi penghantaran dilakukan. Ini akan memberi kesan tertentu pada prestasi masa nyata.

Di sini anda boleh menggunakan semaphore untuk mengoptimumkan proses penghantaran, dengan itu mengoptimumkan sifat penghantaran rangkaian masa nyata.

Mula-mula, buat semaphore mengira semasa pemulaan rangkaian. Nilai ialah bilangan deskriptor penghantaran yang ditetapkan pada masa ini.

Apabila anda perlu menghantar, anda perlu memanggil fungsi API_SemaphoreCPend untuk mendapatkan semaphore Selepas berjaya mendapatkannya, anda boleh melakukan operasi penghantaran berikut.

Begitu juga, dalam fungsi perkhidmatan gangguan, jika dikesan bahawa gangguan dihantar dengan jayanya, anda perlu memanggil fungsi API_SemaphoreCPost untuk melepaskan semaphore.

Pelaksanaan khusus ditunjukkan dalam Penyenaraian Program 22 dan Penyenaraian Program 23.

Senarai Program 22 Dapatkan semaphore

#ifAT_TX_REALTIME > 0
    API_SemaphoreCPend(pEnet->NET_hTxRdyCnt,LW_OPTION_WAIT_INFINITE);
#else

Senarai Program 23 Lepaskan semaphore

#ifAT_TX_REALTIME > 0
     API_SemaphoreCPost(pEnet->NET_hTxRdyCnt);
#endif

Atas ialah kandungan terperinci Bagaimana untuk mengoptimumkan pemacu kad rangkaian SylixOS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam