0

バックグラウンド

RTEMS を使用しており、ネイティブ NFS クライアントをセットアップしようとしています。これを正しく含めましたが、ドライバーで使用できる動的ドライバー エントリが十分ではありません。詳細については、こちらをご覧ください。

実装

追加の動的ドライバーをセットアップするには、フリー ドライバーの大きなテーブルに NULL 要素を追加する必要があります。以下を参照してください。

#define NULL_DRIVER_TABLE_ENTRY \
 { NULL, NULL, NULL, NULL, NULL, NULL}


#ifdef CONFIGURE_INIT
  rtems_driver_address_table Device_drivers[] = {
    #ifdef CONFIGURE_BSP_PREREQUISITE_DRIVERS
      CONFIGURE_BSP_PREREQUISITE_DRIVERS,
    #endif
    #ifdef CONFIGURE_APPLICATION_PREREQUISITE_DRIVERS
      CONFIGURE_APPLICATION_PREREQUISITE_DRIVERS,
    #endif

   ...

    #ifdef CONFIGURE_APPLICATION_EXTRA_DRIVERS
      CONFIGURE_APPLICATION_EXTRA_DRIVERS,
    #endif
    #ifdef CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER
      NULL_DRIVER_TABLE_ENTRY
    #elif !defined(CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER) && \
        !defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER) && \
        !defined(CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER) && \
        !defined(CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER) && \
        !defined(CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER) && \
        !defined(CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER) && \
        !defined(CONFIGURE_APPLICATION_EXTRA_DRIVERS)
      NULL_DRIVER_TABLE_ENTRY
    #endif
  };
#endif

基本的にこれが行っているのは、デバイス ドライバー テーブルの構築です...

deice ドライバーは次のようになります。

typedef struct {
  rtems_device_driver_entry initialization_entry; /* initialization procedure */
  rtems_device_driver_entry open_entry;        /* open request procedure */
  rtems_device_driver_entry close_entry;       /* close request procedure */
  rtems_device_driver_entry read_entry;        /* read request procedure */
  rtems_device_driver_entry write_entry;       /* write request procedure */
  rtems_device_driver_entry control_entry;     /* special functions procedure */
}   rtems_driver_address_table;

問題

非常に単純な問題は、これをビルドすると次のエラーが発生することです。

confdefs.h:568: error: too many initializers for 'rtems_driver_address_table'

ここを見ると、不特定の数のテーブル要素を使用してコンパイルする際の問題のようです。私が理解していないのは、これが現在機能NULL_DRIVER_TABLE_ENTRYしているということです.7秒(必要な数)を指定するNULLと失敗しますが、6NULL秒では完全に正常に動作しますか?

私が知る限り、このテーブルまたはその要素のサイズに関する定義はありませんか? 何か案は?

4

1 に答える 1

0

だから、これはばかげた間違いでした...

このテーブルが機能する方法は、NULL テーブル エントリです。

#define NULL_DRIVER_TABLE_ENTRY \
 { NULL, NULL, NULL, NULL, NULL, NULL}

実際には、に対応する配列内のエントリrtems_driver_address_tableです。このドライバーには 6 つの要素があり、私は 7 つにしようとしていました。これに対する解決策は、次のように余分な null エントリを追加することでした。

 rtems_driver_address_table Device_drivers[] = {

    ...

    #ifdef CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER
      NULL_DRIVER_TABLE_ENTRY,
      NULL_DRIVER_TABLE_ENTRY // Add extra entry here!

   ...

  };
于 2015-07-07T21:24:10.800 に答える