KMotion/KFlop Preemptive Multitasking
KMotion/KFlop uses a simple method of preemptive multitasking (multiple programs or "Threads" running at the same time). Each Thread consists of an area of memory where a program can be loaded, A CPU Stack for that program, and a potential time slice of the CPU. User Programs (Threads) and the System Thread context switch every Servo Interrupt and sequence in a round robin order.
The main thing to understand is that two programs that ever
need to be running at the same time need to be assigned to different threads.
The KFLOP system Thread runs all the time in Thread #0. So Thread #0 may never
be used. In a typical KMotionCNC system the Init.c program is usually assigned
to thread #1 and runs forever. If other UserButtons (or MCodes) run C Programs
that do something and terminate (Exec/Wait option) then these might all be
assigned to use Thread#2. If your programs run for a longer time where a 3rd or
4th program might be Launched so they all overlap in time, then they must all be
assigned to different Threads.
All Threads are killed (stop executing) when the Big Red Stop Button is pushed -
except for thread #7. So use thread #7 for anything you wish to continue to run
after a Stop.
The above example shows a case where two User Threads are currently active.
The C function WaitNextTimeSlice() can be used to wait until the next context switch occurs and return immediately at the beginning of the next time slice. This can assure that the User Program can execute for a few microseconds without being interrupted and at a very stable rate (with a few microseconds of jitter).
The time period between executions of each user thread is a function of the number of active User Threads:
Period = (# User Threads + 1) * TIMEBASE