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つにというのは難しい話ではない。
コメント
コメントを投稿