SlideShare una empresa de Scribd logo
1 de 90
Descargar para leer sin conexión
さわってみよう
TOPPERS/SSP
•  サンプルをいじってみて,TOPPERS/SSP
がどういうものかを,なんとなく知る
•  アジェンダ
– SSPのタスク管理理機能
– リソースの競合,排他制御
– その他雑多な話題
– まとめ
⽬目的
2
•  TOPPERS/SSP(ver.1.2.1)のリファレン
スターゲットは,CQ出版Interface誌
2012年年6⽉月号付録のFM3ボードです.⼀一
応これを念念頭に説明します.これに,
ARM向けgcc開発環境とプログラム書き込
みソフトウェア,USBシリアルモジュー
ルなどがあれば⼗十分です.
前提とする環境
3
こんなボード
•  GCC開発環境
– Code  Sourcery
http://www.mentor.com/embedded-‐‑‒software/sourcery-‐‑‒tools/
sourcery-‐‑‒codebench/editions/lite-‐‑‒edition/
– GNU  Tools  for  ARM  Embedded  Processors
https://launchpad.net/gcc-‐‑‒arm-‐‑‒embedded/
•  書き込みツール
– USB  Direct  Programmer  (Spansion)
*  http://www.spansion.com/jp/support/microcontrollers/
development-‐‑‒environment/pages/downloads-‐‑‒flash-‐‑‒usb-‐‑‒
direct.aspx
– JTAG  +  OpenOCD
ツール
4
•  Cortex-‐‑‒M0+向けの実装もあります.
– https://bitbucket.org/NSaitoNmiri/
toppers_̲ssp_̲lpc812/
* LPCXpresso  IDE  を使えばGCCを⽤用いたビルドか
らデバッグまで利利⽤用可能です.
* 上記リンクに⼿手順があります.
– 対象ボード:LPCXpresso  LPC-‐‑‒812
* http://akizukidenshi.com/catalog/g/
gM-‐‑‒06453/
ちなみに
5
•  例例えば「USBシリアル変換モジュール」
http://akizukidenshi.com/catalog/g/gK-‐‑‒01977/
•  別にPCとUART接続できるものであればな
んでも良良いです.
– マイコンの電源電圧に注意
シリアルモジュール
6
•  TOPPERS/SSPのビルドにはコンフィギュ
レータが必要です.
http://www.toppers.jp/cfg-‐‑‒download.html
– WindowsおよびLinux向けにはバイナリが⼊入
⼿手できます.それ以外(Macとか)はビルドす
る必要があります.
– ビルドにはboostライブラリが必要です.
* http://www.boost.org/
* 最近は様々なパッケージ管理理システムで簡単にイ
ンストールができるようになっていますのでそち
らを使う⼿手もあります
コンフィギュレーター
7
SSPのタスク管理理
8
•  SSPカーネルには2つのサンプルアプリが  
sample  ディレクトリの下に⽤用意されてい
ます.
– sample1  はSSPの機能がひと通り含まれるよ
うにできています.
– hello_̲world  は最⼩小限の構成のサンプルです.
•  初めて使う場合,シンプルな⽅方が全体を
把握しやすいのでまずは後者のサンプル
からスタートします.
はじめに
9
•  タスク1つ,シリアル出⼒力力のみ.
– SSPの標準サンプルの⼀一つ(シンプル版).
– システムが起動したら  “Hello  World.!”  とい
うメッセージを出⼒力力し,システムを終了了する.
•  まずは実際に動かしてメッセージを確認
する.
例例題:hello_̲world  サンプル
INIT_̲TASK システム終了了
10
開始 終了了
時間
•  サンプルプログラムをテンプレートから
セットアップします.
•  SSPのソースディレクトリの下にappとい
うディレクトリを⽤用意しているものとし
ます.(下の例例で  "$"  はプロンプトのつもりです)
ビルド⼿手順
$  pwd
<sspの置き場所>/app
$  mkdir  hello_̲world  ;  cd  hello_̲world
$  perl  ../../configure  -‐‑‒T  cq_̲frk_̲fm3_̲gcc    -‐‑‒A  hello_̲world
$  make  depend
$  make
11
•  必要なファイル
–  プログラムを記
述したファイル
*  ソースファイル
(*.c  ,  *.h)
–  OSの構成情報
*  コンフィギュ
レーションファ
イル(*.cfg)
実⾏行行プログラム作成⼿手順
12
OS
プログラム
⽬目的
プログラム
⽬目的
プログラム
⽬目的
プログラム
実⾏行行プログラム
リンク/再配置
ユーザ
プログラム
コンフィギュレータ
⽣生成C⾔言語プログラム
kernel_̲cfg.{c,h}
コンフィギュ
レーション
ファイル
コンパイル/アセンブル
コ
ン
フ
ギ
レー
シ
ン
  
•  hello_̲world.cfg
– システムコンフィギュレーションファイル
* カーネルオブジェクト(OSが管理理対象とするもの)
の構成情報(オブジェクトの個数や属性など)
* 静的APIを使って記述する
•  hello_̲world.h
– アプリで使われる定義や宣⾔言
– カーネル構成情報ファイルからも参照される
•  hello_̲world.c
– アプリのプログラム本体
ü それ以外も必要に応じてプログラム追加
サンプルのファイル構成
13
•  コンフィギュレーションファイルの例例
hello_̲world.cfg
/*
  *    TOPPESRS/SSPカーネルのサンプルプログラム
  */
