FreeRTOS: рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░


рдирдорд╕реНрддреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:
FreeRTOS: рдкрд░рд┐рдЪрдпред
FreeRTOS: рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдбред

рдХрд┐рд╕реА рднреА рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдУрдПрд╕ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреБрдХреНрдд рд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░рд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред FreeRTOS рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реИрдВ:

рдХрддрд╛рд░ред


рдЫрд╡рд┐
рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИрдВ, рдпрд╛ рдорд┐рдиреА-рд╕рдмрдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рдФрд░ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдХрддрд╛рд░реЗрдВ рд╣реИрдВред
рдПрдХ рдХрддрд╛рд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг 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); //   portBASE_TYPE xQueueSend(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) { //      ,       ,    . xQueueSend( xDataQueue, &byte, 0 ); } 

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреЗрд╡рд▓ рдХрддрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реЗ рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░реНрд╕ред


рдЫрд╡рд┐
рдЬрдм рднреА рдХреЛрдИ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдЯрди рджрдмрд╛рдиреЗ) рдХрд╛рд░реНрдп рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкрд░рд┐рджреГрд╢реНрдп: рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рдзрд╛рди 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 рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдиреНрдпрдерд╛, рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрдорд╛рдлреЛрд░рд╕ рдХреА рдЧрд┐рдирддреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In129180/


All Articles