
рдирдорд╕реНрддреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:
FreeRTOS: рдкрд░рд┐рдЪрдпредFreeRTOS: рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдбредрдХрд┐рд╕реА рднреА рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдУрдПрд╕ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреБрдХреНрдд рд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░рд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред FreeRTOS рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реИрдВ:
- рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ ISR рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░реЗрдВред
- рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реЗрдорд╛рдлреЛрд░ рдХреА рдЧрд┐рдирддреА (рд╡реНрдпрд╡рдзрд╛рди)ред
- рд╕рдВрд╕рд╛рдзрди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореНрдпреВрдЯреЗрдХреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрд░реНрдЯ)ред
- рдПрдХ рдХреЛрдб рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ, рдЬрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрддрд╛рд░ред

рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИрдВ, рдпрд╛ рдорд┐рдиреА-рд╕рдмрдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рдФрд░ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдХрддрд╛рд░реЗрдВ рд╣реИрдВред
рдПрдХ рдХрддрд╛рд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг FIFO рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдк рдХрддрд╛рд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдВрдд рддрдХ рдирд╣реАрдВ), рдПрдХ рдмрдлрд░ рдЬреЛ рдЬреНрдЮрд╛рдд рдЖрдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛ рдХреЛ рдмрдлрд╝рд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИ, рдкрдврд╝рдирд╛ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛рдирд╛ рд╣реИред
рдЯреВрдЯреЗ рд╣реБрдП рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдбрд░ рдХреЗ рдмрд┐рдирд╛, рдХрддрд╛рд░реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрд╡рддрдВрддреНрд░ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХрдИ рд▓реЗрдЦрдХ рдФрд░ рдкрд╛рдардХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЙрд╕ рд╕рдордп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдХрд╛рд░реНрдп рдХреЛ рдирдП рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕ рдмрд╛рд░ рднреА рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрддрд╛рд░ рдореЗрдВ рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рд╣рдо FreeRTOS рдореЗрдВ рдХрддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдХрд┐рд╕реА рднреА рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП RAM рдореЗрдореЛрд░реА рдХреЛ FreeRTOS рдвреЗрд░ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ + рдХрддрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдХреЛрдб рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрддрд╛рд░ рдХреЛ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ xQueueHandleред
xQueueHandle xQueueCreate(unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize);
uxQueueLength - рдЙрди рддрддреНрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рдХрддрд╛рд░ рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рд╕рдордп рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреА рд╣реИред
uxItemSize - рдХрддрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХрд╛ рдЖрдХрд╛рд░ред
рд╡рд╛рдкрд╕реА xQueueHandle, рдпрд╛ NULL - рдпрджрд┐ рдХрддрд╛рд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВрдбрд▓ рд╡рд╛рдкрд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рдирд╣реАрдВ, рддреЛред рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ, рддреЛ NULL рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
portBASE_TYPE xQueueSendToFront(xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait); portBASE_TYPE xQueueSendToBack(xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait);
xQueue - рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдХрд╛ рд╣реИрдВрдбрд▓ред
pvItemToQueue - рдкрдВрдХреНрддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред
xTicksToWait - рд╡рд╣ рд╕рдордп рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдХрд╛рд░реНрдп рдкрдВрдХреНрддрд┐рдмрджреНрдз рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдХрддрд╛рд░ рдореЗрдВ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХреЗред рдЖрдк
portMAX_DELAY рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрд╛рд░реНрдп рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛ, рдЕрд░реНрдерд╛рдд рдЬрдм рддрдХ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рди рджреЗред
рд╡рд╛рдкрд╕реА pdPASS, рдпрд╛ irQUEUE_FULL - рдпрджрд┐ рдирдпрд╛ рддрддреНрд╡ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди pdPASS рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд░ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ рдФрд░ xTicksToWait рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рд╕рдордп рдкрд░ рдЬрд╛рдПрдЧрд╛ред
рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, 2 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЦреНрдп рдЕрдВрддрд░, рдЬреЛ рдпрд╣ рд╣реИ рдХрд┐ xQueueReceive рдХрддрд╛рд░ рд╕реЗ рддрддреНрд╡ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ xQueuePeek рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
portBASE_TYPE xQueueReceive(xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait); portBASE_TYPE xQueuePeek(xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait);
xQueue - рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдХрд╛ рд╣реИрдВрдбрд▓ред
pvBuffer - рдореЗрдореЛрд░реА рдмрдлрд╝рд░ рдХреЛ рд╕реВрдЪрдХ рдЬрд┐рд╕рдореЗрдВ рдХрддрд╛рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдмрдлрд░ рдкреНрд░рдХрд╛рд░ = рдХрддрд╛рд░ рддрддреНрд╡реЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ред
xTicksToWait - рдЙрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдЬрдм рдХрддрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдПрдХ рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк
portMAX_DELAY рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрд╛рд░реНрдп рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛ, рдЕрд░реНрдерд╛рдд рдЬрдм рддрдХ рдирдпрд╛ рдбреЗрдЯрд╛ рдХрддрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ред рдЖрдЧреЗ рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЧреЗрдЯрдХреАрдкрд░ рдЯрд╛рд╕реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рдкрд╕реА pdPASS, рдпрд╛ рдЗрд░рдХреБрдЗрдЬ_EMPTY - рдпрджрд┐ рдирдпрд╛ рдЖрдЗрдЯрдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрддрд╛рд░ рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдлрд╝рдВрдХреНрд╢рди pdPASS рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реИ рдФрд░ xTicksToWait рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдореЗрдВ рдирдП рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд░реБрджреНрдз рд╕рдордп рдкрд░ рдЬрд╛рдПрдЧрд╛ред
рдХрддрд╛рд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue )
рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ ISRs (рд╡реНрдпрд╡рдзрд╛рди) рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддреНрдпрдп
ISR рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд┐рдЫрд▓реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ:
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue, void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken ); portBASE_TYPE xQueueSendToBackFromISR(xQueueHandle xQueue, void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken); portBASE_TYPE xQueueReceiveFromISR(xQueueHandle xQueue, const void *pvBuffer, portBASE_TYPE *pxHigherPriorityTaskWoken);
pxHigherPriorityTaskWoken - рдЪреВрдВрдХрд┐ рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХреЛ рдЕрдирд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рдореЗрдВ рдордЬрдмреВрд░рди рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ taskYIELD () рдореИрдХреНрд░реЛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░
pdTRUE рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
рдХрддрд╛рд░реЛрдВ рдХреЗ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UART рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рдХреЛ рддреБрд░рдВрдд рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ рдпрд╣ рдХрд╛рдлреА рдЕрдХреНрд╖рдо рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдХрдо рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ред рдЖрдИрдПрд╕рдЖрд░ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдирд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрддрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдИрдПрд╕рдЖрд░ рдХреЛрдб рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рддрдерд╛рдХрдерд┐рдд рджреНрд╡рд╛рд░рдкрд╛рд▓ рдХрд╛рд░реНрдп рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ :))ред
рдЧреЗрдЯрдХреАрдкрд░ рдХрд╛рд░реНрдп рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрддреА рд╣реИ: рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛, рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рдЧрддрд┐рд░реЛрдз рдореЗрдВ рд▓рд╛рдирд╛ред
рдЧреЗрдЯрдХреАрдкрд░ рдХрд╛рд░реНрдп рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╕рдВрд╕рд╛рдзрди рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрдХрд╛рд▓ рджреНрд╡рд╛рд░рдкрд╛рд▓ рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдПрдХ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рджреВрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UART рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
// Gatekeeper . void vGatekeeperTask( void *pvParameteres ) { char oneByte; // - , UART , . for( ;; ) { // . // portMAX_DELAY , . // , . xQueueReceive( xDataQueue, &oneByte, portMAX_DELAY); // , . vSendByteToUART( oneByte ); // . } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдЬреЛ рдпреВрдПрдЖрд░рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╛рдЗрдЯ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╡рд╣ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:
void vUARTPutByte( char byte) {
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреЗрд╡рд▓ рдХрддрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реЗ рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░реНрд╕ред

рдЬрдм рднреА рдХреЛрдИ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдЯрди рджрдмрд╛рдиреЗ) рдХрд╛рд░реНрдп рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкрд░рд┐рджреГрд╢реНрдп: рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рдзрд╛рди ISR рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реЗрдореАрдлрд╝реЛрд░ рдХреЛ
рдЫреЛрдбрд╝ рджреЗрддреЗ
рд╣реИрдВ , рдХрд╛рд░реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣реЗ рд╕реЗрдорд╛рдлрд╝реЛрд░ рд╕реЗрдорд╛рдлрд╝реЛрд░
рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдирд▓реЙрдХ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рддрдВрддреНрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
xSemaphoreHandle рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );
xSemaphore - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрднрд╛рд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред рдпрджрд┐ рд╕реЗрдорд╛рдлреЛрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ xSemaphore NULL рдирд╣реАрдВ рд╣реИред
рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ "рд▓реЗрдиреЗ" рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait )
xSemaphore - рд╕реЗрдорд╛рдлреЛрд░ рд╕рдВрднрд╛рд▓ рд▓рд┐рдпрд╛ рдЬрд╛рдПред
xTicksToWait - рдЙрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдЬрдм рдХрд╛рд░реНрдп рдПрдХ рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реЗрдорд╛рдлреЛрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЖрдк
portMAX_DELAY рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрд╛рд░реНрдп рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛ, рдЕрд░реНрдерд╛рдд рдЬрдм рддрдХ рд╕реЗрдорд╛рдлреЛрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ред
рд╡рд╛рдкрд╕реА pdPASS, рдпрд╛ pdFALSE - pdPASS - рдпрджрд┐ рд╕реЗрдорд╛рдлреЛрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ pdFALSE - рдпрджрд┐ рд╕реЗрдореАрдлреЛрд░ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИред
рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ "рджреЗрдиреЗ" рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ ISR рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, ISRs рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken );
xSemaphore - semaphore рд╣реИрдВрдбрд▓ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред
pxHigherPriorityTaskWoken - рдЪреВрдВрдХрд┐ рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ "рдЯреНрд░рд╛рдВрд╕рдлрд░" рд╕реЗ
рд╕реЗрдореАрдлреЛрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рдордЬрдмреВрд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ taskYIELD () рдореИрдХреНрд░реЛ) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░
pdTRUE рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
рд╡рд╛рдкрд╕реА pdPASS, рдпрд╛ pdFALSE - pdPASS - рдпрджрд┐ рд╕реЗрдорд╛рдлреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ pdFALSE - рдпрджрд┐ рд╕реЗрдорд╛рдлреЛрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рджреВрдВрдЧрд╛, ISR рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ pseudocode рд▓рд┐рдЦрд╛ рдерд╛:
xSemaphoreHandle xButtonSemaphore; void vButtonHandlerTask( void *pvParameteres ) { for( ;; ) { xSemaphoreTake( xButtonSemaphore, portMAX_DELAY ); // . } } void main() { // vInitSystem(); vSemaphoreCreateBinary( xButtonSemaphore ); if( xButtonSemaphore != NULL ) { // . , ! xTaskCreate( &vButtonHandlerTask, (signed char *)"GreenBlink", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); // , .. . vTaskStartScheduler(); } // , , . . for( ;; ) { } } ISR_FUNCTION processButton() { portBASE_TYPE xTaskWoken; if( buttonOnPressed ) { xSemaphoreGiveFromISR( xButtonSemaphore, &xTaskWoken ); if( xTaskWoken == pdTRUE) { taskYIELD(); } } }
рдЧрд┐рдирддреА рдХреЗ рд╕реЗрдорд╛рдлреЛрд░ред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╕реЗрдореАрдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореМрдЬреВрдж рд╣реИ:
1. рдПрдХ рдШрдЯрдирд╛ рдереА рдЬреЛ рдПрдХ рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдиреАред
2. ISR "рд╕реЗрдорд╛рдлреЛрд░" рджреЗрддрд╛ рд╣реИ рд╡реЗрдЯрд┐рдВрдЧ рдЯрд╛рд╕реНрдХ рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред
3. рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп "рдЕрд░реНрдз" рд▓реЗрддрд╛ рд╣реИред
4. рд╡рд╛рдВрдЫрд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдп рдлрд┐рд░ рд╕реЗ рдПрдХ рдмрдВрдж рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирдИ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рдирд╣реАрдВред рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░, рдЧрд┐рдирддреА рдХреЗ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, 2 рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рднреА, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ред
- рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрдиред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЗрдорд╛рдлреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, xSemaphoreHandle рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдЧрд┐рдиреЗ рд╣реБрдП рд╕реЗрдорд╛рдлреЛрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount );
uxMaxCount - рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛, рдЬреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреА рд╣реИред рдПрдХ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдпрд╣ рдХрддрд╛рд░ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред
uxInitialCount - рд╕реЗрдорд╛рдлреЛрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдЙрдВрдЯрд░ рд╡реИрд▓реНрдпреВред
рд░рд┐рдЯрд░реНрди NULL рдирд╣реАрдВ рд╣реИ - рдпрджрд┐ рд╕реЗрдореАрдлрд╝реЛрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЧреИрд░-NULL рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдиреНрдпрдерд╛, рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрдорд╛рдлреЛрд░рд╕ рдХреА рдЧрд┐рдирддреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред