連載
ドライバ開発とネットワークプログラミング:T-Engineプログラミング入門(4)(6/6 ページ)
ドライバの作成と複数のモジュールからなるアプリ開発およびネットワークプログラミングについて解説する
リスト3 アプリケーション(プロセスベース)appl.c
/*
デジタル温度計: ウェブ配信版
*/
#include <stdio.h>
#include <string.h>
#include <btron/proctask.h>
#include <btron/bsocket.h>
#include <btron/tkcall.h>
volatile int dt; /* 温度センサドライバ用 */
/* セッションタスク */
void session_task( int fd )
{
int n; char t; char buf[1024];
/* ブラウザからのメソッドを受信 */
n = so_read( fd, buf, sizeof(buf) );
if (n <= 0) goto e1;
/* 温度センサドライバからリード */
tk_srea_dev( dt, -100, &t, 1, &n );
/* ブラウザへ返答を送信 */
n = sprintf( buf,
"HTTP/1.1 200 OK\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: 78\r\n"
"Connection: close\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<html><head>"
"<meta http-equiv=refresh content=1>"
"</head><body>%2d</body></html>\r\n", t );
so_write( fd, buf, n );
e1: so_close( fd );
ext_tsk(); /* タスク終了 */
}
/* 簡易ウェブサーバータスク */
void http_task( int port )
{
int fd, cfd, clen; struct sockaddr_in saddr, caddr;
/* ソケット作成, バインド, リッスン */
fd = so_socket( AF_INET, SOCK_STREAM, 0 );
memset( &saddr, 0, sizeof(saddr) );
saddr.sin_family = AF_INET;
saddr.sin_port = htons( port );
saddr.sin_addr.s_addr = htonl( INADDR_ANY );
so_bind( fd, (struct sockaddr *)&saddr, sizeof(saddr) );
so_listen( fd, 5 );
for(;;) { /* 無限ループ: このタスクは終了しない */
/* ブラウザからの接続をアクセプト */
clen = sizeof(caddr);
cfd = so_accept( fd, (struct sockaddr *)&caddr, &clen );
/* セッションタスクの生成 */
cre_tsk( session_task, -1, cfd );
}
}
/* プロセス:メインタスク */
int main()
{
int dl, n; char t;
/* 温度センサドライバをオープン */
dt = tk_opn_dev( "thermo", TD_READ );
/* 7セグメントLEDドライバをオープン */
dl = tk_opn_dev( "led", TD_WRITE );
/* 簡易ウェブサーバータスクを生成 */
cre_tsk( http_task, -1, 80 );
for(;;) { /* 無限ループ */
/* 温度センサドライバからリード */
tk_srea_dev( dt, -100, &t, 1, &n );
/* 7セグメントLEDドライバへライト */
tk_swri_dev( dl, -100, &t, 1, &n );
slp_tsk( 500 ); /* 500ミリ秒待つ */
}
}
リスト3 アプリケーション(プロセスベース)appl.c
Copyright © ITmedia, Inc. All Rights Reserved.