任务单 #26459

複数シリアルポートの同時使用対応

开放日期: 2011-10-04 21:50 最后更新: 2011-11-06 21:39

报告人:
属主:
状态:
开启 [Owner assigned]
组件:
(无)
里程碑:
(无)
优先:
5 - Medium
严重性:
5 - Medium
处理结果:
Fixed
文件:

Details

現状のシリアルポート実装は

  • 「システムで使用するシリアルポートは唯一。」
  • 「唯一のシリアルポートはログ出力。」

という暗黙前提がある。

このため「システムに別のUART機器を接続したい」時にかなり不便である。

(例)GPSモジュールをつなぎたい。他の機器と通信したい。パソコンと接続したいが、ログ出力は別にみたい。など。

例えば、現状の実装の場合、複数のシリアルポートを使用する必要がある場合、

  • target_syssvc.hの「#define TNUM_SIOP_UART」を変更。
  • target_config.cのtarget_initializeでピン設定を初期化。
  • どこかでATT_ISRで対象UARTの割り込みハンドラを追加。(初心者はここでハマりそう。)

と3つの手順を踏まなければならない。
本来これらはカーネル依存部で吸収できる内容である。

そこで、以下のように実装を改め、カーネルユーザがtarget_syssvc.hを変更するだけで複数のシリアルポートを使えるように変更する。

  • 予め4つのポートIDをtarget_syssvc.hに定義する。
    1. #define SIO1_PORTID (1)
    2. #define SIO2_PORTID (2)
    3. #define SIO3_PORTID (3)
    4. #define SIO4_PORTID (4)
  • ユーザが使用するUARTポートは、target_syssvc.hにおけるボーレート宣言(SIO_BAUD_RATE_PORTx)の有無で判定する。
    • 全てのポートのボーレートが等しいというケースはまれなので、デフォルトの宣言は削除する。
    • 一般に、デフォルトというのはどのようにどこまで適応されるか分かりづらい。
    • 「ボーレートを宣言したポートが有効になるんだな」の方がよっぽど明確。
      1. /**
      2. * \brief シリアルポート1のボーレート
      3. * \details
      4. * この定義を有効にした場合、PORT1が使用可能になる。
      5. * 実装の詳細はtarget_config.cにある。
      6. */
      7. #define SIO_BAUD_RATE_PORT1 (57600)
  • target_config.cにおけるtarget_initialize関数内部で「#if defined (SIO_BAUD_RATE_PORTx)」を用い、ピン設定とtarget_uart_init(SIOx_PORTID)による初期化を行なう。
    1. switch (siopid) {
    2. case 1:
    3. #if defined(SIO_BAUD_RATE_PORT1)
    4. uart_write( reg, UART_DLL, DLL((SIO_UART_CLOCK/SIO_BAUD_RATE_PORT1/16)) );
    5. uart_write( reg, UART_DLM, DLM((SIO_UART_CLOCK/SIO_BAUD_RATE_PORT1/16)) );
    6. #endif
  • pdic/uart.hで「#if defined (SIO_BAUD_RATE_PORTx)」を用い、必要な割り込み番号定義を行なう。
    1. #if defined (SIO_BAUD_RATE_PORT2)
    2. #define INHNO_SIO2 INHNO_UART1
    3. #define INTNO_SIO2 INHNO_UART1
    4. #endif
  • 割り込み優先度と属性の定義をchip_serial.hで行なう。
    1. #define INTPRI_SIO1 3 /* 割込み優先度 */
    2. #define INTPRI_SIO2 3 /* 割込み優先度 */
    3. #define INTPRI_SIO3 3 /* 割込み優先度 */
    4. #define INTPRI_SIO4 3 /* 割込み優先度 */
    5. #define INTATR_SIO1 0 /* 割込み属性 */
    6. #define INTATR_SIO2 0 /* 割込み属性 */
    7. #define INTATR_SIO3 0 /* 割込み属性 */
    8. #define INTATR_SIO4 0 /* 割込み属性 */
  • 割り込みハンドラはchip_serial.cfg内で自動的に登録するようにする。
    1. #if defined(SIO_BAUD_RATE_PORT1)
    2. ATT_ISR({ TA_NULL, SIO1_PORTID, INTNO_SIO1, sio_isr, 1 });
    3. CFG_INT(INTNO_SIO1, { TA_ENAINT | INTATR_SIO1, INTPRI_SIO1 });
    4. #endif




上記カーネル依存部の対応により

  • アプリケーション設計者はtarget_syssvc.hのみを変更すればシリアルポートを使用可能になる。
  • ピン設定に変更が必要な場合にのみ、target_config.cの実装を見れば良い。

と2箇所のケアだけで済む。

任务单历史 (3/4 Histories)

2011-10-04 21:50 Updated by: shintamainjp
  • New Ticket "複数シリアルポートの同時使用対応" created
2011-10-04 22:48 Updated by: shintamainjp
  • 处理结果 Update from to Fixed
评论

r522に対してのレビューをお願いします。

2011-10-11 20:26 Updated by: shintamainjp
评论

r523で対応ミスを修正。SIO_BAUD_RATE_DEFAULTが使用されていた実装を修正した。

2011-11-06 21:39 Updated by: suikan
评论

ポートの活性化方法がトリッキーであるのできちんとターゲット依存部のテキストにドキュメント化することが必要である。

Attachment File List

No attachments

编辑

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » 登录名