no way to compare when less than two revisions
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
— | software:qview:qview_6:qcl_library:sy10entercriticalsection [2019/08/29 17:01] (versione attuale) – creata - modifica esterna 127.0.0.1 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | ====== SY10EnterCriticalSection ====== | ||
+ | |||
+ | **SY = **// | ||
+ | |||
+ | La funzione SY10EnterCriticalSection __fa entrare l' | ||
+ | |||
+ | ===== IMPLEMENTAZIONE ===== | ||
+ | |||
+ | **SY10EnterCriticalSection(lookPool)** | ||
+ | |||
+ | Parametri: | ||
+ | |||
+ | ^IN/ | ||
+ | | IN | CONST | ||
+ | | IN | ARRGBL | ||
+ | | IN/ | ||
+ | | IN | CONST | ||
+ | |||
+ | |||
+ | Descrizione: | ||
+ | |||
+ | Tramite la chiamata SY10EnterCriticalSection la unit task chiamante chiede al sistema di entrare in una sezione critica. | ||
+ | |||
+ | Se la sezione critica è libera verrà subito assegnata al task chiamante ritornando lo stato locked a 1. | ||
+ | Se l' | ||
+ | |||
+ | Se invice la sezione critica è già occupata da un' | ||
+ | |||
+ | altrimenti in base al parametro blocking si avrà il ritorno con stato locked a 0 oppure la unità task verrà messa in attesa ed eseguito automaticamente uno cambio di contesto. | ||
+ | |||
+ | |||
+ | === Esempio === | ||
+ | |||
+ | Nell' | ||
+ | |||
+ | \\ | ||
+ | **unità task:** | ||
+ | <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 | ||
+ | </ | ||