#navi(Fdau)
#contents
-[[TOPPERS本家:http://www.toppers.jp/index.html]]
-[[ITRON TCP/IPの仕様書:http://www.ertl.jp/ITRON/SPEC/tcpip-j.html]]

* Field Data Aquision Unit Development [#ua82c4bf]

*おしらせ [#m868a663]
-TOPPERSカーネルをアップデート1.4.1
-TINETをアップデート1.2.1

*TODO [#a81a7bff]
-fdml_sampling_taskとfdml_logging_taskは、fdml_rtc_taskに統合したので削除。

*TOPPERSアプリケーションの作り方 [#e8487f24]
-%%TOPPERSディレクトリ直下でconfigureする方法%%
-%%nservを参考にする方法%%
--%%本体はtinet/netapp/dbg_cons.c%%
-Interface誌2003年9月〜連載があった。
-[[ToppersDevel]]参照

*FDAUアプリケーション [#zd8e8b9e]

**ファイル一覧 [#fb11e093]
|~ファイル名|~内容|
|adc.h |adc.cのヘッダ|
|adc.c |ADC制御関数|
|eeprom.h |eeprom.cのヘッダ|
|eeprom.c |EEPROM制御関数|
|fdau.cfg |fdau.cのコンフィギュレーション|
|fdau.h |fdau.cのヘッダ|
|fdau.c |FDAU全体の制御|
|fdau_cons.cfg |fdau_cons.cのコンフィギュレーション|
|fdau_cons.h |fdau_cons.cのヘッダ|
|fdau_cons.c |コマンドインタプリタ|
|fdml.cfg | fdml.cのコンフィギュレーション|
|fdml.h |fdml.cのヘッダ|
|fdml.c |FDML変換、送信タスク|
|route_cfg.c|ルーティング処理|
|rtc.h|rtc.cのヘッダ|
|rtc.c|RTC制御関数|


**定数一覧 [#u0828a37]
|~定数名|~値|~内容|
|FDAU_PRIHIGH|9|FDAU優先度高|
|FDAU_PRIMID|10|FDAU優先度中|
|FDAU_PRILOW|11|FDAU優先度低|
|FDAU_STACKSIZE|1024|FDAUスタックサイズ|
|FDAU_AVG_N|3|平均回数|
|RAM_VER|0x218000|リングバッファバージョン|
|RAM_DSIZE|0x218001|要素のサイズ|
|RAM_TOP|0x218002|リングバッファTOPポインタ|
|RAM_BOTTOM|0x218004|リングバッファBOTTOMポインタ|
|RAM_START|0x218010|リングバッファの先頭|
|RAM_END|0x21fffff|リングバッファの最後|
|FDML_PRIMID|5|FDML優先度中|
|RTC_ADRS|0x600000|RTCのベースアドレス|


**グローバル変数 [#d360ab7a]
|~変数名|~ファイル名|~内容|
|fdau_flag_init   |fdau_cons.c  |設定モード判定用フラグ。3秒以内にキー入力するとTRUEになる。|
|fdau_flag_event  |fdau_cons.c  |イベント検出時TRUEになる|
|fdau_flag_retry  |fdau_cons.c  |リトライ時TRUEになる|


**タスク分割 [#e4e754d2]
|~タスク名|~優先度|~ファイル|~起動条件|~内容|
|fdau_rtc_task|10|fdau.c|常時ループ|RTCを読んで、各タスクを起動する|
|fdau_sampling_task|11|fdau.c|fdau_rtc_task|サンプリングタスク(移動平均SAMPLING_AVR_N回)|
|fdau_logging_task|11|fdau.c|fdau_rtc_task|ログタスク(固定RAM領域のリングバッファ)|
|fdau_send_task|11|fdau.c|fdau_rtc_task|FDML送信タスク|
|fdml_client_task|5|fdml.c|fdau_sampling_task, fdau_send_task|FDMLクライアントタスク|
|fdml_send_task|5|fdml.c|データキュー|FDAML変換、HTML化、TCPコネクト、TCP送信|
|fdml_recv_task|5|fdml.c|fdml_client_task|HTTPレスポンス処理|
|fdau_cons_task|9|fdau.c|シリアル入力|FDAUタスク(メイン&コンソール)|

***fdau_rtc_task [#c29e91b7]
-RTCを読んで、各タスクを起動する
-サンプリング周期になったらfdau_sampling_taskをwup_taskする。
-ロギング周期になったらfdau_logging_taskをwup_taskする。
-送信周期になったらfdau_send_taskをwup_taskする。


***fdau_sampling_task [#y1f4b300]
-サンプリングタスク(移動平均SAMPLING_AVR_N回)
-もし、送信イベント状態になっていたら、fdml_client_taskをwup_taskする。

***fdau_logging_task [#h211c160]
-ログタスク(固定RAM領域のリングバッファ)
-最終サンプリングデータをRAMリングバッファに格納する

***fdau_send_task [#nc16dad7]
-FDML送信タスク
-fdml_client_taskをwup_task

***fdml_client_task [#l0b13aff]
-FDMLクライアントタスク
-RAMリングバッファの内容をFDML化する
-fdml_recv_taskをwup_task
-fdml_send_taskをwup_task

***fdml_send_task [#hefb6352]
-FDAML変換、HTML化、TCPコネクト、TCP送信

***fdml_recv_task [#qda57bbc]
-HTTPレスポンス処理

***fdau_cons_task [#t8241212]
-FDAUタスク(メイン&コンソール)

**タスク間通信と同期 [#bc00bb7f]
|~ID|~内容|~取得|~開放|
|SEM_RAM|リングバッファのセマフォ|アクセス前|アクセス後|


**汎用関数 [#u3e3e251]
|>|LEFT:~A/D変換器制御(adc.h, adc.c)|
|ER adc_init(void);|A/D変換器初期化|
|ER adc_get(UB ch, UH *dat);|A/D変換値を取得|
|>|LEFT:~EEPROM関数 (eeprom.h, eeprom.c)|
|ER eeprom_init(void);|EEPROM I/Fの初期化|
|ER eeprom_gets(UINT adr, UB *dat, UINT len);|文字列取得|
|ER eeprom_puts(UINT adr, UB *dat, UINT len);|文字列書込み|
|>|LEFT:~RTC制御 (rtc.h, rtc.c)|
|ER rtc_init(void);|RTC I/F初期化|
|ER rtc_set(struct tm *p_tm);|RTCに時刻を設定|
|ER rtc_get(strust tm *p_tm);|RTCから時刻を取得|
|>|LEFT:~tinet/netapp|
|UB *skip_blanks (UB *line);| |
|int cons_getline (UB *line, int size);| |
|char *get_int (int *val, UB *line);| |
|char *get_xuint (unsigned int *val, UB *line);| |
|void cons_putchar (ID portid, char ch);| |
|int cons_putnumber(ID portid, ULONGEST val, int radix, const char *radchar, int width, BOOL minus, char padchar);| |
|void cons_printf (ID portid, const char *fmt, ...);| |
|int put_macaddr (ID portid, char *mac, int width);| |
|int put_ipv4addr (ID portid, ULONGEST *addr, int width);| |

-RTC関数の引数はstruct tm型とした。p_tm->mdayは1月が0なので注意。

**EEPROMマップ [#ba56511d]
|~定数           |~アドレス|~容量|~内容             |~デフォルト定数|~デフォルト値|
|>|>|>|>|>|LEFT:~システム定数 3bytes|
|ROM_VER         |0x0000   |1    |バージョンチェック|ROM_VER_DATA |0x10 |
|ROM_ADC_N       |0x0001   |1    |ADCチャンネル数   |FDAU_ADC_MAX |8    |
|ROM_IO_N        |0x0002   |1    |I/Oチャンネル数   |FDAU_IO_MAX  |8    |
|>|>|>|>|>|LEFT:~HTTPヘッダ定数 70bytes |
|ROM_HT_SCRIPT   |0x0004   |32   |HTTPスクリプト    |FDAU_DEF_HT_SCRIPT   |"/cgi-bin/log/pl" |
|ROM_HT_VER      |0x00--   |0    |HTTPバージョン    |FDAU_DEF_HT_VER      |"HTTP/1.0"        |
|ROM_HT_BOUNDARY |0x00--   |0    |HTTPバウンダリ    |FDAU_DEF_HT_BOUNDARY |"7d126a16201ea"   |
|ROM_HT_HOST     |0x0024   |4    |ホストIPアドレス  |FDAU_DEF_HT_HOST     |"192.168.1.101"   |
|ROM_HT_PORT     |0x0028   |2    |ホストポート      |FDAU_DEF_HT_PORT     |8080              |
|ROM_HT_PRIORITY |0x002a   |8    |HTTP優先度        |FDAU_DEF_HT_PRIORITY |"high"            |
|ROM_HT_AUTH_EXT |0x0032   |8    |HTTP認証モード    |FDAU_DEF_HT_AUTH_EXT |"basic"           |
|ROM_HT_AUTH     |0x003a   |16   |HTTP認証          |FDAU_DEF_HT_AUTH     |"DTU"             |
|>|>|>|>|>|LEFT:~FDMLヘッダ定数 24bytes|
|ROM_FD_SYSTEMID |0x0050   |8    |システムID        |FDAU_DEF_FD_SYSTEMID |"DTU"             |
|ROM_FD_GROUP    |0x0058   |8    |グループID        |FDAU_DEF_FD_GROUP    |"10561"           |
|ROM_FD_VER      |0x0060   |8    |FDMLバージョン    |FDAU_DEF_FD_VER      |"1.0.2"           |
|>|>|>|>|>|LEFT:~ADCチャンネル定義(FDAU_ADC_MAX個必要) 39bytes x 8 = 312bytes|
|ROM_ADC_NAME*   |0x0068   |8    |チャンネル名称    |FDAU_DEF_ADC_NAME    |V*                |
|ROM_ADC_TYPE*   |0x00--   |1    |データの型        |FDAU_DEF_ADC_ATTR    |2 (double)        |
|ROM_ADC_UNIT*   |0x00--   |8    |単位              |FDAU_DEF_ADC_UNIT    |V                 |
|ROM_ADC_MAX*    |0x00--   |4    |データの最大値    |FDAU_DEF_ADC_MAX     |5.0               |
|ROM_ADC_MIN*    |0x00--   |4    |データの最小値    |FDAU_DEF_ADC_MIN     |0.0               |
|ROM_ADC_A2*     |0x00--   |0    |データ関数のa2    |FDAU_DEF_ADC_A2      |0.0               |
|ROM_ADC_A1*     |0x00--   |4    |データ関数のa1    |FDAU_DEF_ADC_A1      |0.0000762939453125|
|ROM_ADC_A0*     |0x00--   |2    |データ関数のa0    |FDAU_DEF_ADC_A0      |0                |
|ROM_ADC_EV*     |0x00--   |0    |イベント定義      |FDAU_DEF_ADC_ATTR    |0                 |
|ROM_ADC_HIGH*   |0x00--   |4    |イベントの上限値  |FDAU_DEF_ADC_HIGH    |3.0               |
|ROM_ADC_LOW*    |0x00--   |4    |イベントの下限値  |FDAU_DEF_ADC_LOW     |2.0               |
|>|>|>|>|>|LEFT:~IOチャンネル定義(FDAU_IO_MAX個必要) 9bytes x 8 = 72bytes |
|ROM_IO_NAME*    |0x01a0   |8    |チャンネルの名称  |FDAU_DEF_IO_NAME     |IN*               |
|ROM_IO_TYPE*    |0x0---   |1    |データの型        |FDAU_DEF_IO_ATTR     |0 (continue       |
|ROM_IO_INV*     |0x0---   |0    |論理反転          |FDAU_DEF_IO_ATTR     |0                 |
|ROM_IO_EV*      |0x0---   |0    |イベント定義      |FDAU_DEF_IO_ATTR     |0                 |
|>|>|>|>|>|LEFT:~時間定義 12bytes |
|ROM_ITV_SAMPLE  |0x0---   |0    |サンプリング間隔  |FDAU_DEF_ITV_SAMPLE  |1                 |
|ROM_ITV_LOG     |0x01e8   |4    |ログ間隔          |FDAU_DEF_ITV_LOG     |10                |
|ROM_ITV_SEND    |0x01ec   |4    |送信間隔          |FDAU_DEF_ITV_SEND    |60                |
|ROM_ITV_RETRY   |0x01f0   |4    |リトライ間隔      |FDAU_DEF_ITV_RETRY   |180               |
|>|>|>|>|>|LEFT:~ネットワーク定義 12bytes |
|ROM_NET_IP      |0x01f4   |4    |IPアドレス        |FDAU_DEF_IP          |"192.168.1.102"   |
|ROM_NET_MASK    |0x01f8   |4    |ネットマスク      |FDAU_DEF_MASK        |"255.255.255.0"   |
|ROM_NET_GW      |0x01fc   |4    |ゲートウェイ      |FDAU_DEF_GW          |"192.168.1.1      |

-HTTPバージョンとHTTPバウンダリは固定する
-IPアドレス類はバイナリで格納
-データ関数はa1 * (x + a0)とする。
-データの型はインデックス化し、さらに、論理反転フラグ、イベントフラグとビットORする
-サンプリング間隔は1秒固定

***ADCとGPIOのattributeの設定 [#i5509f2d]
-ビット構成
|~Bit7 |~Bit6 |~Bit5 |~Bit4 |~Bit3 |~Bit2 |~Bit1 |~Bit0 |
|反転  |>|>|データ型 |>|>|>|イベントフラグ |

-反転ビット
|>|LEFT:~反転 |
|Bit7 | 内容 |
|0 |GPIOが5Vのとき、FDMLで1を生成 |
|1 |GPIOが5Vのとき、FDMLで0を生成 |

-データ型
|>|>|>|LEFT:~データ型|
|Bit6|Bit5|Bit4|内容|
|0|0|0|boolean|
|0|0|1|int|
|0|1|0|double|
|0|1|1|string|

-イベントフラグ
|>|>|>|>|LEFT:~イベントフラグ|
|Bit3|Bit2|Bit1|Bot0|内容|
|0|0|0|0|イベントなし|
|0|0|0|1|[GPIO](反転変換後)立上り、[ADC]設定範囲内に入った|
|0|0|1|0|[GPIO](反転変換後)立下り、[ADC]設定範囲外を出た|
|0|0|1|1|[GPIO](反転変換後)立上り、立下り、[ADC]設定範囲内に入った、出た|

**FDCレスポンスコード [#y3863d1b]
|~記号        |~コード |~意味            |~FDAUの動作       |
|HTTP_OK      |200     |正常終了         |ログをクリア      |
|HTTP_BADREQ  |400     |リクエストエラー |送信リトライ      |
|HTTP_UNAUTH  |401     |認証エラー       |送信リトライ      |
|HTTP_NOTFND  |404     |未検出エラー     |送信リトライ      |
|HTTP_SVERR   |500     |内部エラー       |送信リトライ      |
|HTTP_UNAVA   |503     |利用不可         |送信リトライ      |

**主要コマンド [#aa2aa3ea]
-電源投入後3秒以内にキーインすると、fdau_rtc_taskとfdml_send_taskをwaiting状態にする。
|~コマンド|~機能|
|ps       |タスクの状態を表示|
|suspend  |タスクをwaiting状態にする|
|release  |タスクをdomant状態にする|
|logadd   |ログに追加|
|logdump  |ログを表示|
|logclear |ログをクリア|
|ifconfig |LANCの設定|
|route    |ルータの設定|
|ping     |ping|
|adcget   |ADCから生データを得る|
|rtcset   |RTCをセットする|
|rtcget   |RTCから時刻を得る|
|eedump   |EEPROMの内容を表示|
|eewrite  |EEPROMに書込み|
|set      |動作パラメータの設定|
|printenv |動作パラメータの表示|


*TOPPERSのポーティング [#t40cb311]
-doc/config.txtを参照

-システム名fdau10として、config/h8/fdau10を作成
--akih8_3069fからコピー

--config/h8/fdau10/release.ld
---RAM領域をCS1に変更
---RAM容量を128Kバイトに変更

--config/h8/fdau10/sys_support.S
---CS1をSRAM領域に変更
---LANC割込みハンドラをIRQ0に変更

--config/h8/fdau10/tinet_sys_config.h
---LANCのベースアドレスを0x400000に変更
---LANCの割り込みをIRQ0に変更

--config/h8/fdau10/Makefile.config
---ROM上で実行させるなら、DBGENVを全てコメントアウト

-H8 to LANC I/Fの変更
--tinet/netdev/if_ed/if_edreg.h

-Makefile内のDBGENV:=は全てコメントアウト

-sample1.cでの動作確認
 JSP Kernel Release 1.4 (patchlevel = 0) for FDAU10 (Oct 12 2004, 12:14:16)
 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN
 
 System logging task is started on port 2.
 Sample program starts (exinf = 0).
 task1 is running (001).   |
 task1 is running (002).   |
 task1 is running (003).   |
 task1 is running (004).   |
 task1 is running (005).   |
 task1 is running (006).   |
キーには反応なし・・・~
フロー制御しなければOK。TOPPERSはフロー制御していない様子。

-nservで動作確認
 JSP Kernel Release 1.4 (patchlevel = 0) for FDAU10 (Oct 12 2004, 12:17:26)
 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN 
 
 System logging task is started on port 2.
 [CONSOLE:7] started.
 [WWW:08,05] started.
 [WWW:09,06] started.
 [UDP ECHO SRV (NBLK):10,2] started.
 [UDP ECHO CLI:11,1] started.
 [UDP DISCARD CLI:12,3] started.
 [TCP ECHO CLI SND:13,1] started.
 [TCP ECHO CLI (NBLK) RCV:14,1] started.
 [TCP DISCARD CLI:15,2] started.
 [TCP DISCARD SRV:16,4] started.
 [TCP ECHO SRV (NBLK) RCV:17,3] started.
 [TCP ECHO SRV (NBLK) SND:18,3] started.
 [ETHER INPUT: 6] started on MAC Addr: 00:02:cb:01:74:db.
 [ETHER OUTPUT:5] started.
 
 TINET Release 1.2 for JSP Kernel Release 1.4 (Oct 12 2004, 08:10:07)
 Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
                     Tomakomai National College of Technology, JAPAN
 
 [NET/TIMER:2] started.
 [TCP OUTPUT:3] started.
 [UDP OUTPUT:4] started.
MACアドレスは読めてるけど、キー入力に応答なし~
フロー制御しなければOK。TOPPERSはフロー制御していない様子。

--ECHOコネクト
---ネットワーク内ECHOコネクト
 18:14:28.926653 arp who-has 192.168.100.135 tell 192.168.100.45
 18:14:28.926914 arp reply 192.168.100.135 is-at 0:40:26:14:1c:b8
 18:16:46.703450 192.168.100.45.1025 > 192.168.100.135.7: S 35031342:35031342(0) win 2048 <mss 1460>
 18:16:46.703813 192.168.100.135.7 > 192.168.100.45.1025: S 3066581622:3066581622(0) ack 35031343 win 57344 <mss 1460>
 18:16:46.722062 192.168.100.45.1025 > 192.168.100.135.7: . ack 1 win 2048
 18:16:46.749656 192.168.100.45.1025 > 192.168.100.135.7: . 1:1461(1460) ack 1 win 2048
 18:16:46.750950 192.168.100.135.7 > 192.168.100.45.1025: P 1:1461(1460) ack 1461 win 58400 (DF)
 18:16:46.753061 192.168.100.45.1025 > 192.168.100.135.7: P 1461:2049(588) ack 1 win 2048
 18:16:46.765182 192.168.100.45.1025 > 192.168.100.135.7: . ack 1461 win 2048

---ネットワーク内ECHOクローズ
 18:17:27.544073 192.168.100.135.7 > 192.168.100.45.1025: P 75709:76001(292) ack 76001 win 58400 (DF)
 18:17:27.624243 192.168.100.45.1025 > 192.168.100.135.7: . ack 76001 win 2048
 18:17:28.706730 192.168.100.45.1025 > 192.168.100.135.7: F 76001:76001(0) ack 76001 win 2048
 18:17:28.707073 192.168.100.135.7 > 192.168.100.45.1025: . ack 76002 win 58400 (DF)
 18:17:28.709513 192.168.100.135.7 > 192.168.100.45.1025: F 76001:76001(0) ack 76002 win 58400 (DF)
 18:17:28.713655 192.168.100.45.1025 > 192.168.100.135.7: . ack 76002 win 2048

---ルータ越しのECHOコネクト
 17:13:54.033025 arp who-has 192.168.100.2 tell 192.168.100.44
 17:13:54.033177 arp reply 192.168.100.2 is-at 0:90:cc:1:5:9c
 17:13:54.045612 192.168.100.44.1025 > 219.96.212.110.7: S 115231945:115231945(0) win 2048 <mss 1460>
 17:13:54.046750 219.96.212.110.7 > 192.168.100.44.1025: S 1554721676:1554721676(0) ack 115231946  win 65535 <mss 1460>
 17:13:54.053437 192.168.100.44.1025 > 219.96.212.110.7: . ack 1 win 2048
 17:13:54.080221 192.168.100.44.1025 > 219.96.212.110.7: . 1:1461(1460) ack 1 win 2048
 17:13:54.082845 192.168.100.44.1025 > 219.96.212.110.7: P 1461:2049(588) ack 1 win 2048
 17:13:54.085576 219.96.212.110.7 > 192.168.100.44.1025: P 1:1461(1460) ack 1461 win 65535 (DF)
 17:13:54.098008 192.168.100.44.1025 > 219.96.212.110.7: . ack 1461 win 2048

---ルータ越しのECHOクローズ
 17:14:34.816392 219.96.212.110.7 > 192.168.100.44.1025: P 75709:76001(292) ack 76001 win 65535 (DF)
 17:14:34.902897 192.168.100.44.1025 > 219.96.212.110.7: . ack 76001 win 2048
 17:14:35.583496 192.168.100.44.1025 > 219.96.212.110.7: F 76001:76001(0) ack 76001 win 2048
 17:14:35.583921 219.96.212.110.7 > 192.168.100.44.1025: . ack 76002 win 65535 (DF)
 17:14:35.606636 219.96.212.110.7 > 192.168.100.44.1025: F 76001:76001(0) ack 76002 win 65535 (DF)
 17:14:35.610263 192.168.100.44.1025 > 219.96.212.110.7: . ack 76002 win 2048

-ポーティング
--&ref(fdau10_041012.tgz);をconfig/h8で展開。fdau10を作る。
--&ref(if_ed_041012.tgz);をtinet/netdevで展開。if_edを変更する。


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS