このシステムは、 UDP/IP プロトコルによりデータシステムソフトウエアより制御のためのメソッド(パラメータ値の集合)や動作すべき命令を受け取り、質量分析装置の電源制御ハードウエアを駆動するとともに、現在の状態、電圧などのモニター値・設定値などをデータシステムに返送する単純なものである。
この試作制御ボードはコンソールとして使用できるシリアルインタフェースを持たず Ethernet で通信をする以外に外部とやりとりするすべを持たない。
このシステムは比較的単純な制御を目的としており、高価なリアルタイム OS を搭載しないいわゆる bare metal に構築する。
main() ルーチンでは、最初にアプリケーションのための初期化を行ったのち、無限ループで周期タイマーの処理、UDP/IP の入出力処理をシングルスレッドで行う。 OS が搭載されていないためセマフォなどの同期プリミティブが使えない。したがって割り込み処理内部で .bss セグメントへのアクセスはアトミックな操作(マシンサイクルで割り込まれない操作)しか行えない。
メインルーチン(抜粋)は以下のようである。
#include "lwip/init.h"
#include "lwip/netif.h"
#include "netif/etharp.h"
#include "ethif.h"
#include "timer.h"
#include "debug.h"
#include <string.h>
static struct netif eth0;
static ip_addr_t ipaddr, netmask, gw;
static unsigned char trap_flag;
static ip_addr_t trap_addr;
int
main()
{
app_ctor();
IP4_ADDR( &gw, 194,168,1,1 );
IP4_ADDR( &ipaddr, 192,168,1,129 );
IP4_ADDR( &netmask, 255,255,255,0 );
enum FEATURE feature = app_initialize();
if ( feature == FEATURE_IONSOURCE )
IP4_ADDR( &ipaddr, 192,168,1,130 );
// start sys_jiffies & enabling interrupts
portio_enable_interrupts();
app_activate(); // periodic process init & enable time a0
smsc9210_insmod();
// lwIP initialization
lwip_init();
ethif_insmod(); // insmod for eth0 interface (virtualize smsc9210)
// add eth0 inteface into lwIP protocol stack
netif_add( ð0, &ipaddr, &netmask, &gw, NULL, 1, 0 );
netif_set_default( ð0 );
netif_set_up( ð0 );
// activating lwIP ethernet hardware
ethif_init( ð0 );
netif_set_link_up( ð0 );
// initialize virtual debug console on UDP DST-PORT 20001
debug_init( ipaddr );
// lwIP timer initialize
timer_init();
#if LWIP_ARP
timer_set_interval( TIMER_EVT_ETHARPTMR, ARP_TMR_INTERVAL );
#endif
#if LWIP_TCP
timer_set_interval( TIMER_EVT_TCPTMR, TCP_TMR_INTERVAL );
#endif
// CONGLATURATIONS, your bare-metal system is fully initialized.
if ( feature == FEATURE_IONSOURCE )
debug_print( 0
, "POWER SUPPLY for Ion Source is up and running on %a"
, ipaddr.addr );
else
debug_print( 0
, "POWER SUPPLY for Analyzer is up and running on %a"
, ipaddr.addr );
debug_print( 0, "Copyright(C) 2013 MS-Cheminformatics LLC" );
debug_print( 0, "info@ms-cheminfo.com" );
// start service
app_main_loop( ð0 );
app_dtor();
}