組み込みOS自作入門勉強会(2)

一章の続き。はじめてリンカスクリプトを書くなどした。書き込むときは、ディップスイッチをON,ON,OFF,ONにする。端末エミュレーターはminicomを使用した。人に聞くとscreenでも接続できるらしい。今度やってみよう。んで、ようやくhello worldが出せた!写真撮影用にデジカメ欲しいな。以下、メモ。

H8への書き込み

まずディップスイッチはON,ON,OFF,ONに設定。

 h8write -3069 -f20 foo.mot /dev/ttyUSB0 /* LinuxかつUSB-Serialのとき */

minicomの設定

# minicom -s -o
9600bps, stopbit 1, パリティなしに設定。(96008N1)。ハード/ソフトフロー制御などはすべてOFF。
シリアルポートも/dev/ttyUSB0などに変更。

終了するには、C-a C-x。xmodem転送は、C-a C-s

組み込みOS自作入門勉強会(1)

Sakai Hiroaki's Home Pageを読み始めた。読書メモを残していく。まずは1stステップ。このステップのメインはクロスコンパイラ環境の構築である。当初、MacOSXでやろうとしたもののgccコンパイルがうまくいかずに断念。そのため環境は Ubuntu10.04 on VMware Fusion とした。

binutilsのインストール

$ wget http://core.ring.gr.jp/pub/GNU/binutils/binutils-2.19.1.tar.gz
$ tar xzvf binutils-2.19.1.tar.gz
$ ./configure --target=h8300-elf --disable-nls
$ make
$ sudo make install

gccのインストール

H8マイコンで実行できるバイナリを生成するために、gccをH8マイコン用のクロスコンパイラとしてコンパイルする。

$ wget http://core.ring.gr.jp/pub/GNU/gcc/gcc-3.4.6/gcc-core-3.4.6.tar.gz
$ tar xzvf gcc-core-3.4.6.tar.gz
$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c

このままビルドするとエラーがでるので、一部修正する。

$ vi gcc/collect2.c
-redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT);
+redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0755);

これでビルドが通るようになるのでmake.

$ make
$ sudo make install

以上でクロスコンパイラ環境構築は終了。

SRM 471 EllyPlaylists

class EllysPlaylists {
public:
  int countPlaylists(vector <string> songs, int K) {
    int ret = 0;
    vector<string>::iterator it = songs.begin();
    while( it != songs.end() ){
	ret += seq( *it, K, 1, songs );
	it++;	
    }
    return ret;
  }

  int seq(string song, int K, int n, vector<string> songs){
    int ret = 0;
    int len = song.size();
    string suffix = song.substr( len - 3 );
    if( K == n ) return 1;
    vector<string>::iterator it = songs.begin();
    while( it != songs.end() ){
	string prefix = (*it).substr(0, 3);
	if( suffix == prefix ) ret += seq( *it, K, n + 1, songs);
	++it;
    }
    return ret;
  }
};

ここまで書いたところで鯖落ち.CASE5が延々と終了しなくなってるのでこのままだと駄目.それ以外はPASSしていた.修正したいが問題もみれないので今日はここまでにする.

SRM 471 PrimeContainers

#include <set>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

class PrimeContainers {
public:
  int containerSize(int N) {
    int ret = 0;
  int i = 1;
  set<int> s;

  while(i){
   if(i > N) break;
   s.insert( ( N / i ) );
   i = i << 1;
  }
  set<int>::iterator it = s.begin();
  while( it != s.end() ){
   cout << *it << endl;
   if( isPrime( *it ) ) ret++;
   ++it;
  }
    return ret;
  }

  bool isPrime(int n){
    int i;
  if(n < 2)
        return false;
    else if(n == 2)
        return true;

    if(n % 2 == 0)
        return false;

    for(i = 3; i * i <= n; i += 2)
         if(n % i == 0)
            return false;
    return true;
  }
};

エラトステネスの篩とかわすれてて困った.setにしたのは1を重複させないため.

SRM470 LinearTravellingSalesman

class LinearTravellingSalesman {
public:
  int findMinimumDistance(vector <int> x, vector <int> y) {
      int ret = 0;
	vector< pair<int, int> > pos;

	for(int i = 0; i < x.size(); i++)
		pos.push_back( make_pair( x[i], y[i] ) );	
	
	sort( pos.begin(), pos.end() );

	for(int i = 0; i < x.size() - 1; i++){
		ret += abs(pos[i].first - pos[i+1].first) + abs(pos[i].second - pos[i+1].second);		
	}

    return ret;
  }

};

インターバル中.思い浮かばなかったので適当に書いて提出.撃墜される予感.0:00開始とか眠すぎる.

第4回kernel/vm勉強会に参加してみた

面白そうだったので参加してみた.発表者のPlan9率の高さにあの会場にいるとPlan9がメジャーなOSに見える.あとはBSDUbuntuくらいだったかな.会場でYUREXが大人気だった.500円だったし,一つくらい買ってもよかったかも.

発表は全体的に興味深くて面白かった.特に印象に残ったのは,KOZOSさんの「秋月のH8ボードで動く組み込みOSを作ってみよう」,yojiroさんの「ブラックボックス解析 - デバイスドライバの作成」とshudo先生の「いまどきのBinary Hacks」だった.KOZOSさんの内容は自作OSをH8マイコンで動かすといった内容.KOZOSさん著の書籍が5/24に出るらしい.全12章構成ということで高専や大学の授業カリキュラムでお勧めだそう.面白そうなので購入予定.デバドラ解析はUSBアナライザ(400ドルくらいらしい)を利用して,YUREXと中国製の温度計のデバドラを作ったお話.「電気信号読んで何が悪い」は名言.あとiPadでプレゼンしてた.Binary Hacksはバイナリ読んで,動かなかったライブラリを動かせるようにしたという内容.元のプログラムが独自にスタックポインタの管理をしていて,元作者のミスでスタックポインタの値がずれていたのでそれを発見・修正.「Segmentation faultは友達」.

懇親会にも参加.携帯はIPhone,Desire,Xperiaスマートフォンだらけだった.超漢字の話などを聞いたりした.トンパ文字の存在を初めて知った.使うことはおそらく一生ないだろう.

SRM469 TheMoviesLevelOneDivTwo

連続した2席があるかを見ていくだけ.

#include <iostream>
#include <vector>
using namespace std;

class TheMoviesLevelOneDivTwo {
public:
  int find(int n, int m, vector <int> row, vector <int> seat) {
    int ret = 0;
    int s[n][m];

    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
	    s[i][j] = 0;


    for(int i = 0; i < row.size(); i++)
        s[row[i] - 1][seat[i] - 1] = 1;
	
    for(int i = n - 1; i >= 0; i--)
        for(int j = 0; j < m - 1; j++)
	    if(!s[i][j] && !s[i][j+1]) ret++;

    for(int i = n - 1; i >= 0; i--){
        for(int j = 0; j < m; j++){
	    cout << s[i][j] << " ";
	}
	cout << endl;
    }

    return ret;
  }
};

600の問題は,ほかの人の回答を見るとnext_permutationを使ってた.配列の初期化はmemsetを利用したほうがタイプ量が少なくてすみそう.