Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Prossima revisione | Revisione precedente | ||
| software:qview:qview_6:qcl_library:sy10entercriticalsection [2019/08/29 17:01] – creata - modifica esterna 127.0.0.1 | software:qview:qview_6:qcl_library:sy10entercriticalsection [2024/08/02 12:12] (versione attuale) – [IMPLEMENTAZIONE] qem211 | ||
|---|---|---|---|
| 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 | ||
| + | </ | ||