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:sy10initializecriticalsection [2019/08/29 17:01] (versione attuale) – creata - modifica esterna 127.0.0.1 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | ====== SY10InitializeCriticalSection ====== | ||
+ | |||
+ | **SY = **// | ||
+ | |||
+ | La funzione SY10InitializeCriticalSection __inizializza il pool informazioni di una sezione critica__. | ||
+ | |||
+ | ===== IMPLEMENTAZIONE ===== | ||
+ | |||
+ | **SY10InitializeCriticalSection(pool)** | ||
+ | |||
+ | Parametri: | ||
+ | |||
+ | ^IN/ | ||
+ | | IN | ARRGBL | ||
+ | |||
+ | Descrizione: | ||
+ | |||
+ | Ogni sezione critica basa il proprio funzionamento interno su una struttura dati proprietaria chiamata //pool// informazioni.\\ | ||
+ | Ogni sezione critica avrà un proprio //pool// che dovrà essere sempre inizializzato prima di poter essere utilizzato.\\ | ||
+ | Il //pool// è formato da un array di bytes dove il numero di elementi dipende dal numero di unità task che lo utilizerranno più un header fisso di due byte. | ||
+ | |||
+ | Se per esempio una determinata sezione critica viene utilizzata in solo due unità task basterà creare un pool di 4 byte stando attenti che una unità dovrà | ||
+ | utilizzare l'ID 1 mentra la seconda l'ID 2. | ||
+ | |||
+ | Gli ID sono progressivi partendo da 1 ed identificano la posizione delle informazioni nel pool percui passare un ID con indice non disponibile nel pool significa invalidare la chiamata e il relativo funzionamento. | ||
+ | |||
+ | **NB**: Per evitare problemi si consiglia di dimensionare i pool informazioni con dimensioni sufficienti ad indirizzare tutte le unità task. | ||
+ | |||
+ | === Esempio === | ||
+ | |||
+ | Nell' | ||
+ | |||
+ | |||
+ | \\ | ||
+ | **unità configurazione: | ||
+ | <code QCL> | ||
+ | ; critical section consts | ||
+ | CONST | ||
+ | CS_POOL_HEADER 2 ; | ||
+ | CS_POOL_SIZE 10 ; | ||
+ | |||
+ | ARRGBL | ||
+ | LockPool B CS_POOL_HEADER + CS_POOL_SIZE | ||
+ | </ | ||
+ | |||
+ | |||
+ | \\ | ||
+ | **unità inizializzazione: | ||
+ | <code QCL> | ||
+ | ;=== | ||
+ | ; | ||
+ | ; | ||
+ | GLOBAL | ||
+ | Initialized F OUT | ||
+ | |||
+ | ; main entry point | ||
+ | BEGIN | ||
+ | CALL TASK_INIT | ||
+ | WHILE TRUE | ||
+ | CALL TASK_EXECUTE | ||
+ | WAIT A_LOOP | ||
+ | ENDWHILE | ||
+ | END | ||
+ | |||
+ | ;=== | ||
+ | ; Task initialization | ||
+ | ; | ||
+ | SUB TASK_INIT | ||
+ | SY10InitializeCriticalSection(LockPool) | ||
+ | Initialized = TRUE | ||
+ | ENDSUB | ||
+ | |||
+ | ;=== | ||
+ | ; Task execution | ||
+ | ; | ||
+ | SUB TASK_EXECUTE | ||
+ | SUSPEND | ||
+ | ENDSUB | ||
+ | </ | ||
+ | |||
+ | === Note === | ||
+ | |||
+ | *La funzione deve essere eseguita una sola volta e nella fase di inizializzazione dell' | ||
+ | *Le funzioni [[software: | ||