RTOS:複数スレッドによるLチカ

ここでは、スレッドを2つにして、それぞれのスレッドで、異なる周期でLEDを点灯させる事もめざす。


emptyをインポート、Renameしてという所はこれまでも同じ。

まず、empty.cの編集から。

#include <ti/sysbios/knl/Task.h> //to use task sleep Task.h is needed.
#include <ti/sysbios/knl/Clock.h> //of caurase, clock.h also.

も取り込んでおいて、Task_sleepも使えるようにする。

mainThread0は以下のように編集

void *mainThread0(void *arg0)
{
    /* 1 second delay */
    uint32_t time = 1000;

    /* Call driver init functions */
    GPIO_init();

    /* Configure the LED pin */
    GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Turn on user LED */
    GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);

    while (1) {

        GPIO_toggle(CONFIG_GPIO_LED_0);
        Task_sleep(time * (1000 / Clock_tickPeriod));
    }
}

全く同じタスクで、mainThread1をmainThread0をコピーして必要箇所を編集して作る。
点滅間隔を250msecと短くし、CONFIG_GPIO_LED_1とLEDを別のLEDを指定している。
それ以外は同じ。

void *mainThread1(void *arg0)
{
    /* 1 second delay */
    uint32_t time = 100;

    /* Call driver init functions */
    GPIO_init();

    /* Configure the LED pin */
    GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Turn on user LED */
    GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);

    while (1) {

        GPIO_toggle(CONFIG_GPIO_LED_0);
        Task_sleep(time * (1000 / Clock_tickPeriod));
    }
}

main_tirtos.cの編集
extern void *mainThread0(void *arg0);
extern void *mainThread1(void *arg0);
とextern void *mainThread0(void *arg0);しかこれまでなかった所だが、extern void *mainThread1(void *arg0);も参照できるようにしてあげる。

続いて、    
pthread_t           thread0,thread1;
を二つにしてあげて、

  /* Set priority, detach state, and stack size attributes */
    priParam.sched_priority = 1;
    retc = pthread_attr_setschedparam(&attrs, &priParam);
    retc |= pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
    retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);
    if (retc != 0) {
        /* failed to set attributes */
        while (1) {}
    }

    retc = pthread_create(&thread0, &attrs, mainThread0, NULL);
    if (retc != 0) {
        /* pthread_create() failed */
        while (1) {}
    }

    /* Set priority, detach state, and stack size attributes */
    priParam.sched_priority = 1;
    retc = pthread_attr_setschedparam(&attrs, &priParam);
    retc |= pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
    retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);
    if (retc != 0) {
        /* failed to set attributes */
        while (1) {}
    }

    retc = pthread_create(&thread1, &attrs, mainThread1, NULL);
    if (retc != 0) {
        /* pthread_create() failed */
        while (1) {}
    }

mainThread1もスレッドをcreatしてやる。

最後に、empty.syscfgの編集を行う。+ADDを押して2つ目のLEDを登録する。
既に、CONFIG_GPIO_LED_1と名前を決めてしまっているので、それに合わせて編集する。
ここでは、LED D4を2つ目のLEDとして指定してみた。


ここまでできれば、ビルトして送り込んでやると、2つのLEDがそれぞれ独立した周期で点滅する事が確認できる。
ではスレッドを3つ、4つにというのは難しい話ではない。









コメント

このブログの人気の投稿

CH9329で日本語キーボード109で正しく表示する方法

Attiny85とAQM0802A(LCD)のI2C接続