RTOS:GPIO INPUT
ここまではペリフェラルとして、GPIOだけを使ってマルチスレッドの動作、デバッグツール、kernelとpthreadを解説。
ここからはペリフェラルをひとつひとつ。
GPIOはこれまで出力のみなのでInputする方をまず。
これまで作ってきたLEDをそれぞれ2つのスレッドで違う周期で点滅させるプロジェクトに足していく(これはおすすめの開発手法。点滅が停止していると追加したスレッドで永遠に抜け出せなくなっているという事が可視的にわかりやすい)
syscfgを開いてGPIOを追加する。ここではオンボードに搭載されている左スイッチを使う。まずは確認用のLEDの追加をする。+ADDを押して
Name:CONFIG_GPIO_LED_2
Use Hardware : LaunchPad LED D2
Mode:Output
としてLEDをもう一つ追加する。
+ADDを押して
Name:CONFIG_GPIO_BTN_0
Use Hardware : LaunchPad Button US_SW1(Left)
Mode:Input
Pull:Pull Up
Interruput Trigger:Falling Edge
Call back Function: NULL
と設定する。
この状態でいったん保存して閉じてしまい、Open With - Text editorで再度開いて中身を確認してみる。(syscfgの保存はCtrl+Sではできないバグ・・・File-SaveはOK。または閉じてしまってダイヤログで保存がきかれるので保存する)
GPIO3.$name = "CONFIG_GPIO_BTN_0";
GPIO3.$hardware = system.deviceData.board.components.USR_SW1;
とCONFIG_GPIO_BTN_0が追加されている。一方で、プルアップや検出エッジに関する情報はない。再度Sysconfig editorで開いて、違う設定にしてみる。
Pull:Pull Down
Interruput Trigger:Rasing Edge
と仮に変更してみる。保存してテキストの中身を確認する。
GPIO3.$name = "CONFIG_GPIO_BTN_0";
GPIO3.$hardware = system.deviceData.board.components.USR_SW1;
GPIO3.pull = "Pull Down";
GPIO3.interruptTrigger = "Rising Edge";
と追記されている。つまりデフォルトでPull up, Falling edgeが設定されているので設定しても記述されない仕様。
上はテストなので、Pull Up、Falling edgeに戻す。
threadを記載しているcファイルの編集を行う。新しいスレッド関数として上で定義したLEDをONにして、ボタンが押されたらコールバック関数を呼ぶようにする(GPIO_setCallback)、GPIO_enableIntでスイッチによるインターラプトを許可する。
void *mainThread2(UArg arg0, UArg arg1)
{
GPIO_init();
/* Configure the LED pin */
GPIO_setConfig(CONFIG_GPIO_LED_2, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
/* Turn on user LED */
GPIO_write(CONFIG_GPIO_LED_2, CONFIG_GPIO_LED_ON);
GPIO_setCallback(CONFIG_GPIO_BTN_0, gpioButtonFxn0);
GPIO_enableInt(CONFIG_GPIO_BTN_0);
return 0;
}
void gpioButtonFxn0(uint_least8_t index)
{
// Toggle the LED
GPIO_toggle(CONFIG_GPIO_LED_2);
}
次に、cfgファイルを開いて、上のスレッドを追加する。
これでビルトして送り込んでやる。
スイッチを押すとトグルする事が確認できるはず。
syscfgファイルでボタンを登録する際に、Callback Functionという欄がある事に気が付くはずで、この動きを確認する。
ここにトグルするコールバックの関数名を入れてる。GPIO_setCallbackは記載しなくてよいようになるので、コメントアウトして、ビルト、フラッシュしてみる。
void *mainThread2(UArg arg0, UArg arg1)
{
GPIO_init();
/* Configure the LED pin */
GPIO_setConfig(CONFIG_GPIO_LED_2, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
/* Turn on user LED */
GPIO_write(CONFIG_GPIO_LED_2, CONFIG_GPIO_LED_ON);
//GPIO_setCallback(CONFIG_GPIO_BTN_0, gpioButtonFxn0);
GPIO_enableInt(CONFIG_GPIO_BTN_0);
return 0;
}
動作は同じで、ちゃんとトグルする事が確認できる。GPIO_enableIntは省略できないもよう。
ExcutionAnalysisを走らせて動作を見てみる。
mainthread2のスレッドは一度も呼び出されずSWが押されて時だけタスクが発生している事が確認できる。
コメント
コメントを投稿