2020年5月28日木曜日

[エンベデッド] スケジュール表の作成

こんにちは

ソフトな道をトボトボと今日は歩きます。


昨日の昼に、スケジュール表を作成するイベントが発生しました。


今回はスケジュール表を効率的に作成するかを考えてみました。


粒度にもよりますが、ソフトウェアの詳細なスケジュールです。


”要求されている項目”と”工数”が手元にある場合、以下のようにすれば無駄がないと思います。


① スケジュール表(ガントチャート)に”要求されている項目”を記載

② 工数をその項目の横に記載

③ 並び替え

④ ガントチャートの日程の箇所に、青(背景色で何色でもOK)で、

    8以内の数を記載

⑤ "④"の数値を消します。


① スケジュール表(ガントチャート)に”要求されている項目”を記載します。

    ガントチャートに作業の項目を書いていきます。

    大項目、小項目がある場合は小項目で区別がつくように

    書きます。

    例えば、

       通信初期化_UART

       通信初期化_I2C

       

       UART 通信初期化

       I2C 通信初期化

        とかです。

       

② 工数をその項目の横に記載

    作業の項目の横に工数を記載します。

    私の場合は右隣です。

   

③ 並び替え

    作業順に並んでいないときはここで並び替えます。

    並び替えても工数はあらかじめ書き込んでいるので

    時間量は変わらないです。


④ ガントチャートの日程の箇所に、青(背景色で何色でもOK)で、

    8以内の数を記載

   

    実際に作業の項目に対してバーを埋めていきます。

    この時、1日あたり最大8時間として要求されている項目分記載します。

    10時間とか無茶な値を入れてはいけません。

   

⑤ "④"の数値を消します。

    消す理由は相手方に数値付きで渡してしまうと

    時間給が分かってしまう為です。

    消しましょう。

   

以上で行うようにします。


----------------------------------------------------------


今日のひとこと


見積というのは発注者は安く抑えたい。


受注者は高く受注したい。


のマッチングをどうやるかだと思います。


コロナで分かったが、魅力的でもないトイレットペーパーに


高値がつくのは、市場にトイレットペーパーが無い


からです。


ということは、差別化はする必要は無いが


無いと困るもので、


しかも枯渇している仕事。


になります。


そんな仕事ありますかね。。。。


防衛関連、セキュリティ関連、アベノアプリ、、、


戦争関連が多そうです。

平和が一番なのに。

2020年5月23日土曜日

[Linux] アプリケーションからwatchdog を制御する

こんにちは

ソフトな道をほのぼのと今日も歩きます。


今回は、LinuxアプリからWatchdog タイマを再設定した時に


”watchdog watchdog0: watchdog did not stop!”

メッセージが出力されました。


その調査・対応について記載してみたいと思います。


このメッセージはターミナル上にwatchdogタイマ再設定の都度


出てくるので、ターミナルは大量のメッセージで埋め尽くされてしまいます。


このメッセージをカーネルソース内で以下のコマンドにて検索しました。


"grep "watchdog did not stop" -ir ./パス"


検索した結果

drivers/watchdog/

下のソースにヒットしました。


メッセージ出力はエラーに転んだ時に出力するようになっていました。

→ カーネルを直すのもいいのですが、上位側(アプリケーション)

でエラーがないように扱うのが筋のような気がしました。


そして、色々調べてわかったのは


アプリ内で


fd= open("/dev/watchdog", O_WRONLY);


を再設定する際に毎回実行していましたが、このopen()が入ってくると


毎回上記メッセージが出ます。


そこで、open("/dev/watchdog", O_WRONLY);は起動時の一回だけにして


後は開きっぱなしの状態(close()しないということです)で値を書き込む。


といった方法にしてみたら


上記メッセージは出なくなりました。


今日のひとこと


東京は6/1から緊急事態宣言解除になる話が出ています。


もしそうなったら、出勤者であふれかえってしまいます。


ただ、首都圏以外が5/22に解除されたとのことなので


その10日後の6/1で再発して


やはり緊急事態解除はやめよう。なんてことになるんじゃないかと


予想します。


良い意味で外れることを願います。

2020年5月18日月曜日

[Linux] snd_pcm_wait()から先に進まない

こんにちは

ソフトな道をほのぼのと今日も歩きます。


今回は、組み込み製品の試験を長時間していると、音が鳴り終わったと同時に


フリーズしているような現象になっていました。


こちらを調査してみましたので記載します。


環境としては以下です。


----------------------------------------


言語: C言語

CPU: Arm Cortex-A9をコアに持つCPU

開発している環境: Ubuntu 14.04

コンパイラ: arm用gnuコンパイラ

カーネル: linux-3.10.31

音: ALSAライブラリ"libasound バージョン2.0.0"を使用


----------------------------------------


まず、フリーズに見えていた現象は、


実は "snd_pcm_wait()"から返ってこなかったのが原因でした。


タイムアウトの引数として-1を


指定することで、永遠にreadyになるまで待っていました。


snd_pcm_wait()を実行中にスレッドが入って処理してしまうと


