Download presentation
Presentation is loading. Please wait.
Published byKristopher King Modified over 5 years ago
1
Akos Ledeczi EECE 6354, Fall 2017 Vanderbilt University
Synchronization Akos Ledeczi EECE 6354, Fall 2017 Vanderbilt University
2
Semaphores They work for synchronization too ISR to Task or
Task to Task
3
Unilateral Rendezvous
Task calling Pend() does not need to know about the details: the Pend() call will return when the event has occurred Maximizes use of CPU; no busy waiting Event (i.e., Post()) will cause the waiting task to run immediately (assuming it has the highest priority)
4
Credit Tracking Semaphore accumulates the number of times Post() has been called /without a corresponding Pend()/
5
Broadcasting Multiple tasks waiting on a semaphore OS_OPT_POST_ALL
All waiting tasks become ready to run Care must be taken because some of the tasks may not have called Pend() yet
6
Task Semaphores In µC/OS-III each task has a built-in semaphore
More efficient OSTaskSemPend(); OSTaskSemPost(); etc. Post()-er (ISR or Task) needs to know which task to notify
7
Bilateral Rendezvous Only between tasks, as an ISR cannot Pend()
void Task1(void *p_arg) { … OSTaskSemPost(&Task2_TCB, OS_OPT_POST_1, &err); OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,&ts,&err); } void Task2(void *p_arg) OSTaskSemPost(&Task1_TCB, Only between tasks, as an ISR cannot Pend()
8
Event Flags When tasks need to synchronize on multiple events
When any of the events is enough: disjunctive synchronization (OR) When all events are needed: conjunctive synchronization (AND) OSFlag???(); OSFlagPendGetFlagsRdy(): which flags caused task to become ready
9
EventFlags Example #define TEMP_LOW (OS_FLAGS)0x01
#define BATT_LOW (OS_FLASG)0x02 #define SW_PRESSED (OS_FLAGS)0x04 OS_FLAG_GRP MyEventFlagGrp; void main() { … OSFlagCreate(&MyEventFlagGrp, “My flags”,0,&err); } void Task1(void *p_arg) for( ; ; ) OSFlagPend(&MyEventFlagGrp, TEMP_LOW + BATT_LOW, OS_OPT_PEND_FLAG_SET_ANY, ts,&err); void Task2(void *p_arg) { … for ( ; ; ) OSFlagPost(&MyEventFlagGrp, BATT_LOW, OS_OPT_POST_FLAG_SET, &err); }
10
Status and Transient Events
Typically: Status info monitored by one task, handled by another task using a non-blocking call A transient event is generated by an ISR or task and handled and consumed by a task using a blocking call
11
Event Flag Internals struct os_flag_grp { OS_OBJ_TYPE Type CPU_CHAR *NamePtr OS_PEND_LIST PendList; OS_FLAGS Flags CPU_TS TS }; OSFlagPost(&flagGrp, (OS_FLAGS)0x0C, OS_OPT_FLAG_SET, &err); Pend list is not in priority order as all tasks need to be looked at anyways Look at code on the left: If OS_OPT_FLAG_SET and flags contain 0x03, result will be 0x0F If OS_OPT_FLAG_CLR and flags contain 0x0F, result will be 0x03
12
Synchronizing Multiple Tasks
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.