Field Data Aquision Unit
Development
&counter([total|today|yesterday]); - 0 - 0 - 14
おしらせ†
- TOPPERSカーネルをアップデート1.4.1
- TINETをアップデート1.2.1
TODO†
- fdml_sampling_taskとfdml_logging_taskは、fdml_rtc_taskに統合したので削除。
- wup_tskが多重発生したときの動きをチェック
TOPPERSアプリケーションの作り方†
TOPPERSディレクトリ直下でconfigureする方法
nservを参考にする方法
本体はtinet/netapp/dbg_cons.c
- Interface誌2003年9月〜連載があった。
- ToppersDevel参照
FDAUアプリケーション†
ファイル一覧†
ファイル名 | 内容 |
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制御関数 |
定数一覧†
定数名 | 値 | 内容 |
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のベースアドレス |
グローバル変数†
変数名 | ファイル名 | 内容 |
fdau_flag_init | fdau_cons.c | 設定モード判定用フラグ。3秒以内にキー入力するとTRUEになる。 |
fdau_flag_event | fdau_cons.c | イベント検出時TRUEになる |
fdau_flag_retry | fdau_cons.c | リトライ時TRUEになる |
タスク分割†
タスク名 | 優先度 | ファイル | 起動条件 | 内容 |
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†
- RTCを読んで、各タスクを起動する
- サンプリング周期になったらfdau_sampling_taskをwup_taskする。
- ロギング周期になったらfdau_logging_taskをwup_taskする。
- 送信周期になったらfdau_send_taskをwup_taskする。
fdau_sampling_task†
- サンプリングタスク(移動平均SAMPLING_AVR_N回)
- もし、送信イベント状態になっていたら、fdml_client_taskをwup_taskする。
fdau_logging_task†
- ログタスク(固定RAM領域のリングバッファ)
- 最終サンプリングデータをRAMリングバッファに格納する
fdau_send_task†
- FDML送信タスク
- fdml_client_taskをwup_task
fdml_client_task†
- FDMLクライアントタスク
- RAMリングバッファの内容をFDML化する
- fdml_recv_taskをwup_task
- fdml_send_taskをwup_task
fdml_send_task†
- FDAML変換、HTML化、TCPコネクト、TCP送信
fdml_recv_task†
fdau_cons_task†
タスク間通信と同期†
ID | 内容 | 取得 | 開放 |
SEM_RAM | リングバッファのセマフォ | アクセス前 | アクセス後 |
汎用関数†
A/D変換器制御(adc.h, adc.c) |
ER adc_init(void); | A/D変換器初期化 |
ER adc_get(UB ch, UH *dat); | A/D変換値を取得 |
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); | 文字列書込み |
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から時刻を取得 |
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マップ†
定数 | アドレス | 容量 | 内容 | デフォルト定数 | デフォルト値 |
システム定数 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 |
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" |
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" |
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 |
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 |
時間定義 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 |
ネットワーク定義 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の設定†
- ビット構成
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
反転 | データ型 | イベントフラグ |
- 反転ビット
反転 |
Bit7 | 内容 |
0 | GPIOが5Vのとき、FDMLで1を生成 |
1 | GPIOが5Vのとき、FDMLで0を生成 |
- データ型
データ型 |
Bit6 | Bit5 | Bit4 | 内容 |
0 | 0 | 0 | boolean |
0 | 0 | 1 | int |
0 | 1 | 0 | double |
0 | 1 | 1 | string |
- イベントフラグ
イベントフラグ |
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レスポンスコード†
記号 | コード | 意味 | FDAUの動作 |
HTTP_OK | 200 | 正常終了 | ログをクリア |
HTTP_BADREQ | 400 | リクエストエラー | 送信リトライ |
HTTP_UNAUTH | 401 | 認証エラー | 送信リトライ |
HTTP_NOTFND | 404 | 未検出エラー | 送信リトライ |
HTTP_SVERR | 500 | 内部エラー | 送信リトライ |
HTTP_UNAVA | 503 | 利用不可 | 送信リトライ |
主要コマンド†
- 電源投入後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のポーティング†
- システム名fdau10として、config/h8/fdau10を作成
- 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はフロー制御していない様子。