Simplified code for my firmware:
#include <Arduino.h>
#include <uMT.h>
void setup()
{
Serial.begin(57600);
my_umt_init();
my_umt_tasks();
}
void my_umt_init(void)
{
uMTcfg umtCfg;
Kernel.Kn_GetConfiguration(umtCfg);
umtCfg.rw.Tasks_Num = 20; //20 - 19 available, including the Arduino main loop()
umtCfg.rw.Semaphores_Num = 32; //Semaphores : 32
umtCfg.rw.AgentTimers_Num = 20; //20 agent timers
umtCfg.rw.AppTasks_Stack_Size = 1024; //Size (in bytes) of the STACK for any new created TASK. // Task's Stack size: 1024 bytes
umtCfg.rw.Task1_Stack_Size = 1024; //Size (in bytes) of the reserved STACK for the Arduino loop() TASK.
umtCfg.rw.Idle_Stack_Size = 512; // Idle task stack size : 512 bytes
umtCfg.rw.BlinkingLED = false;
umtCfg.rw.IdleLED = false;
umtCfg.rw.TimeSharingEnabled = false; //uMT_TICKS_TIMESHARING
umt_CheckError(F("Kn_Start"), Kernel.Kn_Start(umtCfg));
}
void my_umt_tasks(void) {
TaskId_t TEvev_2s;
umt_CheckError(F("CrTsk - loop_2s"), Kernel.Tk_CreateTask(my_loop_2s, TEvev_2s));
umt_CheckError(F("StTsk - loop_2s"), Kernel.Tk_StartTask(TEvev_2s));
}
void my_loop_2s(void)
{
unsigned counter = 0;
Event_t my_loop_2s;
Event_t eventout;
TimerId_t Timer_2s;
umt_CheckError(F("loop_2s-Ev"), Kernel.Tm_EvEvery(2000, 2, Timer_2s)); // Wake up after ... seconds
Serial.print(F("LOOP: => ")); Serial.println(F(" 2Sec"));
while (1)
{
umt_CheckError(F("loop_2s-Re"), Kernel.Ev_Receive(2, uMT_ANY, &eventout));
Serial.print(F(" loop_2s: => ")); Serial.print(F(" KernelTickCounter => ")); Serial.println(Kernel.isr_Kn_GetKernelTick());
umt_CheckError(F("Yield - test_func"), Kernel.Tk_Yield());
Serial.print(F("LOOP: => ")); Serial.println(F(" 2 - Yield"));
}
}
void loop()
{
umt_CheckError(F("Yield - test_func"), Kernel.Tk_Yield());
umt_task_tst1();
// while (1)
// {
//umt_CheckError(F("Yield - test_func"), Kernel.Tk_Yield());
// umt_task_tst1();
// }
Serial.print(F("LOOP: => ")); Serial.print(F(" END"));
}
void umt_task_tst1(void) {
TaskId_t Tid_T1;
umt_CheckError(F("CrTsk - test1"), Kernel.Tk_CreateTask(umt_task_func_1, Tid_T1));
umt_CheckError(F("StTsk - test1"), Kernel.Tk_StartTask(Tid_T1));
Serial.print(F("Test_1: => ")); Serial.print(F(" START"));
umt_CheckError(F("Yield - test_func"), Kernel.Tk_Yield());
}
void umt_task_func_1(void) {
unsigned counter = 0;
TaskId_t myTid;
umt_CheckError(F("GetTid - test_func"), Kernel.Tk_GetMyTid(myTid));
Serial.print(F(" Test_1: => ")); Serial.print(counter++); Serial.print(F(" KernelTickCounter => ")); Serial.println(Kernel.isr_Kn_GetKernelTick());
umt_CheckError(F("DelTsk - test_func"), Kernel.Tk_DeleteTask(myTid));
}
void umt_task_func_2(void) {
unsigned counter = 0;
TaskId_t myTid;
umt_CheckError(F("GetTid - test_func"), Kernel.Tk_GetMyTid(myTid));
Serial.print(F(" Test_2: => ")); Serial.print(counter++); Serial.print(F(" KernelTickCounter => ")); Serial.println(Kernel.isr_Kn_GetKernelTick());
umt_CheckError(F("Yield - test_func"), Kernel.Tk_Yield());
while (1)
{
//Serial.print(F(" Test 2A: => ")); Serial.print(counter++); Serial.print(F(" KernelTickCounter => ")); Serial.println(Kernel.isr_Kn_GetKernelTick());
}
}
void umt_CheckError(const __FlashStringHelper *Msg, Errno_t error)
{
if (error != E_SUCCESS)
{
Serial.print(F("FATAL ERROR: ")); Serial.print(Msg); Serial.print(F(" - ERRNO = ")); Serial.println((unsigned)error); Serial.flush();
Kernel.isr_Kn_FatalError();
}
}
I don’t understand how the library works.
I need to run the "A" function, each specific amount of time. You also need to run the function "B" from "A".
As well as the "C" function from anywhere else.
My code stops the microcontroller.