|
|||||||||||
Technical Support On-Line Manuals RL-ARM User's Guide (MDK v4) RL-RTX Overview Product Description Product Specification Technical Data Timing Specifications Advantages Your First RTX Application Theory of Operation Timer Tick Interrupt System Task Manager Task Management Idle Task System Resources Scheduling Options Pre-emptive Scheduling Round-Robin Scheduling Cooperative Multitasking Priority Inversion Stack Management User Timers Interrupt Functions Configuring RL-RTX Configuration Options Tasks Stack Size Stack Checking Run in Privileged Mode Hardware Timer Round-Robin Multitasking User Timers FIFO Queue Buffer Idle Task Error Function Create New RTX_Config.c Configuration Macros Alternate Tick Timer Low Power RTX Library Files Using RL-RTX Writing Programs Include Files Defining Tasks Multiple Instances External References Using a Mailbox SWI Functions SVC Functions Debugging System Info Task Info Event Viewer Usage Hints ARM7/ARM9 Version Cortex-M Version Create New RTX Application Function Reference Event Flag Management Routines Mailbox Management Routines Memory Allocation Routines Mutex Management Routines Semaphore Management Routines System Functions Task Management Routines Time Management Routines User Timer Management Routines RL-FlashFS RL-TCPnet RL-CAN RL-USB Example Programs Library Reference Appendix |
Cooperative MultitaskingIf you disable Round-Robin Multitasking you must design and implement your tasks so that they work cooperatively. Specifically, you must call the system wait function like the os_dly_wait() function or the os_tsk_pass() function somewhere in each task. These functions signal the RTX kernel to switch to another task. The following example shows a simple RTX program that uses Cooperative Multitasking. The RTX kernel starts executing task 1. This function creates task 2. After counter1 is incremented once, the kernel switches to task 2. After counter2 is incremented once, the kernel switches back to task 1. This process repeats indefinitely. #include <rtl.h> int counter1; int counter2; __task void task1 (void); __task void task2 (void); __task void task1 (void) { os_tsk_create (task2, 0); /* Create task 2 and mark it as ready */ for (;;) { /* loop forever */ counter1++; /* update the counter */ os_tsk_pass (); /* switch to 'task2' */ } } __task void task2 (void) { for (;;) { /* loop forever */ counter2++; /* update the counter */ os_tsk_pass (); /* switch to 'task1' */ } } void main (void) { os_sys_init(task1); /* Initialize RTX Kernel and start task 1 */ for (;;); } The difference between the system wait function and os_tsk_pass is that the system wait function allows your task to wait for an event, while os_tsk_pass switches to another ready task immediately. Note
| ||||||||||
|
Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.