[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 メーリングリストの案内