Linuxでリアルタイム制御のためのサンプルプログラムとは?

このQ&Aのポイント
  • Linuxでリアルタイム制御をするためには、Preempt RTを導入する必要があります。
  • リンク先のページには、リアルタイム制御のためのサンプルプログラム「led_rt.c」があります。
  • 「led_rt.c」では、<sched.h>、<sys/mman.h>、<mraa.h>などのヘッダーファイルや、sched_setscheduler、mraa_result_t retといった関数が使用されています。
回答を見る
  • ベストアンサー

shced.h, sys/mman.h, mraa

Linuxでリアルタイム制御をしようと思い、Preempt RTを入れようと思っています。リンク先( https://qiita.com/yoneken/items/2f6fd50bf9837cf50f9d )のページの真ん中くらいにある「led_rt.c」はリアルタイム制御のためのサンプルプログラムらしいのですが、その中に、 #include <sched.h> #include <sys/mman.h> #include <mraa.h> とか sched_setscheduler mraa_result_t ret など、見たことのないものがありました。このあたりをじっくり学べる書籍などはありますでしょうか?(Linuxの初心者で、これまで「新しいLinuxの教科書」、「ふつうのLinuxプログラミング」の2つの書籍は読んで理解したのですが、それらの書籍には書かれていませんでした。) ご教授のほどよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1523/2217)
回答No.1

書籍の紹介はできませんが、挙がっていたヘッダファイルについて簡単に説明します。 ・sched.h Linuxのスケジューリングに関係するヘッダファイル。sched_setscheduler()を呼ぶために必要です。質問に挙がっていた中ではリアルタイム制御に直接関係するのはこれだけです。 sched_setscheduler()やstruct sched_paramについてはhttps://linuxjm.osdn.jp/html/LDP_man-pages/man2/sched_setscheduler.2.htmlを参照してください。 ・sys/mman.h Linuxでファイルのメモリマッピングを行うmmap()・munmap()を呼ぶ際に必要なヘッダファイル。リンク先のサンプルプログラムには現れませんが、mraa_gpio_use_mmaped()に関係していると思われます。 mmap()・munmap()についてはhttps://linuxjm.osdn.jp/html/LDP_man-pages/man2/mmap.2.htmlを参照してください。 ・mraa.h Intel Edisonなどで低レベルのI/O通信を行うEclipse Mraaライブラリを使うためのヘッダファイル。 http://iotdk.intel.com/docs/master/mraa/ これはLinuxそのものの機能ではないので、Linuxの本には出てきません。 mraa_で始まる関数の説明は上記のウェブページ(英語)を参照してください。 Eclipse Mraaを使う予定がないのであればリンク先のサンプルプログラムはあまり参考にならないと思います。どこがLinux一般の話でどこがMraa固有の話なのかを見分けないと混乱するだけでしょう。

octopass
質問者

お礼

ありがとうございます!!大変助かります!!

その他の回答 (1)

  • A1200hd40
  • ベストアンサー率52% (337/648)
回答No.1

取り敢えず、sched.hで検索すると、こちらがヒットして来ます。 【読解入門】Linuxカーネル (スケジューラ編その2) https://qiita.com/ueba/items/749e8da79b49fc0bc932 カーネルを理解するために、最初から読まれては如何でしょう? 【読解入門】Linuxカーネル (概要編) https://qiita.com/ueba/items/47b6de5ea8f4e6749f8f rtカーネルは、組み込みで言及されることが多いので、制御を目指すなら、組み込みLinuxの新しめの書籍を当たった方が良かろうかと思います。 (扱うカーネルのバージョンが、より現行のモノに近いモノを。)

関連するQ&A

  • fscanf()【C言語】

    テキストファイルをうまく読み込んでくれません。 どうかご教示お願いいたします。 環境 Windows7 Borland C++ 5.5.1 for Win32 status.txtの内容 1.50,40.0 1.55,45.0 1.60,50.0 1.65,55.0 1.70,60.0 1.75,65.0 1.80,70.0 1.85,75.0 1.90,80.0 プログラムの内容 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ FILE *filepointer; double s[10],w[10]; int i=0,ret; if((filepointer=fopen("status.txt","rt"))==NULL){ printf("file open error!!\n"); exit(1); } printf("%X\n",filepointer); while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){ i++; printf("%d %f %f\n",ret,s[i],w[i]); } fclose(filepointer); return 0; } 出力結果 40E714 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 5.121811144940079976000000000000000000000e+303 0.000000 2 0.000000 0.000000 2 0.000000 0.000000

  • ヘッダファイルについて

    Linuxにおける #include <sys/socket.h> はwindowsにおける何ですか?c++6.0をつかってます。 どなたか知ってらっしゃる方よろしくお願いします。

  • リアルタイムOSが必要かどうか

    Linuxが入ったPCで、AD/DAボードを介してロボット制御(サンプリング周期は1ms)をしようと思うのですが、RT Linuxなどのリアルタイムカーネルは入れた方が良いでしょうか?それとも、1ms程度なら必要ないでしょうか?

  • PCからH8マイコンを直接制御するには

    初めての書き込みになりますcain8111と申します。 よろしくお願いします。 PCからH8/3694F(H8 Tiny I/O ボード使用)とのRS-232Cシリアル通信でサーボモータを直接制御したいのですが、参考になる書籍や文献が少ないため、プログラムの組み方が分からず悩んでいます。 アドバイスや参考になる書籍や資料がございましたらよろしくお願いします。

  • ソフト移植(ヘッダーファイルとライブラリの違い)

    hファイルとLibファイルの違いがよくわかりません libでリンクしてhファイルを指定してCで命令を与える そこで問題なんですが 1.libファイルは作成できるんですか? 2.それともhファイルを書き換えるのが主流ですか? 3.学校でWEBカメラ移植の実験をしています #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/ioctl.h> #include <stdlib.h> #include <linux/videodev.h> そこで上のライブラリ(.h file)をそのまま使って別のマイコンに移植しようという実験をしているのですがgcc(video4Linux)のライブラリ(.h file)抽出の仕方がよくわかりません すでにカメラのプログラムはあり、後はそのマイコンにライブラリをリンクすれば完成できるという設計構造なのですが、ソフト開発移植にあたって、この開発構造の概念であっているでしょうか? ライブラリを抽出する上で何か適切なアドバイスとかないでしょうか? *ちなみにマイコンのコンパイラーは自作です お願いします

  • gnuplotについて質問です。

    現在、linuxでC言語からパイプを使ってgnuplotに接続し、計算した結果をすぐに表示しようとしています。 下のようなプログラムでうまくいくと思ったのですが、グラフが表示されるのにすごい時間がかかってしまいます。 解決策をご存知でしたらご教示お願いいたします。 #include<stdio.h> #include<stdlib.h> #include<math.h> void main(){ FILE *plotin; double x , y; int i = 0; struct sched_param param; struct timespec tt; //gnuplotにパイプで接続 plotin = popen("gnuplot","w"); //制御LOOP開始 for(i = 0 ; i < 1000 ; i ++) { if( i == 10000) { exit(0); } //gnuplotで表示するグラフの計算 x = i * 0.01; y = x*x; //gnuplotに表示する fprintf(plotin,"plot '-' title \"oscillation\" \n"); fprintf(plotin,"%f %f\n", x,y); fprintf(plotin,"e\n"); i++; } //gnuplot閉じる pclose(plotin); }

  • write関数でEAGAINのエラー発生 対策方法

    現在、私はOS:LINUX 開発環境:QT5.3 を使いシリアル通信を行っています。 そこで質問ですが、シリアル通信でwrite関数を使用しデータの送信を行おうとしていますが 1024バイトのデータを送信しているとき、4回までの送信はエラーがなく成功するのですが、 5回目以降の送信時EAGAIN(リソースが一時的に利用できません)と 出てきてしまいそのあといくら待ってもデータの送信ができない状態となっています 何か対策がありましたらよろしくお願いします。以下が今回プログラムしたソースとなっております。 #include "stdio.h" #include "stdlib.h" #inlclude "strings.h" #include "unistd.h" #include "fcntl.h" #include "cp4141.h" #include "termios.h" #include "error.h" #include "sys/ioctl.h" static int fd; main() { int ret; unsigned long BaudRate = 230400; termios newtio; fd = open("/dev/ttyG0",O_RDWR | O_NOCTTY | O_NONBLOCK); if(fd==-1) { perror(("/dev/ttyG0"); return; } bzero(&newtio, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR | ICRNL; newtio.c_oflag = 0; newtio.c_lflag = ICANON; tcflush(fd, TCIOFLUSH); tcsetattr(fd, TCSANOW, &newtio); } //画面上のボタンが押されたとき実行される関数 void Button1_Push() { int ret; char buff[1024]; sprintf(buff, "dummy"); ret = write(fd, buff, 1024); if(ret == -1) { perror("send"); return; } } 上記のボタンが押されたときそうしんする処理で5回目に必ずエラーが発生します。 以上よろしくお願いします。

  • javascriptで音声データ圧縮

    http://qiita.com/HirokiTanaka/items/56f80844f9a32020ee3b このあたりを参考にwavデータをmp3に変換することは出来ました。 ただ残念なことに、今回やりたい事がリアルタイム性が欲しく、上記の方法で普通のPCではどうしても音の長さ以上に変換に時間がかかってしまいます。 なーんか良いアイディアは無いでしょうか。。。 ※wavのままだとデータが大きすぎて今度は回線での転送が間に合いません。 ブラウザでやるなって話ですよね(汗

  • CentOS4.3が起動しません・・・

    いつもお世話になっています。 落雷による瞬電でサーバーが落ちてしまった後でCentOS4.3をインストールしているサーバー が起動しなくなってしまいました。 (本機はテストサーバーなのでUPSにつないでいなかったのです...) BIOS起動後、Linuxのログイン画面に進む前にテキストで [<c03ba696>]start-kernel+0x1f1/0x216 等とずらずら表示されたあとで以下のメッセージが表示され、起動することができません。 [<c03ba696>]start-kernel + 0x1f1/0x216 kernel panic - not syncing:include /linux/smp-lock.h:25:spin-unlock(kernel/sched.c:c035d5e4) not locked <0>kernel panic -not syncing:kernel/sched.c:460:spin-lock(kernel/sched.c:c03ea120) already locked by kernel/sched.c/2689 ブートローダーのカーネル選択画面は表示されますが、どれを選択しても同様の現象です。 インストールCDから「linux rescue」しても同様で、新規インストールしようとしても 同じタイミングで現象が発生します。 したがって,新規インストールすることもできない状態となっています。 ・CMOSクリア ・周辺機器を全てはずして起動 ・放電(コンセントを抜いて一晩放置) などハード的な対応はしてみましたが状況が変わりません。 このメッセージの意味と対処法をご存知の方がおられたらアドバイスいただければと思います。 以上、よろしくお願いいたします。

  • h8300-linux-elf-gccで指定可能な配列の大きさ

    AKI-H8/3069Fを使ってプログラムのC言語による組込ソフトの勉強をしています。そこで、教えていただきたいのですが、配列の大きさの上限値はいくつなのでしょうか? 例えば、unsigned int char a[1025];としてもコンパイル時にエラーが出なければ大丈夫なのでしょうか? 参考にしているのは、書籍『はじめる組込みLinux』です。そして、そのサポートサイトからダウンロードしたGCCコンパイラ(h8300-linux-elf-gcc)を使用しています。