# include "ch.h"
# include "hal.h"
# define CONSOLE_WA_SIZE THD_WORKING_AREA_SIZE(4096)
# define cputs(msg) chMsgSend(cdtp, (msg_t) msg)
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
(void) arg;
while (!chThdShouldTerminateX())
{
thread_t * tp = chMsgWait();
puts((char *) chMsgGet(tp));
fflush(stdout);
chMsgRelease(tp, MSG_OK);
}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
eventmask_t m;
(void) arg;
chRegSetThreadName("green");
while (TRUE)
{
m = chEvtWaitOne(ALL_EVENTS);
cputs("green on");
chThdSleepMilliseconds(1000);
cputs("green off");
}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
eventmask_t m;
(void) arg;
chRegSetThreadName("yellow");
while (TRUE)
{
m = chEvtWaitOne(ALL_EVENTS);
cputs("yellow on");
chThdSleepMilliseconds(1000);
cputs("yellow off");
}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
eventmask_t m;
(void) arg;
chRegSetThreadName("red");
while (TRUE)
{
m = chEvtWaitOne(ALL_EVENTS);
cputs("red on");
chThdSleepMilliseconds(1000);
cputs("red off");
}
}
int main(void)
{
halInit();
chSysInit();
chEvtGetAndClearEvents(ALL_EVENTS);
int n;
n = 0;
cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
thread_t * tp1 = chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
thread_t * tp2 = chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
thread_t * tp3 = chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
while (!chThdShouldTerminateX())
{
n++;
if (n > 3) n = 1;
chThdSleepMilliseconds(1000);
if (n == 1) chEvtSignal((thread_t *) tp1, 1);
if (n == 2) chEvtSignal((thread_t *) tp2, 1);
if (n == 3) chEvtSignal((thread_t *) tp3, 1);
}
return 0;
}