====== OSA : Flags ======
===== Intro =====
Flags are similar to binary semaphores. There are two differences:
  - you can wait, check, set or reset several flags at one time;
  - after accepting flags their values do not change.
Flags can be useful when a task requires the results of several tasks. For example: to calculate some physical parameters a task needs information about the temperature, pressure and humidity. Each of these parameters is measured in its own task which sets a flag when measurement is complete.
#include 
OST_FLAG8   F_Sensors;
#define  TEMPERATURE_MEASURED   0x01
#define  PRESSURE_MEASURED      0x02
#define  HUMIDITY_MEASURED      0x04
void Task_Calc (void)
{
    for (;;) {
        // Wait for all measurements complete
        OS_Flag_Wait_AllOn(F_Sensors, TEMPERATURE_MEASURED | PRESSURE_MEASURED | HUMIDITY_MEASURED);
        OS_Flag_Clear(F_Sensors, TEMPERATURE_MEASURED | PRESSURE_MEASURED | HUMIDITY_MEASURED);
        // Now we can calculate
        ...
    }
}
~~UP~~
===== Definition =====
There are three types of flags: 8-, 16- and 32-bit.
OST_FLAG      MyFlag1;	//  8-bit flags
OST_FLAG16    MyFlag2;	// 16-bit flags
OST_FLAG32    MyFlag3;	// 32-bit flags
It is possible to use different size of flags at the same time.
Flags can be allocated in any memory bank, e.g.:
bank2    OST_FLAG16   MyFlag;
~~UP~~
===== Services =====
^  Service  ^  Arguments  ^  Description  ^  Properties  ^
| **Creating**    ||||
| ##[[en:osa:ref:allservices:OS_Flag_Create|OS_Flag_Create]]##  |  ''(flag)''  | (**flag = 0**) Create flag and clear all its bits  |   |
| **Management** ||||
| ##[[en:osa:ref:allservices:OS_Flag_Init|OS_Flag_Init]]##  |  ''(flag, value)''  | (**flag = value**) Set flag to given value  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Set|OS_Flag_Set]]##  |  ''(flag, mask)''  | (**flag = flag** %%|%% **mask**) Set bits in flag according to mask  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Clear|OS_Flag_Clear]]##  |  ''(flag, mask)''  | (**flag &= ~mask**) Clear bits in flag according to mask  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| **Checking**    ||||
| ''bool ''\\ ##[[en:osa:ref:allservices:OS_Flag_Check_AllOn|OS_Flag_Check_AllOn]]##  |  ''(flag, mask)''  | (** if ((flag & mask)==mask) **) Check if all bits in flag specified by mask are set  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| ''bool ''\\ ##[[en:osa:ref:allservices:OS_Flag_Check_On|OS_Flag_Check_On]]##  |  ''(flag, mask)''  | (** if ((flag & mask)!=0) **) Check if any bit in flags specified by mask is set  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| ''bool ''\\ ##[[en:osa:ref:allservices:OS_Flag_Check_AllOff|OS_Flag_Check_AllOff]]##  |  ''(flag, mask)''  | (** if ((flag & mask)==0) **) Check if all bits in flag specified by mask are clear  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| ''bool ''\\ ##[[en:osa:ref:allservices:OS_Flag_Check_Off|OS_Flag_Check_Off]]##  |  ''(flag, mask)''  | (** if ((flag & mask)!=mask) **) Check if any bit in flag specified by mask is clear  | {{osa:ref:attr_call_can_int.png|Has alternate service for use in ISR (suffix "_I")}}  |
| **Waiting**     ||||
| ##[[en:osa:ref:allservices:OS_Flag_Wait_AllOn|OS_Flag_Wait_AllOn]]##  |  ''(flag, mask)''  | (** if ((flag & mask)==mask) **) Wait until all bits in flag specified by mask are set  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_On|OS_Flag_Wait_On]]##  |  ''(flag, mask)''  | (** wait ((flag & mask)!=0) **) Wait until any bit in flag specified by mask is set  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_AllOff|OS_Flag_Wait_AllOff]]##  |  ''(flag, mask)''  | (** wait ((flag & mask)==0) **) Wait until all bits in flag specified by mask are clear  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_Off|OS_Flag_Wait_Off]]##  |  ''(flag, mask)''  | (** wait ((flag & mask)!=mask) **) Wait until any bit in flag specified by mask is clear  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_AllOn_TO|OS_Flag_Wait_AllOn_TO]]##  |  ''(flag, mask, timeout)''  | (** wait ((flag & mask)==mask) **) Wait until all bits in flags specified by mask are set. Exit if timeout expired  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}{{osa:ref:attr_call_to.png|Service uses system timer}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_On_TO|OS_Flag_Wait_On_TO]]##  |  ''(flag, mask, timeout)''  | (** wait ((flag & mask)!=0) **) Wait until any bit in flags specified by mask is set. Exit if timeout expired  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}{{osa:ref:attr_call_to.png|Service uses system timer}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_AllOff_TO|OS_Flag_Wait_AllOff_TO]]##  |  ''(flag, mask, timeout)''  | (** wait ((flag & mask)==0) **) Wait until all bits in flag specified by mask are clear. Exit if timeout expired  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}{{osa:ref:attr_call_to.png|Service uses system timer}}  |
| ##[[en:osa:ref:allservices:OS_Flag_Wait_Off_TO|OS_Flag_Wait_Off_TO]]##  |  ''(flag, mask, timeout)''  | (** wait ((flag & mask)!=mask) **) Wait until any bit in flag specified by mask is clear. Exit if timeout expired  | {{osa:ref:attr_call_task.png|Allowed only in task}}{{osa:ref:attr_call_ct_sw.png|Switches context}}{{osa:ref:attr_call_to.png|Service uses system timer}}  |
~~UP~~