[Armadillo:06644] Armadillo-300にて、タイマーとselectを使うには?
TFC 小林
email@hidden
2011年 1月 26日 (水) 21:48:22 JST
お世話になります。TFC 小林です。
Armadillo-300にて、
ETHERにて、データを送受させながら、
拡張バス等の動作も行うようなプログラムを作っています。
1秒のタイマーを作成した後、
ETHERで接続待ちを行い、
その間、他の作業をしながら、
ETHERの処理や、1秒のタイマーの割り込みをさせたいのですが、
selectの戻り値が-1になってしまい、その前後で数msの動作が
固まってしまうのか、他の作業が数ms止まってしまいます。
タイマーを使用しなければ、ETHERの処理と他の作業が
交互に固まることなく動くのですが、
selectと、timer_createを同時に使うにはどうしてあげればいいのでしょうか?
P.S. 溝渕さま。
「Armadillo-300におけるtftpdlでのフラッシュ書き込み」の件ですが、
教えていただいたことをやってみましたが、変化なしで若干諦め気味です。
↓ 以下ソースコード
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <sys/mount.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#define SOCKET_MAX 10
#define PORTNO 8200
//
****************************************************************************
// Timer 割り込み
//
****************************************************************************
static void handler(int signo)
{
printf("Timer In!\n");
}
//
****************************************************************************
// main
//
****************************************************************************
int main(int argc, char *argv[])
{
struct sockaddr_in saddr;
struct sockaddr_in caddr;
fd_set readfds;
int skt[SOCKET_MAX];
int res;
int sf=-1;
int i = 0;
unsigned char buf[0x1000];
int len = 0;
int ack = 0;
// タイムアウト値設定
struct timeval* pTimeval = NULL;
struct timeval timeout;
struct sigaction sigact;
timer_t timerId;
struct itimerspec itval;
////////////////////////////////////////////////////////////////////////////
////
//Timer イニシャル
sigact.sa_handler = handler;
sigact.sa_flags = 0;
sigemptyset(&sigact.sa_mask);
// ハンドラ設定
if(sigaction(SIGALRM,&sigact,NULL) == -1)
{
perror("sigaction");
}
itval.it_interval.tv_sec = 1;
itval.it_interval.tv_nsec = 0;
itval.it_value.tv_sec = 1;
itval.it_value.tv_nsec = 0;
// ***** タイマー作成 *****
if(timer_create(CLOCK_REALTIME,NULL,&timerId) == -1)
{
perror("timer_create");
}
// ***** タイマー設定 *****
if(timer_settime(timerId,0,&itval,NULL) == -1)
{
perror("timer_settime");
}
////////////////////////////////////////////////////////////////////////////
////
for (i=0; i<SOCKET_MAX; i++){
skt[i] = -1;
}
if ((skt[0] = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("socket error...\n");
return 0;
}
bzero((char*)&saddr, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(PORTNO);
if((bind(skt[0], (struct sockaddr *)&saddr, sizeof(saddr))) ==
-1){
printf("bind error...\n");
return 0;
}
if ((listen(skt[0], SOCKET_MAX)) == -1){
printf("listen error...\n");
return 0;
}
timeout.tv_sec = 0;
timeout.tv_usec = 0;
pTimeval = &timeout;
while(1){
SubModule(); // 常時別の作
業を行う。
FD_ZERO(&readfds);
for (i=0; i<SOCKET_MAX; i++){
if (skt[i] != -1){
FD_SET(skt[i],
&readfds);
}
}
res = select(FD_SETSIZE, &readfds, NULL, NULL,
pTimeval);
if (res == -1){
printf("Error\n");
}
if(res == 0) {
timeout.tv_sec = 0;
timeout.tv_usec = 0;
pTimeval = &timeout;
}
else{
if (skt[1] != -1){
if (FD_ISSET(skt[1],
&readfds)){
ack = read(skt[1], &buf,
sizeof(buf));
}
}
if (FD_ISSET(skt[0], &readfds)){
sf = Accept(skt[0], (struct
sockaddr*)&caddr);
if (sf != -1){
if
(skt[1] != -1){
shutdown(skt[1], 2);
ack = CLOSE_SOCKET(skt[1]);
}
skt[1]
= sf;
}
}
}
}
shutdown(skt[0], 2);
ack = CLOSE_SOCKET(skt[0]);
return(0);
}
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://lists.atmark-techno.com/pipermail/armadillo/attachments/20110126/9d28b755/attachment.html>
armadillo メーリングリストの案内