2014年1月5日日曜日

MinGW multithreading programming in C, and Now Project

今のProjectの目的は、

・開発生産性向上の為の、RDCSのシングルソース化の強化

・RDCSの性能向上の為に、マルチコア対応

・RDCSの、連続運転対応、対障害対応、リソースの有効活用を進めるための、

  一層の分散並列処理化

・入手性の良い、かつ誰でも1台は持っているWindowsマシンの有効活用促進


こんな所を目的に、改造作業をしています。

Version1も完成していない状態で、

ちょっと、悩むのだけど、このタイミングでしないと、やりたくても

できなくなってしまう。

特に、通信部分は、最も重要視している事の一つです。

やっぱり、HTTP通信は、業務系のシステムには良いけど、

ロボットシステムの通信系に使ってはならない事を痛感しました。

例えば、RDCSのような沢山のロボットを人工知能を搭載した協調制御するシステムで、

運用するのは、安全を考えれば、ダブル以上のチェック機能を持たせなければならないし、

それを分散環境で実現するためには、

独自のClient-Serverシステムで、専用のプロトコルで高速化や柔軟性を追求する

必要があるのだぁ。。。

だったら、Raspberry Piを使ってる事は矛盾じゃないのか?

なんて、意見もあるが、運用の時のハードはどんどん良くなるから変えればよい。

それより、安価で、10台のロボットを創って、上記のような事を確かめられる事の方が、

もっと意味がある。そう意味では、とってもバランスのよい開発マシンなのです。

Raspberry Piや、BBBは、、、、

僕は、開発や研究のマシンは、最新の性能でない方が良い場合も

あることを経験かつ体験的に理解しているよ。沢山、開発してきたから、、、


ところで、BBBは、Raspberry Piより体感的には、2倍以上の性能差を感じることがある。

一番感じるのは、pacmanによる大量のupgradeの時。

この作業は、まさにマシンの性能を測る上では、良いベンチマーク作業だと思う。


しかし、このようなシステムを開発可能なのも、gccなどの、オープンソースのおかげでです。

感謝感謝です。

そのおかげて、いろいろなシステムを構築することができる。

なんて、幸せな時代なのだとうと思います。

僕も、いつかは、恩返ししないと。。



で、昨日の懸案事項、今の段階で、いろいろテストしているけど、

ちゃんとOKだぁ。

(1) MinGWのSocketを使った、プログラムの確認

(2) MinGW下での、(1)とthreadを組合わせた場合の挙動


で、忘備録で、gcc 起動時の引数と、テスト時のヘッダーファイルをドーン。

ブログって、忘備録に最適なのでしゅ。。。

・MinGW
gcc threadServer0.c -o threadServer0 -mthreads -DDEBUG -DMINGW -lwsock32 -lws2_32 -lpthreadGCE2

・Linux
gcc threadServer0.c -o threadServer -lpthread

/***********************************************************
** Function : RDCS Communication Server & thread test
** File Name:
** Library  :
** Author   : Naoki Kabaya
** create   : 01/10/2014 version 1.0
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* exit() */
#include <sys/types.h>

#if MINGW
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/socket.h> /* socket(), bind(), listen(), accept(), recv() */
#include <netinet/in.h> /* htons() */
#include <unistd.h>
#endif

#include <pthread.h> /* pthread_create(), pthread_detach() */
#include <errno.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

#define PORT    50000 /* listening port*/
#define MAXDATA 1024 /* recieve buffer size */

#if DEBUG
#define PR(A,B) printf("--->%s.(%s)\n", A, B)
#define PRDI(A,B) printf("DEBUG--->%s.(%d)\n", A, B)
#define PRDS(A,B) printf("DEBUG--->%s.(%s)\n", A, B)
#else
#define PR(A,B)
#define PRDI(A,B)
#define PRDS(A,B)
#endif

#if MINGW
#define D_SOCKET_VAR SOCKET
#define D_SOCKET_CLOSE(A) closesocket(A)
#define D_SOCKET_WIN_INIT WSADATA wsaData;if (WSAStartup(MAKEWORD(2 ,0), &wsaData) == SOCKET_ERROR) {printf ("Error initialising WSA.\n");return -1;}
#define D_SOCKET_WIN_TERM WSACleanup()
#else
#define D_SOCKET_VAR int
#define D_SOCKET_CLOSE(A) close(A)
#define D_SOCKET_WIN_INIT
#define D_SOCKET_WIN_TERM
#endif

//EOF

0 件のコメント:

コメントを投稿