2012/10/21

eeePCのAndroid化

ノートPCを買ったことで出番の無くなったネットブックのeeePC901-X。しばらく放っていたけどWeb閲覧とメールをサッと立ちあげてリビングで使うためにAndroidをインストールしてみた。

ここから「android-x86-4.0-RC2-eeepc.iso」をダウンロードして、「DD for Windows」でUSBメモリにisoイメージを書き込んで、eeePCに挿して起動すればインストールできた。

あとは、以下の手順で、android x86でARMをエミュレートできるようにすれば完了。
ここを参考にここからibhoudiniとlibdvm_houdini.so、houdini_armlibs.tgzをダウンロードして、libhoudiniとlibdvm_houdini.soを/system/lib/ディレクトリ以下にコピー。houdini_armlibs.tgzを解凍してできたファイルを/system/lib/arm/ディレクトリを作ってそこにコピー。再起動。
これで、「google日本語入力」とかが使えるようになる。



動作はサクサク、キーボード付きのアンドロイド4.0端末の出来上がり!
注意点はキーボード配列がUSなので@を入力する時は「Shift+2」

2012/10/14

グローバルデータ

北京出張中のデータ通信用にグローバルデータのMiFiをレンタルしていった。
実物がこれ。
これとWiFiでパソコンとかスマホを接続すれば、webサイトやメールを確認できる、はずだったのだが。。。持っていったPCとはすぐに接続できたのに、スマホと接続できない。
スマホは先日購入したXperia sola。全然接続できず、接続してもすぐに切断されてしまう。スマホと接続できなかったら、これをレンタルした価値が半減以下に。
ネットで調べたら、どうもXperia solaと繋がらないWifi機器がチョイチョイあるようだ。今回レンタルしたMiFiもそれだったようだ。
で、ちょっと強引なことやってみた!
レンタルしたMiFiからSIMカードをぶっこ抜いてXperia solaに挿してみたら、自動的にAPN設定をダウンロードして簡単に通信できた。(ちなみにSIMはChina Unicomだった)
流石SIMフリー!パソコンと繋げるときは、Xperia solaでテザリングすればOKだし、かなり快適なネット環境が手に入った。
(利用規約上、問題が有るかどうかは未確認なので同じことする時は自己責任で。。。)

2012/09/30

Xperia sola 購入

今まで使っていたXperia X10(SO-01B)の動きがもっさり遅くてイライラしてきたので、新しいスマホを購入。
Xperia SXがサイズ的にも機能的にもベストだったけど、値段が高すぎて手が出ない。安めで小さめサイズとなるとXperia solaがベターな選択になりました。
実際購入したのは、これ。液晶保護シート・送料・関税込みで24,480円でした。

海外モデルなので最初からSIMフリーなのはいいんですが、フォントが中華フォントでちょっと微妙、、、戻るとか直すがこんな感じ。


でも、うれしい誤算がこの記事「SONYがXperia solaのICSアップデートにおいて、「手袋モード(glove mode)」なる新しい機能を追加します。」
冬に手袋したままスマホを触れる!!寒くなるまでにアップデートしてほしいな。


2012/05/12

組込み用RTOS作成(μITRON風)3

rot_rdqとdly_tskの実装

/****************************************************/
// タスクの優先順位の回転
// 次のタスクに制御権を渡す
/****************************************************/
void rot_rdq(void)
{
int i_oldtaskid;
i_oldtaskid = iCurrentTaskID; // 現在の実行タスク番号を保存
iCurrentTaskID++; // 次の実行タスク番号へ
if(iCurrentTaskID >= TASK_MAX) iCurrentTaskID = 0; // タスク数以上なら先頭タスクへ
dispatch(&TCB[i_oldtaskid].iSP, TCB[iCurrentTaskID].iSP); // ディスパッチ
}

説明するほどではないが、現在実行中のタスクのスタックポインタ保存先アドレスと次に実行するタスクのスタックポインタ値をdispatchの引数として渡している。

/****************************************************/
// 自タスクの遅延
// int dly_time 遅延時間(0~)
// 単位:TAU0チャンネル0のインターバル時間
// dly_time時間以上実行を一時停止する
/****************************************************/
void dly_tsk(int dly_time)
{
TCB[iCurrentTaskID].iWaitTime = dly_time + 1; // 待ち時間をセット
while(TCB[iCurrentTaskID].iWaitTime){ // 0になるまで待ち
rot_rdq();
}
}

こちらも説明するほどではないが、タスクコントロールブロックの待ち時間に遅延時間をセットしてその値が0になるまでrot_rdqして待っている。dly_timeに1を足しているのは、μITRONの仕様が「遅延時間以上待つこと」となっている為とdly_time=0の時でも1回はrot_rdqさせる為。

TCB[iCurrentTaskID].iWaitTimeのカウントダウンはこんな感じ。

__interrupt void MD_INTTM00(void)
{
/* Start user code. Do not edit comment generated here */
/****************************************************/
// タスクの待ち時間をカウントダウン
/****************************************************/
int i;
for(i = 0; i < TASK_MAX; i++){ // 全タスクをループ
if(TCB[i].iWaitTime > 0){  // 待ち時間ありなら
TCB[i].iWaitTime--; // カウントダウン
}
}
/* End user code. Do not edit comment generated here */
}

インターバルタイマ割り込み(TAU0のチャンネル0)を使用してタスク待ち時間をカウントダウンしている。

最後にmain関数でタスクの生成とRTOSのスタート

void main(void)
{
/* Start user code. Do not edit comment generated here */
cre_tsk(0, tsk_task0);
cre_tsk(1, tsk_task1);
cre_tsk(2, tsk_task2);
sta_TmRtos();
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}

タスク関数はμITRONと同じで無限ループにして、こんな感じで定義

void tsk_task0(void)
{
while(1){
P8.0 ^= 1; // LED0反転
rot_rdq();
}
}

void tsk_task1(void)
{
while(1){
P8.1 = 0; // LED1点灯
dly_tsk(200); // ms待ち
P8.1 = 1; // LED1消灯
dly_tsk(300); // ms待ち
}
}

void tsk_task2(void)
{
while(1){
P8.2 ^= 1; // LED2反転
dly_tsk(500); // ms待ち
}
}

シミュレータ実行画面はこんな感じ。

今回作成した、なんちゃってRTOSのソースファイルTMrtos.zipはここからダウンロードできます。