マイコンの割り込みをLinux上で再現する

マイコンの割り込みをLinux上でシグナルとスレッドを使って再現してみた。

大まかな処理は、マルチスレッドで制御のスレッドとマイコンの処理相当を行うスレッドの2つを作成、
制御側からマイコンの処理相当のスレッドをシグナルで一時停止させ、その間に割り込みハンドラを実行する。
フルのソースコードは以下を参照。

https://github.com/yasuharu/micon_int_on_linux/

まずマイコン側の処理。UARTの受信を意図したもの。
uart_rx_handlerが割り込みハンドラ、micon_mainがマイコン側のメイン処理。

 1void uart_rx_handler()
 2{
 3  static int     pos   = 0;
 4  static uint8_t buf[] = "test";
 5
 6  ringbuf_push(buf[pos]);
 7
 8  pos++;
 9}
10
11void micon_main()
12{
13  register_irq_handler(uart_rx_handler);
14
15  while(1)
16  {
17    if(ringbuf_length() > 0)
18    {
19      printf("%d\n", ringbuf_pop());
20    }
21  }
22}

メイン側の処理は、マイコン用のスレッドを作成し、一定期間ごとに割り込みを生成する。
割り込みの生成タイミングは、お好きなタイミングでどうぞ。

 1pthread_t thread_handle;
 2
 3int main()
 4{
 5  pthread_create(&thread_handle, NULL, micon_thread, NULL);
 6
 7  for(int i = 0 ; i < 5 ; i++)
 8  {
 9    sleep(1);
10
11    suspend_micon_thread();
12    do_irq_handler();
13    resume_micon_thread();
14  }
15}

シグナルはSIGUSR1とSIGUSR2を使用する。
SIGUSR1はマイコン側の処理をsuspend、SIGUSR2はマイコン側の処理をresumeするために使用する。
micon_thread内で以下の通り初期化する。

 1void micon_thread()
 2{
 3  struct sigaction sigusr1, sigusr2;
 4
 5  sigusr1.sa_flags   = 0;
 6  sigusr1.sa_handler = micon_thread_signal_usr1_handler;
 7  sigemptyset(&sigusr1.sa_mask);
 8  sigaction(SIGUSR1, &sigusr1, NULL);
 9
10  sigusr2.sa_flags   = 0;
11  sigusr2.sa_handler = micon_thread_signal_usr2_handler;
12  sigemptyset(&sigusr2.sa_mask);
13  sigaction(SIGUSR2, &sigusr2, NULL);
14
15  micon_main();
16}

今回のポイントは、以下のコードの部分。
suspend/resumeでマイコン側のスレッドを一時停止させる。
SIGUSRT1のハンドラ(micon_thread_signal_usr1_handler)内では、
sigsuspendを呼んで、SIGUSR2が発生するまで待つ。

割り込みハンドラはメインのスレッド、シグナルのハンドラはマイコンのスレッドと、
それぞれで実行しているコンテキストが違うことに注意が必要。
特にシグナルのハンドラのsigsuspendを実行する前に、割り込みハンドラが実行されないよう、
int_statusで処理待ちを行うようにしている。
(ちなみに、int_statusは本来であればmutexでロックが必要)

割り込みが発生したときの処理をまとめると以下の図になる。

処理

do_irq_handlerはこんな感じ。
int_statusを待つことだけ注意。

1void      (*irq_handler)(void);
2
3void do_irq_handler()
4{
5  while(int_status != 1);
6
7  irq_handler();
8}
Posted at : 2018-01-28 15:46:12 / Category : avr

ディープラーニングはじめてみた

とあるデータの予測をしたいため、ディープラーニングをはじめてみた。

経緯としては、今まではルールベースでの予測だったものの、あまり精度が伸びず。
ディープラーニングでうまくいかないか試行錯誤してみることにしてみました。

まずは手元のMacBookProにTensorflow + Kerasの環境を構築。
UbuntuのVM上で構築したので、pipでさくっと入って良い感じです。
Jupyter notebookを使いたかったけど、こちらはPython 2.7上に入れようとしたのが問題なのか、
依存関係が不適切になってしまい断念。まぁなくてもどうにかなるでしょう。

まずは試しにMNISTのデータセットのexampleを動かしてみる。

https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py

K520 GPUだと2秒かかる学習をi7-6700HQだと10秒ほど。約5倍…。
実際にモデルを組んでみて、どうにもならなければディープラーニング用のマシンを用意したほうが良いかも。

ひとまず動くところまでは確認できたので、モデルの作り方を検討しながら、Kerasの使い方を調べてみよう。

Posted at : 2018-01-14 20:39:34 / Category : none

あけましておめでとうございます

■ 2017年について

今年は家庭状況が大きく変わりました。
大変なことも多いけど、楽しいことも多く、元気にやってます。

このブログの主としている技術的なことに関していえば、
必要な時間を割くことができずアウトプットがほとんど出せませんでした。
本当に自分が楽しいと思えることをじっくりとやっていくことが大切、と
思えるようになってきたので、着実にやっていくことを心がけていこうと思います。

さて、2017年の目標に対しての到達状況を見てみましょう。

  • 世の中に貢献できる成果を2,3は出していきたい
    • アイディアはいくつか出せた。
    • ただ、アイディアを実現するための作業ができていない。時間的なものもあるけど、あれこれ考えていてうまくいっていない部分が多い。
    • 徐々にだけど考えていくうちに見えてきた部分もあるので、実現させる方向にシフトにしていきたい。
  • 英語をきっちりと喋れるようにしたい
    • 自分としては段々と成長していることが感じられている。
    • 単一の言い回しが多かったり、表現の幅が狭いのでもっと増やしていきたい。
  • 他分野の知識を習得したい
    • 経済、料理は本で学んだり実践したりできた。
    • 特に料理は面白い。外食とかすると「こんな味付けがあるんだ」とか食材の活かし方とか、あれこれ考えながら楽しめる点が良い。

トータルで見れば意外と進んでるのかなと。良かった良かった。

■ 2018年について

大きな方向としては、楽しく面白い一年にしていきたいです。
家庭と仕事とやりたいことと大変なことも多いけど、がんばっていきます。

そんな2018年の目標は以下の通りです。

  • 世の中に貢献できるアイディア
    • 昨年のアイディアから、特に実現することに重点を置いてやっていきたい。
    • アイディアから収益を得られることを目標としていきます。
  • 世界を相手に活躍できる足がかりを作っていきたい
    • 昨年の英語をうまく活かして、海外の人と交流したりつながりを持てるようにしていきたい。その上で世界を相手に活躍できるようにしたい。
    • 1年では難しいと思うのでまずは足がかりから検討していきます。
  • 研究の活動をしていきたい
    • 大学を離れてからはあまり仕事ばかりだったけど、形はどうであれ、研究につながるような活動をしていきたい。
    • 特に今朝の夢がそんな感じだったので、実現すると良いと思う。

あと、日記も全然書いていなかったので書いていこうと思います。

Posted at : 2018-01-01 11:11:07 / Category : none