Differences
This shows you the differences between two versions of the page.
en:software:qview:qview_6:qcl_library:sy10entercriticalsection [2017/04/04 17:27] – created qem103 | en:software:qview:qview_6:qcl_library:sy10entercriticalsection [2019/08/29 17:01] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== SY10EnterCriticalSection ====== | ||
+ | |||
+ | **SY = **//System function// | ||
+ | |||
+ | The SY10EnterCriticalSection function __puts the calling task unit in a critical section__. | ||
+ | |||
+ | ===== IMPLEMENTATION ===== | ||
+ | |||
+ | **SY10EnterCriticalSection(lookPool)** | ||
+ | |||
+ | Parameters: | ||
+ | |||
+ | ^IN/ | ||
+ | | IN | CONST | ||
+ | | IN | ARRGBL | ||
+ | | IN/ | ||
+ | | IN | CONST | ||
+ | |||
+ | |||
+ | Description: | ||
+ | |||
+ | Through the SY10EnterCriticalSection call the unit task caller asks the system to enter a critical section. | ||
+ | |||
+ | If the critical section is free caller will be assigned to the task by returning the State locked to 1. | ||
+ | If the task that requires you to enter the critical section is already entered, the function will return the State locked to 1 incrementing the counter of requests for the task in progress. | ||
+ | |||
+ | If the critical section is already occupied by another unit task and the blocking mode is set to 0 and you will have immediate exit with status 0 locked. | ||
+ | |||
+ | Otherwise based on the blocking you will have the return with locked state 0 or the unit task is put on hold and run automatically one context switch. | ||
+ | |||
+ | === Example === | ||
+ | |||
+ | The following example initializes an information pool used then to a critical section. | ||
+ | |||
+ | \\ | ||
+ | **task unit:** | ||
+ | <code QCL> | ||
+ | ;=== | ||
+ | ; Unit B | ||
+ | ; | ||
+ | GLOBAL | ||
+ | Counter L INOUT | ||
+ | |||
+ | ; local variables | ||
+ | CONST | ||
+ | UNIT_ID 2 | ||
+ | |||
+ | GLOBAL | ||
+ | locked F | ||
+ | looping L | ||
+ | |||
+ | ; main entry point | ||
+ | BEGIN | ||
+ | CALL TASK_INIT | ||
+ | WHILE TRUE | ||
+ | CALL TASK_EXECUTE | ||
+ | WAIT A_LOOP | ||
+ | ENDWHILE | ||
+ | END | ||
+ | |||
+ | ;=== | ||
+ | ; Task initialization | ||
+ | ; | ||
+ | SUB TASK_INIT | ||
+ | WAIT INIT.Initialized | ||
+ | ENDSUB | ||
+ | |||
+ | ;=== | ||
+ | ; Task execution | ||
+ | ; | ||
+ | SUB TASK_EXECUTE | ||
+ | |||
+ | SY10EnterCriticalSection(UNIT_ID, | ||
+ | CALL COUNTER_ADD | ||
+ | SY10LeaveCriticalSection(UNIT_ID, | ||
+ | |||
+ | ENDSUB | ||
+ | |||
+ | ;=== | ||
+ | ; Counter add | ||
+ | ; | ||
+ | SUB COUNTER_ADD | ||
+ | Counter = Counter + 1 | ||
+ | |||
+ | ; this simulate an automatic context switch for a device write and read access | ||
+ | WAIT A_LOOP | ||
+ | ENDSUB | ||
+ | </ | ||