@@ -571,55 +571,54 @@ Compatible with:
571571Below example toggles RGB LEDs on a development board. Each LED is controlled by its own thread, switching at 1s intervals:
572572
573573``` cpp
574- #include < stk_config.h>
575574#include < stk.h>
576- #include " example.h "
575+ #include < sync/stk_sync_eventflags.h >
577576
578- static volatile uint8_t g_TaskSwitch = 0 ;
577+ using namespace bsp ;
578+
579+ enum { TASK_STACK_SIZE = 256 };
580+
581+ static const uint32_t FLAGS_ALL[ ] = {
582+ (1U << LED_RED),
583+ (1U << LED_ORANGE),
584+ (1U << LED_GREEN),
585+ (1U << LED_BLUE)
586+ };
587+ static stk::sync::EventFlags g_TaskFlags (FLAGS_ALL[ LED_RED] );
588+ static stk::Ticks g_Timeline = 0;
579589
580590template <stk::EAccessMode _ AccessMode>
581- class MyTask : public stk ::Task<256 , _ AccessMode>
591+ class MyTask : public stk::Task<TASK_STACK_SIZE , _ AccessMode>
582592{
583- uint8_t m_taskId;
593+ uint8_t m_task_id;
594+ uint32_t m_my_flag;
595+ uint32_t m_next_flag;
584596
585597public:
586- MyTask(uint8_t taskId) : m_taskId(taskId)
598+ MyTask(uint8_t task_id) : m_task_id(task_id), m_my_flag(FLAGS_ALL[ task_id] ),
599+ m_next_flag(FLAGS_ALL[ (task_id + 1) % LED_MAX] )
587600 {}
588601
589602private:
590- void Run()
603+ void Run() override
591604 {
592- uint8_t task_id = m_taskId;
605+ const stk::Timeout period = stk::GetTicksFromMs(1000);
606+ g_Timeline = stk::GetTicks();
593607
594608 while (true)
595609 {
596- if (g_TaskSwitch != task_id)
597- {
598- stk::Sleep (10);
610+ uint32_t result = g_TaskFlags.Wait(m_my_flag, stk::sync::EventFlags::OPT_WAIT_ANY);
611+ if (stk::sync::EventFlags::IsError(result))
599612 continue;
600- }
601613
602- switch (task_id)
603614 {
604- case 0:
605- LED_SET_STATE(LED_RED, true);
606- LED_SET_STATE(LED_GREEN, false);
607- LED_SET_STATE(LED_BLUE, false);
608- break;
609- case 1:
610- LED_SET_STATE(LED_RED, false);
611- LED_SET_STATE(LED_GREEN, true);
612- LED_SET_STATE(LED_BLUE, false);
613- break;
614- case 2:
615- LED_SET_STATE(LED_RED, false);
616- LED_SET_STATE(LED_GREEN, false);
617- LED_SET_STATE(LED_BLUE, true);
618- break;
615+ stk::hw::CriticalSection::ScopedLock __guard;
616+ Led::SwitchOnExclusive(static_cast<LedId>(m_task_id));
619617 }
620618
621- stk::Sleep(1000);
622- g_TaskSwitch = (task_id + 1) % 3;
619+ stk::SleepUntil(g_Timeline += period);
620+
621+ g_TaskFlags.Set(m_next_flag);
623622 }
624623 }
625624};
@@ -628,23 +627,27 @@ void RunExample()
628627{
629628 using namespace stk;
630629
631- LED_INIT(LED_RED, false);
632- LED_INIT(LED_GREEN, false);
633- LED_INIT(LED_BLUE, false);
630+ Led::InitAll(false);
631+
632+ const uint8_t KernelMode = KERNEL_STATIC | KERNEL_SYNC | (STK_TICKLESS_IDLE ? KERNEL_TICKLESS : 0);
633+
634+ static Kernel<KernelMode, 4, SwitchStrategyRR, PlatformDefault> kernel;
634635
635- static Kernel<KERNEL_STATIC, 3, SwitchStrategyRoundRobin, PlatformDefault> kernel;
636- static MyTask<ACCESS_PRIVILEGED> task1(0), task2(1), task3(2);
636+ static MyTask<ACCESS_PRIVILEGED> task1(LED_RED);
637+ static MyTask<ACCESS_PRIVILEGED> task2(LED_ORANGE);
638+ static MyTask<ACCESS_PRIVILEGED> task3(LED_GREEN);
639+ static MyTask<ACCESS_PRIVILEGED> task4(LED_BLUE);
637640
638- kernel.Initialize(PERIODICITY_DEFAULT );
641+ kernel.Initialize();
639642
640643 kernel.AddTask(&task1);
641644 kernel.AddTask(&task2);
642645 kernel.AddTask(&task3);
646+ kernel.AddTask(&task4);
643647
644648 kernel.Start();
645649
646- assert(false);
647- while (true);
650+ STK_ASSERT(false);
648651}
649652```
650653
0 commit comments