#include  "hello_̲world.h"
INCLUDE("syssvc/serial.cfg");
INCLUDE("syssvc/banner.cfg");
CRE_̲TSK(INIT_̲TASK  ,  {  TA_̲ACT  ,  0  ,  task  ,  TASK_̲PRIORITY  ,  
STACK_̲SIZE  ,  NULL  });
14
•  #include
– kernel_̲cfg.c  に埋め込む  #include  ⽂文を指定
するためのもの
– hello_̲world.h  を  #include  してるのは  
kernel_̲cfg.c  のコンパイルに必要だから
•  INCLUDE
– 別のコンフィギュレーションファイルを読み
込む
– コンフィギュレーションファイルを分割管理理
するためのもの
INCLUDEと#includeの違い
15
•  INCLUDE("target_̲timer.cfg");
–  タイマー.時間管理理機能を使うために使われる
•  INCLUDE("syssvc/serial.cfg");
–  シリアルドライバ.シリアル送受信機能を提供.
•  INCLUDE("syssvc/banner.cfg");
–  起動時のバナー表⽰示.
•  INCLUDE("syssvc/syslog.cfg");
–  システムログ機能.ログバッファ領領域をもち,その領領域へのアクセス
を管理理する.また書式変換機能ももつ.
•  INCLUDE("syssvc/logtask.cfg");
–  ログタスク機能.ログバッファ領領域から定期的にログデータを読み出
して送出する.
INCLUDEで利利⽤用可能な機能
シリアル
タイマー
バナー
システム
ログ
ログタスク
低レベル
ログ出⼒力力
16
ユーザ
タスク
•  パラメータの意味
1.  タスク識識別⼦子
*  指定した名称を,プログラム中でタスクIDとして利利⽤用できる
2.  タスク属性:TA_̲NULL,  TA_̲ACT,  TA_̲RSTR
*  SSPではTA_̲RSTRを省省略略可能で,常に制約タスク扱い.
3.  起動時に関数へ渡す引数の値
4.  関数の先頭アドレス
5.  起動時優先度度:1〜~16
6.  タスクに必要なスタックサイズ
7.  スタックの先頭番地(常にNULL.  それ以外はエラー)
CRE_̲TSKの記述形式
17
CRE_̲TSK(INIT_̲TASK  ,  {  TA_̲ACT  ,  0  ,  task  ,  
TASK_̲PRIORITY  ,    STACK_̲SIZE  ,  NULL  });
•  SSPでは,タスクIDは起動時優先度度の⾼高
い順(値としては⼩小さい順)に1から始
まるタスクIDの値が割り当てられる.
•  起動時優先度度の設定値が1から連続して
いなくても,1から連続した値に割り当
て直される
•  割り当て結果はコンフィギュレーション
時にkernel_̲cfg.hで確認することができ
る.
タスクIDの決定ルール
18
•  システム開始時のタスクの初期状態
– 休⽌止状態または実⾏行行可能状態
– CRE_̲TSK  のタスク属性設定により異異なる
* TA_̲ACT  を指定した場合は,実⾏行行可能状態で開始
し,指定しない場合は,休⽌止状態で開始
タスクの初期状態
実⾏行行
可能
状態
休⽌止
状態
実⾏行行
状態
TA_̲ACT
属性あり
TA_̲ACT
属性なし
19
•  SSPでは,すべてのプログラムで1本のス
タックを共有する.そのスタックを共有
スタックと呼ぶ.  SSPの中だけの話です.
– 「すべてのプログラム」とは,タスク,割り
込み  {ハンドラ  or  サービスルーチン},  CPU
例例外ハンドラ,などなど.およそハンドラとつくもの全て
•  スタック領領域の先頭アドレスおよびサイ
ズは,使⽤用する静的APIおよびパラメータ
の値により異異なる.
– 確保されたサイズはkernel_̲cfg.c  への出⼒力力お
よび標準出⼒力力で確認することができる.
スタックサイズ
20
•  SSPカーネルは全ての処理理単位でスタック領領
域を共有する
–  待ち状態をサポートしないため
共有スタックの使⽤用イメージ
21
TASK1
開始
TASK1実⾏行行中に
TASK3開始
(プリエンプト)
TASK3実⾏行行中に
TASK6開始
(プリエンプト)
TASK6  終了了
→
TASK3再開
TASK3実⾏行行中に
TASK5開始
(プリエンプト)
割込み発⽣生
INT1  開始
→
INT1実⾏行行中に
多重割込み発⽣生
ISR2開始
•  静的APIの使い⽅方で異異なる
–  DEF_̲STKを使⽤用する場合
*  スタックアドレスにNULL指定
›  アドレスは⾃自動決定,サイズはDEF_̲STKの指定値
*  スタックアドレスにNULL以外の指定
›  アドレス,およびサイズはDEF_̲STKの指定値どおり
ü DEF_̲STK使⽤用時は,指定スタックサイズがCRE_̲TSKおよび
DEF_̲ICSの指定値から⾃自動算出された値以上であるかどう
か,チェックされる.
–  DEF_̲STKを使⽤用しない場合
*  アドレスは⾃自動決定,サイズはCRE_̲TSKおよびDEF_̲ICSで
の指定値から⾃自動算出
•  詳しくは  doc/configurator.txt  の(9)参照
⽂文中の「⾮非タスクコンテキスト⽤用のスタック領領域」という記述はミスです「共有ス
タックのスタック領領域」に読み替えてください.
共有スタックの定義
22
•  アプリのヘッダファイルの例例
hello_̲world.h
#ifndef TOPPERS_HELLO_WORLD_H
#define TOPPERS_HELLO_WORLD_H
/*
* ターゲット依存の定義
  */
#include "target_test.h"
#define TASK_PRIORITY (1)
#define STACK_SIZE (128)
#ifndef TOPPERS_MACRO_ONLY
extern void task(intptr_t exinf);
#endif /* TOPPERS_MACRO_ONLY */
#endif /* TOPPERS_HELLO_WORLD_H */
23
•  アプリケーションコードの例例
hello_̲world.c
#include  <kernel.h>
#include  "kernel_̲cfg.h"
#include  "syssvc/serial.h"
#include  "hello_̲world.h"
void  task(intptr_̲t  exinf)  {
                
                /*  メッセージの表⽰示  */
                (void)serial_̲wri_̲dat(TASK_̲PORTID  ,  MSGHELLO  ,  
sizeof(MSGHELLO)/sizeof(char_̲t));
                
                /*  カーネルの終了了  */
                (void)ext_̲ker();
}
24
•  タスクの処理理は関数として記述する
– 引数として拡張情報を渡すことができる
* データ型はintptr_̲t  (int型及びポインタ型を格納
できるサイズを持つデータ型)
– カーネル機能を使⽤用出来る以外は通常のC⾔言
語によって記述(他の処理理単位でも同様)
– 「タスク=関数」ではない
* つまり⼀一つの関数を複数のタスクとして動かせる
タスクプログラムの記述形式
void  task(intptr_̲t  exinf)    {
              /*    タスク処理理  */
}
25
•  #include  <kernel.h>
– カーネルに関する定義.カーネルの定義を使
うなら必要.
•  #include  "kernel_̲cfg.h"
– コンフィギュレーション結果のオブジェクト
IDを使う場合に必要
•  #include  "syssvc/serial.h"
– シリアルを利利⽤用する場合
•  #include  "hello_̲world.h"
– アプリの定義(アプリにより様々)
利利⽤用可能なヘッダファイル
26
•  ハードウェア処理理を記述する場合に使わ
れるファイル
– #include  "cq_̲frk_̲fm3.h"
* ターゲットのハードウェア定義ファイル
* ターゲット毎にファイル名が異異なるため,ター
ゲット依存部のドキュメントを参照する
– #include  <sil.h>
* システムインターフェースレイヤの定義ファイル
* メモリやデバイスレジスタへアクセスするための
関数などが定義されている
利利⽤用可能なヘッダファイル
27
•  いずれのAPIもタスクからのみ呼び出しが可能
•  extern  ER    serial_̲opn_̲por(ID  portid);
–  シリアルポートのオープン.利利⽤用する前に必ず呼び出す.
•  extern  ER    serial_̲cls_̲por(ID  portid);
–  シリアルポートのクローズ.
•  extern  ER_̲UINT    serial_̲rea_̲dat(ID  portid,  char_̲t  
*buf,  uint_̲t  len);
–  データ受信
•  extern  ER_̲UINT    serial_̲wri_̲dat(ID  portid,  const  
char_̲t  *buf,  uint_̲t  len);
–  データ送信
•  extern  ER    serial_̲ctl_̲por(ID  portid,  uint_̲t  ioctl);
–  ポートの設定
–  第2引数に指定可能な値:IOCTL_̲NULL(指定なし),
IOCTL_̲ECHO(受信した⽂文字をエコーバック),IOCTL_̲CRLF(LFを
送信する前にCRを付加)
シリアルドライバのAPI
28
•  タスクのプログラムコードにはシリアル
ポートのオープン処理理が不不⾜足しているた
め,追加しておく.
オープン処理理の追加
void  task(intptr_̲t  exinf)  {
                serial_̲opn_̲por(TASK_̲PORTID);      //  追加
                
                /*  メッセージの表⽰示  */
                (void)serial_̲wri_̲dat(TASK_̲PORTID  ,  MSGHELLO  ,  
sizeof(MSGHELLO)/sizeof(char_̲t));
                
                /*  カーネルの終了了  */
                (void)ext_̲ker();
}
29
•  ext_̲ker  を呼び出すことでカーネルは⾮非
動作状態へ移⾏行行する.
•  現状の実装では,カーネル機能やハード
ウェアの停⽌止処理理(割込み禁⽌止など)を⾏行行っ
た後,無限ループで動作を停⽌止する.
カーネルの終了了
/*  カーネルの終了了  */
                (void)ext_̲ker();
30
•  システムは電源を⼊入れたら基本的に動作
し続けます.
•  無限ループと空ループを使って⼀一定周期
ごとに繰り返し実⾏行行を⾏行行うように変更更し
てみる.
実習:プログラム変更更  (prog2)
INIT_̲TASK
31
コードの変更更
void  task(intptr_̲t  exinf)  {
    unsigned  long  int  i;
    /*  ポートオープン  */
    (void)serial_̲opn_̲por(TASK_̲PORTID);
    while(1)  {
                /*  ビジーウェイト  */
                for(i=0;  i<1000000UL;  i++)  {}
                /*  メッセージの表⽰示  */
                (void)serial_̲wri_̲dat(TASK_̲PORTID  ,  MSGHELLO  ,  
sizeof(MSGHELLO)/sizeof(char_̲t));
    }
}
32
•  LED点滅タスクを追加
– LED:⾼高優先度度,TA_̲ACT,  ループで点滅処理理
* ID:  LED_̲TASK,  関数名:led_̲task
– シリアル:低優先度度,ループで出⼒力力処理理
* ID:  SERIAL_̲TASK,  関数名:task  (そのまま)
•  LED制御⽤用関数
– sampleディレクトリにファイルled.{c,h}を
追加してみる
実習:LED処理理の追加(prog3)
LED_̲TASK
INIT_̲TASK
33
•  ⾃自分で作業してみる場合
– 既存のプロジェクトをコピーする
$  cp  -‐‑‒a  hello_̲world  prog3  ;    cd  prog3
– 追加ファイルを⽤用意.ここでは⽤用意したとします.
$  cp  ../../sample/led.{c,h}  .
– Makefile  を修正
* インクルードディレクトリの設定
* 追加ファイルの設定
実習サンプルの準備
ifdef  USE_̲CXX
    APPL_̲CXXOBJS  =  $(APPLNAME).o  led.o    #  追加
    APPL_̲COBJS  =
else
    APPL_̲COBJS  =  $(APPLNAME).o  led.o    #  追加
34
•  アプリがsampleに⽤用意されている場合
1.  新規ディレクトリを作成し,そこへ移動
2.  ファイルをコピーする.
3.  configure  の  -‐‑‒A  でアプリケーション名,-‐‑‒U  
で追加リンクしたいファイルを指定する.
*  sampleからアプリファイルのコピーとMakefile
の修正が⾃自動的に⾏行行われる.
実習サンプルの準備(2)
$  pwd
<sspの置き場所>/app
$  mkdir  prog3;  cd  prog3                          #  1
$  cp  ../../sample/led.{c,h}  .                #  2
$  ../../configure  -‐‑‒T  cq_̲frk_̲fm3_̲gcc    -‐‑‒A  prog3  -‐‑‒U  led.o            #3
$  make  depend
$  make
35
•  extern  void  init_̲led(void);
– LED点灯のためのハードウェア初期化
•  extern  void  set_̲led(bool_̲t  onoff);
– LEDの状態を変更更する
* true:  ON,  false:  OFF
•  extern  bool_̲t  get_̲led(void);
– 現在のLEDの状態を取得する
•  extern  bool_̲t  turn_̲led(void);
– LEDの状態を反転し,反転後の状態を返す.
..以後,こういう関数があるものとして説明を続けます.
(例例)追加したLED制御⽤用関数
36
タスクコードの追加
#include  "led.h"
void  led_̲task(intptr_̲t  exinf)  {
    unsigned  long  int  i;
    //  LEDの初期化
    init_̲led();
    while(1)  {
                /*  ビジーウェイト  */
                for(i=0;  i<1000000UL;  i++)  {}
                //  ここにLED点滅処理理を記述する.
                turn_̲led();
    }
}
37
※シリアル出⼒力力の task 関数の
中⾝身は前と同じとします.
cfgファイル
INCLUDE("syssvc/serial.cfg");
INCLUDE("syssvc/banner.cfg");
#include  "hello_̲world.h"
CRE_̲TSK(LED_̲TASK  ,  {  TA_̲ACT  ,  0  ,  led_̲task  ,  1  ,  
STACK_̲SIZE  ,  NULL  });            //  追加
CRE_̲TSK(SERIAL_̲TASK  ,  {  TA_̲ACT  ,  0  ,  task  ,  2  ,  
STACK_̲SIZE  ,  NULL  });
38
ヘッダファイル
#ifndef  TOPPERS_̲MACRO_̲ONLY
extern  void  task(intptr_̲t  exinf);
extern  void  led_̲task(intptr_̲t  exinf);  //  追加
#endif  /*  TOPPERS_̲MACRO_̲ONLY  */
#endif  /*  TOPPERS_̲HELLO_̲WORLD_̲H  */
39
•  うまく動かない
– LEDだけが点滅する.
•  何が起きているのか
– ⾼高優先度度タスクが常に動作
実⾏行行してみる
LED_̲TASK
INIT_̲TASK
LED_̲TASK
INIT_̲TASK
実際は
40
•  動く必要がないときは動かないように
•  どうすべきか:することが終わったらタ
スクを実⾏行行状態から外す.
– タスクを待ち状態にする(SSPでは無理理)
– タスクを休⽌止状態にする
•  タスクは普段停⽌止してるので,別の場所
から起動しないと動けない
– どこから?基本的には外部割込み
– 特に割込み発⽣生元がタイマの場合は周期処理理
* 制御系の場合は多い
RTOSのタスクコードの書き⽅方
41
•  LEDタスクを周期ハンドラから起動する
– 以下の構成で作ってみる
* 周期ハンドラ:周期500ms,システム開始時から
動作状態(TA_̲STA),LEDタスクを起動
›  ID:  LED_̲CYC,  関数名:tsk_̲act_̲cyc
* LED:⾼高優先度度,TA_̲NULL,  実⾏行行したら終了了
›  ID:  LED_̲TASK,  関数名:led_̲task
* シリアル:低優先度度,ループで出⼒力力処理理
›  ID:  SERIAL_̲TASK,  関数名:task  (そのまま)
›  システムログ&ログタスクを使って表⽰示してみる.
実習:周期ハンドラ  (prog4)
LED_̲TASK
INIT_̲TASK
LED_̲CYC
42
•  タスクなど,他の処理理単位と同様
•  タスクと異異なり,⾮非タスクコンテキスト
で動作する
– タスクより優先的に実⾏行行される
– 呼び出す事のできるサービスコールも異異なる
– タスクを起動する場合は  iact_̲tsk  を使う
周期ハンドラの関数の記述形式
void  tsk_̲act_̲cyc(intptr_̲t  exinf)  {
/*  周期ハンドラの処理理  */
}
43
•  パラメータの意味
1.  周期ハンドラの識識別⼦子
*  指定した名称をプログラム中でハンドラIDとして利利⽤用できる
2.  周期ハンドラ属性:TA_̲NULL,  TA_̲STAのみ指定可
3.  起動時に関数へ渡す引数の値
4.  関数の先頭アドレス
5.  起動周期
*  0  より⼤大きく,TMAX_̲RELTIM  以下
6.  起動位相(開始をどれだけずらすか)
*  0以上,TMAX_̲RELTIM  以下
*  TA_̲STA  のとき,0  より⼤大きく(0だと警告)
※  起動周期より⼤大きい値を指定しても良良い
CRE_̲CYCの記述形式
CRE_̲CYC(LED_̲CYC,  {TA_̲STA,  LED_̲TASK,  tsk_̲act_̲cyc,  
500,  10});
44
プログラムコードの追加
#include  "led.h"
void  led_̲task(intptr_̲t  exinf)  {
        turn_̲led();
}
void  tsk_̲act_̲cyc(intptr_̲t  exinf)  {  //  周期ハンドラ
        ID  tskid  =  (ID)exinf;
        iact_̲tsk(tskid);        //  タスク起動
}
extern  void  tsk_̲act_̲cyc(intptr_̲t  exinf);
extern  void  led_̲task(intptr_̲t  exinf);
CRE_̲TSK(LED_̲TASK  ,  {  TA_̲NULL  ,  0  ,  led_̲task  ,  1  ,  
STACK_̲SIZE  ,  NULL  });
CRE_̲CYC(LED_̲CYC,  {TA_̲STA,  LED_̲TASK,  tsk_̲act_̲cyc,  500,  10});
45
•  タスクの終了了は,単にタスクの関数でリ
ターンすればタスクが終了了となる.
•  終了了はタスクの関数から⾏行行わないと,で
きない.そのため,タスクからライブラ
リ関数を呼び出している場合,そのライ
ブラリ関数内でタスクを終了了させること
が,できない.
– ライブラリは必ず呼び出し元にリターンする
ように作成する
タスクの終了了
46
•  LEDタスクは1回実⾏行行毎に終了了し,周期的
に起動される.
•  LEDタスクに初期化を記述すると,初期化
が何度度も実⾏行行される.
•  そのため,初期化を別の場所に配置した
ほうがよい(2通り)
– ATT_̲INI  を利利⽤用する⽅方法
* タスクを別⽤用途に有効に利利⽤用できる
* 今回はこちらを使ってみる
– タスクで⾏行行う⽅方法
* OSの機能を使っている場合はこちらの⽅方法
LEDの初期化はどこへ?
47
•  ATT_̲INI
–  パラメータの意味
1.  初期化ルーチン属性:TA_̲NULLのみOK
2.  起動時に関数へ渡す引数の値
3.  関数の先頭アドレス
•  初期化ルーチンの記述形式
– 他の処理理単位と同様
– カーネルは⾮非動作状態であることに注意
初期化処理理の記述形式
ATT_̲INI({TA_̲NULL,  0,  led_̲initialize});
void  init_̲function(intptr_̲t  exinf)    {
              /*    初期化処理理  */
}
48
プログラムコードの追加
#include  "led.h"
//  LEDの初期化ルーチン
void  led_̲initialize(intptr_̲t  exinf)  {
    //  LEDの初期化
    init_̲led();
}
ATT_̲INI({TA_̲NULL,  0,  led_̲initialize});
extern  void  led_̲initialize(intptr_̲t  exinf);
49
•  システムログ機能.
– 内部にログデータ保管⽤用のリングバッファを
持ち,データを格納したり取り出したりする
ための機能
– アプリ向けの  printf  相当の書式変換機能つき
ログ出⼒力力機能
* 第1引数にはログの重要度度,第2引数以降降はprintf
と同様
システムログ機能の利利⽤用
void  syslog(uint_̲t  prio,  const  char  *format,  ...);
<使い⽅方>
#include  <t_̲syslog.h>
syslog(LOG_̲NOTICE,  "task  %d  is  running",  tskid);
50
•  システムログ機能によって格納されたロ
グデータを定期的に取り出し,出⼒力力する
機能
•  この機能はタスクを⼀一つもち,周期ハン
ドラによって定期的にデータ取り出しと
出⼒力力を実施する.
– 既定値では,ログタスクの起動時優先度度は3,
起動周期は10ms
– アプリで使⽤用するタスクの優先度度が重ならな
いように注意する
ログタスク機能
51
•  システムログ機能が持つ関数を使ってタ
スクがログデータを登録する
•  ログタスクは登録されたデータを定期的
に出⼒力力する.
それぞれの関係
タスク
システムログバッファ
(リングバッファ)
ログタスク
システムログ機能
52
利利⽤用のためのコード追加
#include  <t_̲syslog.h>    //  システムログ機能の利利⽤用に必要
void  task(intptr_̲t  exinf)  {
    unsigned  long  int  i;
    (void)serial_̲opn_̲por(TASK_̲PORTID);
    while(1)  {
for(i=0;  i<1000000UL;  i++)  {}
/*  メッセージの表⽰示  */
syslog(LOG_̲NOTICE,  "%s",  "Hello  World.!");
    }
}
INCLUDE("syssvc/syslog.cfg");    //  cfgファイルへ追加
INCLUDE("syssvc/logtask.cfg");
53
•  LEDもシリアル出⼒力力も両⽅方動いているか.
•  スケジューラの動作
– 周期ハンドラ(タイマ割込み)は常にタスク
より優先される
– 割込みからのタスク起動によりタスクが動作
を開始するのは少なくともハンドラの実⾏行行が
終了了してから(遅延ディスパッチ)
– 常に⾼高優先度度タスクから実⾏行行される
– ログタスクは定期的に起動され,ログデータ
を回収し,出⼒力力する
動作の確認
54
•  シリアルタスク(ID:  SERIAL_̲TASK)を周
期ハンドラで1秒毎に起動し,実⾏行行毎に終
了了するように変更更する.
– 周期ハンドラの⽣生成(周期1秒)
– シリアルポートのオープンは内部でOSの機能
を利利⽤用しているためタスクから呼び出す.初
期化⽤用タスク(ID:INIT_̲TASK)を⽤用意する.
– 周期ハンドラはシステム起動時に停⽌止状態と
し,初期化タスクの最後に開始する.
– 優先度度設定
* 初期化タスク:1,残りはいろいろ変えてみる
›  ログタスクの優先度度(3)と重ならないように
課題:シリアルタスクの
周期起動(prog5)
55
ハンドラからタスクの起動
LED_̲TASK
SERIAL_̲TASK
LED_̲CYC
SERIAL_̲CYC
LOGTASK
LOCCYC
56
起動
起動
起動
•  ハンドラからタスク起動,タイミングに
よってはプリエンプションによるディス
パッチ発⽣生
実⾏行行イメージ
57
LED_̲TASK
SERIAL_̲TASK
LED_̲CYC
SERIAL_̲CYC
LOGTASK
LOCCYC
•  prog5を以下のように変更更する
– シリアルタスク(ID:  SERIAL_̲TASK)を10ms
秒毎に起動し,⼊入⼒力力をチェックする.
– 'a'が⼊入⼒力力されたとき,メッセージを表⽰示する
タスク(ID:MES_̲TASK)を起動してメッセー
ジ出⼒力力処理理を⾏行行う.
– 'a'  以外の場合は  ”Unknown  command(<⼊入
⼒力力⽂文字>)”  のメッセージを表⽰示する.
•  LEDの点滅はそのまま
課題:シリアル⼊入⼒力力  (prog6)
58
•  ごく簡単な構成をSSPで実現してみた
•  処理理は基本的に割込みをきっかけとして
開始し,タスクへ通知される
– 時間をきっかけとするものについては周期ハ
ンドラ,アラームハンドラが利利⽤用できる
ここまでのまとめ
⼊入⼒力力
処理理
⼊入⼒力力 出⼒力力
計算
処理理
出⼒力力
処理理
プログラム
プログラム
⼊入⼒力力 出⼒力力
ハンドラ タスク
出⼒力力⼊入⼒力力 通知
プログラム
59
•  SSPでは,タスクは処理理を終えたら終了了す
るように作成する.再度度実⾏行行する場合に
は起動する処理理単位が必要である.
•  タスクへの通知⽅方法として  iact_̲tsk(割込
み→タスク),act_̲tsk(タスク→タスク)が
ある.
•  初期化を分けて記述する必要がある.
ATT_̲INIを使う⽅方法とタスクで初期化す
る⽅方法がある.
まとめ
60
SSPでの排他制御
61
•  システム全体では複数の処理理が並⾏行行して
実⾏行行される.
•  実際には,互いに関連する場合がある.
– 処理理Aが完了了したら処理理Bと処理理Cが⾏行行われる
– 処理理Aと処理理Bが完了了したら処理理Cを開始する
– 処理理Aと処理理Bは同じサービスCを利利⽤用する
SSPを使ったプログラムの構成
⼊入⼒力力 出⼒力力
⼊入⼒力力 出⼒力力
⼊入⼒力力 出⼒力力
⼊入⼒力力 出⼒力力
62
•  問題なのは,サービスやリソースを提供する
関数やメモリ領領域などのリソースを複数のプ
ログラムが利利⽤用する場合
•  あるプログラムがリソース利利⽤用途中で,別の
プログラムが同じ関数やリソースへアクセス
した場合に計算結果が誤る可能性がある.
資源の競合,再⼊入可能性
OS処理理単位
OS処理理単位
関数
または
リソース
アクセス
アクセス
63
(例例)
task1
task2
handler
//  ⾜足し算を⾏行行うプログラム
int  var1,  var2;
int  calc_̲add()  {
        int  res;
        res  =  var1  +  var2;
        return  res;
}
void  task1()  {
        var1  =  10;
        var2  =  100;
        result  =  calc_̲add();
}
void  task2()  {
        var1  =  20;
        var2  =  300;
        result  =  calc_̲add();
}
ここで割込みが
発⽣生
答:320答:320
答:110 答:120
64
•  グローバル変数やスタティック変数を
使っている場合
•  デバイスレジスタなど,ハードウェアに
アクセスしている場合
問題が⽣生じる場合
65
•  全てローカル変数で済ませる
•  排他制御を⾏行行う
–  例例えばシリアルドライバは内部で排他制御を⾏行行
なっている
•  アクセスできるタスクを1つに限定してその
タスクが他のタスクにサービスを提供する
–  タスク間のデータのやり取りはOSのタスク間通
信機能を使う
–  SSPの場合,現状では通信機能を持っていないの
で,リングバッファ等を実装して排他制御を併⽤用
することになる.
*  システムログ機能+ログタスクはこの例例といえる
解決策
66
•  ある処理理が共有資源へアクセス中に、他
の処理理が同じ資源へアクセスできないよ
うにすること
– この場合の他の処理理とは,⾃自分より優先度度の
⾼高い処理理(割込み処理理など)が該当する
•  排他制御が必要な区間を危険領領域(クリ
ティカルセクション)と呼ぶ
排他制御による同期
処理2	
 処理1	
アクセス アクセス
ブロック	
67
•  基本的には「⾃自タスクより優先順位の⾼高
い処理理からアクセスを防ぐ」ということ
•  SSPで使えそうな⽅方法
– dis_̲dsp  によるディスパッチ禁⽌止
* ディスパッチが起こらないので結果的にブロック
できるが、全タスクが影響をうける
– dis_̲int  による割込みの禁⽌止
* 割込みが特定できる場合
– loc_̲cpu  によるCPUロック状態への移⾏行行
* 排他制御の相⼿手が割込み処理理を含む場合
– 実⾏行行時優先度度を使う
* 特定の優先度度以下のディスパッチを抑制する
SSPで可能な排他制御⼿手段
68
•  低優先度度の処理理は,クリティカルセク
ション開始前に排他制御⼿手順を実施する.
– ⾼高優先度度処理理側も,クリティカルセクション
開始前に同様の排他制御⼿手順を実施する場合
がある
•  クリティカルセクションが終了了したら排
他制御⼿手段の終了了⼿手順を⾏行行う.
排他制御の典型的な構造
void  低優先度度処理理(VP_̲INT  exinf)  {
        排他制御開始;
        クリティカルセクションの実⾏行行;
        排他制御終了了;
}
69
(例例)ディスパッチ禁⽌止
•  クリティカルセクションの実⾏行行前後を
ディスパッチ禁⽌止/許可で囲む.
– ⾼高優先度度処理理側は何もしなくても良良い
•  特徴
– 全てのタスク切切り替えがブロックされる
– 割込みはブロックされないため,受付が可能
void  低優先度度処理理(VP_̲INT  exinf)  {
        dis_̲dsp();
        クリティカルセクションの実⾏行行;
        ena_̲dsp();
}
70
(例例)シリアルドライバ
ER_UINT
serial_wri_dat(ID portid, const char_t *buf, uint_t len)
{
/* 呼び出し条件のチェックなど(省省略略)  */
SVC((rercd = loc_cpu()) , rercd);
if(!serial_sndbuf_full(p_spcb))
{
while(wricnt < len)
{
SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd);
wricnt++;
}
}
SVC((rercd = unl_cpu()) , rercd);
error_exit:
return(wricnt > 0U ? (ER_UINT) wricnt : rercd);
}
71
•  排他制御区間の管理理
– 同じ排他制御⼿手段がネストしていると意図し
ない⾮非排他区間が存在する可能性がある
– 対策
* 状態を確認して,排他区間を抜ける際に元の状態
にもどすよう実装を変更更する
* 関数の仕様として呼び出し条件を明記するなどし
て呼び出されないようにする
注意点
72
void  task1()  {
        loc_̲cpu();
        func1();
        func2();
        unl_̲cpu();
}
void  task1()  {
        loc_̲cpu();
        //  危険領領域
        unl_̲cpu();
}
func2は排他制
御
されていない
•  2つのタスク  TASK1,  TASK2  があり,そ
の2つが  calc_̲add  関数を利利⽤用している.
しかし,計算結果に不不整合が⽣生じている.
排他制御により問題を解決する.
•  本来ならローカル変数にするのが普通な
内容ですが,デバイスレジスタへのアク
セスなどでは同様の構造がありえますの
で,そのつもりで考えてみてください.
実習:排他制御(prog7)
73
再⼊入可能でない関数
/*
  *  問題のある関数の例例:⾜足し算
  */
static  int_̲t  var1;
static  int_̲t  var2;
int_̲t  calc_̲add(void)  
{
    int_̲t  result;
    result  =  var1  +  var2;
    return  result;
}
74
タスクの例例(TASK1,2共通)
void  task(intptr_̲t  exinf)  {/*  周期起動されるタスク  */
        ID  tskid  =  (ID)exinf;
        int_̲t  calc_̲result;
        syslog(LOG_̲NOTICE,  "Task  %d  start.",  tskid);
        var1  =  tskid;
        syslog(LOG_̲NOTICE,  "task(%d):var1  =  %d.",  tskid,  var1);
        var2  =  tskid;
        syslog(LOG_̲NOTICE,  "task(%d):var2  =  %d.",  tskid,  var2);
        calc_̲result  =  calc_̲add();
        syslog(LOG_̲NOTICE,  "task(%d):calc_̲result  =  %d.",  tskid,  calc_̲result);
        if(calc_̲result  ==  tskid  *  2)  {
                syslog(LOG_̲NOTICE,  "task(%d):result  OK  =  %d",  tskid,  calc_̲result);
        }
        else  {
                syslog(LOG_̲NOTICE,  "task(%d):result  NG  =  %d",  tskid,  calc_̲result);
                ext_̲ker();  //  カーネル終了了
      }}
75
NGの場合の実⾏行行結果
Task  3  start.
task(3):var1  =  3.
task(3):var2  =  3.
task(3):calc_̲result  =  6.
task(3):result  OK  =  6
Task  4  start.
task(4):var1  =  4.
Task  3  start.
task(3):var1  =  3.
task(3):var2  =  3.
task(3):calc_̲result  =  6.
task(3):result  OK  =  6
task(4):var2  =  4.
task(4):calc_̲result  =  7.
Task  3  start.
task(3):var1  =  3.
task(3):var2  =  3.
task(3):calc_̲result  =  6.
task(3):result  OK  =  6
task(4):result  NG  =  7
76
修正後の実⾏行行結果
Task  3  start.
task(3):var1  =  3.
task(3):var2  =  3.
task(3):calc_̲result  =  6.
task(3):result  OK  =  6
Task  4  start.
task(4):var1  =  4.
task(4):var2  =  4.
task(4):calc_̲result  =  8.
Task  3  start.
task(3):var1  =  3.
task(3):var2  =  3.
task(3):calc_̲result  =  6.
task(3):result  OK  =  6
task(4):result  OK  =  8
Task  4  start.
task(4):var1  =  4.
task(4):var2  =  4.
task(4):calc_̲result  =  8.
task(4):result  OK  =  8
77
•  複数のプログラムが並⾏行行して動作する環
境では,関数やリソースが同時にアクセ
ス可能かどうかが問題となる.
•  解決策としては,ローカル変数化,呼び
出し側での排他制御,専⽤用タスク化して
OSの通信機能を利利⽤用する,などの⽅方法が
考えられる.現状のSSPでは排他制御によ
る⽅方法が典型的である.システムログ+
ログタスクは専⽤用タスク化の例例といえる.
ここまでのまとめ
78
その他雑多な話題
79
•  割込みハンドラ/サービスルーチン
•  アラームハンドラ
–  ハンドラ内部の作り⽅方は周期ハンドラと同じ
•  イベントフラグ,データキュー
•  CPU例例外処理理
–  CPU例例外発⽣生時にタスクだけでリカバリは困難
•  実⾏行行時優先度度
–  メモリ節約の⼿手段.リアルタイム性とトレードオフ
•  共有スタック定義
–  DEF_̲STK  による共有スタック領領域の確保.
•  タスク起動要求キューイング
–  起動要求を1回まで記憶
今回扱えなかったSSP機能
80
•  タスクが実⾏行行開始後にもつ優先度度
– ひとたび実⾏行行開始したら,タスク終了了までそ
の優先度度のまま
•  ⽬目的
– メモリ節約
* ディスパッチが抑制されるため,システムの最⼤大
スタック使⽤用量量の予測値が減る
– 排他制御
* 引き上げられた優先度度と同じかそれより低い優先
度度のタスクは実⾏行行がブロックされる
•  問題点
– リアルタイム性が多少犠牲になる
実⾏行行時優先度度
81
•  SSPカーネルは全ての処理理単位でスタック領領
域を共有する
実⾏行行時優先度度と共有スタック
82
タスクID 起動時優先度度 実⾏行行時優先度度
TASK1 1 1
TASK2 2 2
TASK3 3 1
TASK1
TASK3TASK2
TASK1
TASK3
TASK2
TASK3実⾏行行中は他タスクに
プリエンプトされないため,
必要最⼤大スタックが下がる
スケジューリングへの影響
タスクID 起動時優先度度 実⾏行行時優先度度
TASK1 1 1
TASK2 2 2
TASK3 3 1
task3
開始
task1
task1
起動
task3
終了了
task1
開始
task3
起動
task2
起動
task1
終了了
task2
開始
task2
終了了
task3
開始
task3
終了了
task2
task3
実⾏行行開始が
待たされる
83
TASK3は
実⾏行行開始すると
優先度度1(最⾼高)
として扱われる
TASK3は
実⾏行行開始するまでは
優先度度3として扱われる.
したがって開始順序は最後
DEF_̲EPR  の記述形式
•  静的API  の意味
– 対象タスクの実⾏行行優先度度を設定する
– DEF_̲EPR  で設定していないタスクについて
は,CRE_̲TSK  で指定した優先度度(起動優先
度度)の値と同じとする
•  パラメータの意味
1. 対象タスクID
2. 実⾏行行時優先度度の値
*  起動優先度度よりも優先度度を⾼高くする必要がある
DEF_̲EPR(TASK3  ,  {  2  });  
84
•  基本的にできれば,あまり分割しない
– 分割の根拠が明確でなければ.
•  1つの考え⽅方:時間制約で考えてみる
– もともとRTOSのタスクは異異なる時間制約を1
つのプロセッサで実現するためのもの
– SSPでは1優先度度1タスクのため,1タスクに
複数機能が対応する場合もありえる
•  検討例例
– 1つの機能項⽬目に時間制約が異異なるものがあ
れば,それを分割する
– 時間制約が同じものを同じタスクに割り当て
タスクの分割
85
(例例)タスクマッピングリスト
参考:「組込みソフトウェア向け設計ガイド」P60
http://sec.ipa.go.jp/publish/tn12-003.html
•  下図のような表形式で整理理する⽅方法もあ
る
機能項⽬目 時間制約 タスクA タスクB
機能項⽬目1 10ms ◯
機能項⽬目2 200ms ◯
機能項⽬目3 10ms ◯
機能項⽬目4 200ms ◯
86
•  1つの考え⽅方:Rate  Monotonic  Scheduling
–  相対デッドラインが短いタスクを⾼高優先度度にする
–  相対デッドライン=周期とした場合,周期が短いタスク
•  前提
–  システムの最⼤大負荷が⾒見見積もれること
*  Σ(1回の最⼤大実⾏行行時間×頻度度)
–  周期タスク(最⼩小軌道間隔)がわかっている
–  シングルプロセッサである
–  相対デッドラインが周期以下
–  タスク間に同期通信がない
–  タスクは⾃自ら実⾏行行を中断しない
–  タスク切切り替えのオーバーヘッドを考えない
•  今回の内容の範囲外であるが,例例えばTOPPERS中級実
装セミナー教材の資料料が参考になる
–  http://www.toppers.jp/edu-‐‑‒middle.html
優先度度設定
87
最後に
88
•  新規ターゲットへの対応
•  MindstomsNXT  は動作確認済み
•  MSP430(LaunchPad)は挑戦中だがちと厳しい
•  8pin  ARM(LPC810,  Cortex-‐‑‒M0+)  へも挑戦中
•  現状,Lチカだけでメモリいっぱい
•  RPi  への対応
•  Intel  Galileo  ボードへの対応
•  その他,今後もいろいろ予定しておりますのでよろ
しくお願いします.
今後の予定
89
•  TOPPERS/SSPカーネルの基本的な使い⽅方
について,実際に触ってみた
– タスクの利利⽤用,割込みからのタスク起動
– カーネルで⽤用意されているサービス
– いくつかの排他制御⼿手段の利利⽤用
•  その他,同期通信機能や,スタック設定
などの機能を持っている
•  現在も新規ターゲットの対応などを⾏行行っ
ている
まとめ
90

Más contenido relacionado

La actualidad más candente

トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2Takashi Hoshino
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~モノビット エンジン
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)Takeshi HASEGAWA
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎Naruhiko Ogasawara
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
Introduction to boost test
Introduction to boost testIntroduction to boost test
Introduction to boost testKohsuke Yuasa
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
性能測定道 事始め編
性能測定道 事始め編性能測定道 事始め編
性能測定道 事始め編Yuto Hayamizu
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Hokkaido.cap #osc11do Wiresharkを使いこなそう!Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Hokkaido.cap #osc11do Wiresharkを使いこなそう!Panda Yamaki
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 

La actualidad más candente (20)

トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
Apache Hadoopの新機能Ozoneの現状
Apache Hadoopの新機能Ozoneの現状Apache Hadoopの新機能Ozoneの現状
Apache Hadoopの新機能Ozoneの現状
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Introduction to boost test
Introduction to boost testIntroduction to boost test
Introduction to boost test
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
性能測定道 事始め編
性能測定道 事始め編性能測定道 事始め編
性能測定道 事始め編
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Hokkaido.cap #osc11do Wiresharkを使いこなそう!Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 

Similar a さわってみようTOPPERS/SSP

Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎Sho A
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめMakiko Konoshima
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)Shoji Haraguchi
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)Kazuhiro Yoshikawa
 
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)YoheiOkuyama
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプトbsdhack
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_publicKazuaki Ishizaki
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方Sho Shimauchi
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overviewRyo Sakamoto
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥Insight Technology, Inc.
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTakahisa Iwamoto
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMikiya Okuno
 
LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要ADVENTURE Project
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)Kazuko Itoda
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 

Similar a さわってみようTOPPERS/SSP (20)

Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
qmake入門
qmake入門qmake入門
qmake入門
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)
 
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
 
LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要LexADV_TryDDM Ver. 0.1bの概要
LexADV_TryDDM Ver. 0.1bの概要
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 

さわってみようTOPPERS/SSP