See starvation protection, mutex priority inheritance, round-robin, safe task suspension in action!
For a step by step description of Demo #3 in a single core configuration, visit here. Then come back and see the exciting additions within a multicore environment.
Demo #3 consists of a six task system: a high priority task ("High
"), three mid-priority tasks in a round-robin configuration ("RR-x
"), and two lower priority tasks to demonstrate the starvation protection mechanism ("ST-x
"). The High
task runs for 10.0s every 30.0s.
The first video demonstrates Turbo multicore load balancing, unique to the Abassi RTOS. In this mode, the highest priority, ready to run tasks will execute on the available processor cores, even if they are not of equal priority. This enables extremely high processor utilization, and is accomplished with a simple recompile of the existing application. The user application instantly, and effortlessly, benefits from the added processor cores.
The second video demonstrates standard symmetric multicore load balancing. In this mode, only tasks of equal priority will execute at the same time. This is useful when partitioning segments of similar processing, such as encoding or decoding of a video stream. This typically requires the user to modify their program to create multiple, identical tasks, each assigned to process portions of the data stream, and set all priorities equal.
Video of mAbassi running on 4 cores [Xilinx'x UltraScale+]:
As with all Code Time Technologies products and features, our goal is innovation at every opportunity. Rather than force your application to adhere to a single, rigid multicore processing model, Abassi provides flexibility and configurability to help you achieve your goals.
If a task owns the Mutex when it is time to Suspend, the Deadlock prevention mechanism will defer the suspension until the mutex is released. Also, if a task owns the Mutex and no other ready-to-run task wants it, then it holds the mutex indefinitely. Otherwise, the demo state machine informs the task to release the mutex after 5.0s.
mAbassi Demo
High 00.0s P2 1 M
RR-A 00.0s P4 0A
RR-B 00.0s P4 b
RR-C 00.0s P4
ST-A 00.0s P7
ST-B 00.0s P9
00:00:00
mAbassi Demo
High 15.0s S
RR-A 01.8s P4
RR-B 00.6s P4 0AM
RR-C 00.6s P4 1
ST-A 00.0s P7
ST-B 00.0s P9
00:00:17
In addition to the task names, there are three additional columns that give information about the individual tasks. One displays the duration the task was in the running state. The next displays the task priority ("Px
"), or if the task is Pending Suspension ("PS
"; because it currently holds the lock on a Mutex), or is Suspended ("S
"). The final column provides internal state information, as follows:
x
CPU# that Task is running onA
Task currently under Starvation Protection ("Priority Aging")M
Task that has acquired the Mutexm
Task that will acquire the Mutex nextB
Task that is blocked on the Mutexb
Task that will block on the Mutex nextI
Task that has had its priority changed due to Priority Inheritance
The demonstration has been configurated with a Timer Tick of 10,000μs (10.0ms), and each task has its own programmable Round-Robin timeslice, to slow down the system enough to give the user an opportunity to view the state changes.
The tasks in the round-robin queue have been allocated different numbers of ticks, to illustrate the asymetric round-robin capability; Task RR-A
has been given 400 ticks, RR-B
600 ticks, and RR-C
800 ticks.
Starvation Protection has been configured for a default Run time of 200 timer ticks (2.0s), Wait time of 500 timer ticks (5.0s), and Priority of 3. Tasks ST-A
and ST-B
override these defaults and use Run and Wait times of 5.0s and 2.5s, and 5.0s and 1.0s, respectively.
The demonstration code continues indefintely.