タイミングによってreadyにならないケースがあるようです。


今回の対策としては、タイムアウト時間を指定することで、


フリーズ状態を避けるようにしました。

(エラーになっているのか分からないので、

syslogにsnd_pcm_state_tの状態を出力するようにしました。)


以下、サンプルです。

(動作保証は無しと致します。)


===============================================================


void test(snd_pcm_t* pcm, int timeout)

{

    int rtc;

   

    rtc= snd_pcm_wait((snd_pcm_t *)pcm, timeout);

    if(rtc!= 1)

    {// not ready

        snd_pcm_state_t state = snd_pcm_state((snd_pcm_t *)pcm);

        syslog(LOG_ERR, "status: %d \n", (int)state);

    }

}

===============================================================


今日のひとこと


暑かったり寒かったりで体調が悪くなる季節です。


筋肉トレーニングや、逆立ちなどして


体軸や外面を整えて乗り切りましょう。



2020年5月8日金曜日

[Sphero mini] ロボットプログラミングを試しにしてみた。

こんにちは


ソフトな道をほのぼのと今日も歩きます。


今回は、Sphero mini kitというおもちゃが祖父から子供宛に届きました。


コロナウィルスで家から出られない為の暇つぶしアイテムのようです。


環境構築などはこちらに記載がありました。


子供にやらせてみたところ、結構はまっているようです。


”sphero edu”と”sphero play”があり、前者で適当に私も


ブロックでプログラミングしてみました。


関心したのは、JavaScript表記にボタン一つで変換できることです。


以下ブロックをコードに変換したものになります。


内容としては、以下のような動作を行います。


[内容]
  1. Sphero miniのledをランダムカラー点灯
  2. 180℃スピンさせる。
  3. 1秒前進
  4. Sphero miniのledをランダムカラー点灯
  5. 180℃スピンさせる。
  6. ランダムのサウンドを鳴らす。(スマートホンからの音でしたw)
  7. 1秒後退
  8. ”1””7”を100回繰り返す。


[JavaScript]


var kakudo = '0';

async function startProgram() {
setMainLed({ r: 49, g: 255, b: 234 });
kakudo = '0';
for (var _i0 = 0; _i0 < 100; ++_i0) {
setMainLed(getRandomColor());
await spin(180, 1);
await roll(0 + 180, 142, 1);
setMainLed(getRandomColor());
await spin(180, 1);
await Sound.play(false);
await roll(0 + 0, 142, 1);
await delay(0.025);
}
}


async function blockName() {
}

[ブロックプログラミング]


今日のひとこと


子供用のプログラミング教育用のアイテムは意外と侮れないですね。

Web系の言語が一番入りやすいのかもしれません。

トライ、エラーでロボットが期待通りに動いてくれないとかなら

子供も笑いながらデバッグしてくれるし。

私は組み込み系開発がメインで、Web系は知らなかったので、

JavaScriptを学ぶにはこれを機に触ってみようかなと思います。

2020年5月4日月曜日

[Linux] バージョン情報

こんにちは
ソフトな道をほのぼのと今日も歩きます。


今回は、ユーザに提供するアプリケーションのバージョンについて


記載したいと思います。


皆さんは、アプリケーションを提供する際にどのようにバージョンをつけていますか?


私の場合、案件によって異なるので、これといったバージョンをつける方法が
定まっていません。


なので、例を挙げる事で今後のバージョンのつけ方について


ヒントになれば良いと思っています。


今回の案件の環境は以下の通りです。


----------------------------------------

・環境

言語: C言語
CPU: Arm Cortex-A9をコアに持つCPU
開発している環境: Ubuntu 14.04 64bit
コンパイラ: arm-linux-gnueabihf-gcc
カーネル: linux-3.10.31


----------------------------------------


バージョンをつける際に以下のようなことを行っています。
  1. メモリをバージョン用に5バイト分確保します。
  2. "1."のメモリに"1.00"と書いて最後にNULLを書き込みます。
  3. main()からそのバージョン情報を読み出しターミナル上にそのバージョンを表示しています。
また、アプリケーション自体をエディタで表示させると、
"1.00"がどこかに見えます。


参考としてソースを載せます。


========================================

参考ソース


static char VERSION[5]= {"1.00\0"};


//******************************************************************************
//  Function: バージョン情報を取得する
//  Input : なし
//  Output : バージョン情報
// Return : なし
// Comment : アプリケーションバージョン情報を返します。
//******************************************************************************
void MAIN_Get_Version(char* ver_p)
{
memcpy(ver_p, VERSION, sizeof(VERSION));
}


void main(void)
{
char version[5];
MAIN_Get_Version(version);
printf("%s",version);
}
========================================


今日のひとこと



GWが始まりました、天気は晴天です。


緊急事態宣言の最中、食材を買いにスーパーに行きました。


暑いのは分かるのですが、マスクを顎まで下げて、
(要するに口にマスクはつけていない状態)

会話している人達がいました。

気持ちは分かるのですが、マスクもあまり意味がないのも分かるのですが

顎マスクはカッコ悪いです。