FreeRTOS рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рддрд░рдг

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

рдпрд╣ рд▓реЗрдЦ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рддрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд▓ рдХреА рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ , рдЬреЛ рдЕрдм рдХреЗрд╡рд▓ рдлреНрд░реАрдЯреНрд░реЙрд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣реИред рдЖрдЬ рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ FreeRTOS рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП, рдЬреЛ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рд░реИрдо рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИрдВ рдФрд░ рд╡реЗ рдХрд┐рддрдирд╛ рдХрдмреНрдЬрд╛ рдХрд░рддреА рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл FreeRTOS рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд▓реЗрдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯрд┐рдХрд▓реА рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рд╕рдВрд╕реНрдХрд░рдг 9.0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, FreeRTOS рд╕реНрдЯреИрдЯрд┐рдХрд▓реА рд░рдЦреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдореЗрдВ рдПрдХ рд╕реНрдереИрддрд┐рдХ рдкреНрд░рддреНрдпрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди рд╣реЛрддрд╛ рд╣реИред рд╣рдо FreeRTOS рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реБрдВрджрд░ рд╕реА ++ рд░реИрдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рди рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬрдЧрд╣ рджреЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рд╕рднреА рдЧрд┐рдмрд▓реНрд╕ рдХреЛ рднреА рдЫрд┐рдкрд╛рдПрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрджрд┐рдорддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

FreeRTOS рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╣реИред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдПрдХ рдкреВрд░реНрдг рдУрдПрд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдЖрдкрдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред FreeRTOS рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ, рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ, рдФрд░ рдЕрд░реНрдзрдЪрд╛рд▓рдХ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреЛрдИ рднреА рдлрд╝рд░реНрдорд╡реЗрдпрд░ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рде рджреЛ (рдпрд╛ рдЕрдзрд┐рдХ) рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдЖрдк рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╢рд╛рдиреНрддрд┐ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдзреАрдореЗ рд╕реЗрдВрд╕рд░ рд╕реЗ рд░реАрдбрд┐рдВрдЧ рдкрдврд╝реЗрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рдкрд░реЛрд╕реЗрдВред рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдмреНрд░реЗрдХ, рдЬрдмрдХрд┐ рд╕реЗрдВрд╕рд░ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП! рдореИрдВ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╣рд╛ рдФрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реВрдВ рдЕрдЧрд░ рд╣рдо рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЖрдХрд╛рд░ рдЬрд╛рдирддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рддрд╕реНрд╡реАрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрдореЛрд░реА рдЕрдЪрд╛рдирдХ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЖрд╢реНрдЪрд░реНрдп рд╕реЗ рдмрдЪреЗрдВред

рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ STM32F103C8T6 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ BluePill рдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ FreeRTOS рдореЗрдореЛрд░реА рд╕рдВрдЧрдарди рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╕рдВрдХрд▓рдХ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ArduinoIDE рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред STM32 рдХреЗ рд▓рд┐рдП Arduino рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ - рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рднреА рдХрд░реЗрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмреВрдЯрд▓реЛрдбрд░ Readme.md рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ stm32duino рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ ред FreeRTOS рд╕рдВрд╕реНрдХрд░рдг 10.0 рдХреЛ ArduinoIDE рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрдореНрдкрд╛рдЗрд▓рд░ - gcc 8.2

рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗред рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдорд░реА рдЬреЛ рдХрд┐ рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдореЗрдВ рд╣реИрдВ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

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

рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

#include <STM32FreeRTOS.h> TimerHandle_t xTimer; xSemaphoreHandle xSemaphore; xSemaphoreHandle xMutex; xQueueHandle xQueue; void vTimerCallback(TimerHandle_t pxTimer) { xSemaphoreGive(xSemaphore); } void vTask1(void *) { while(1) { xSemaphoreTake(xSemaphore, portMAX_DELAY); int value = random(1000); xQueueSend(xQueue, &value, portMAX_DELAY); xSemaphoreTake(xMutex, portMAX_DELAY); Serial.println("Test"); xSemaphoreGive(xMutex); } } void vTask2(void *) { while(1) { int value; xQueueReceive(xQueue, &value, portMAX_DELAY); xSemaphoreTake(xMutex, portMAX_DELAY); Serial.println(value); xSemaphoreGive(xMutex); } } void setup() { Serial.begin(9600); vSemaphoreCreateBinary(xSemaphore); xQueue = xQueueCreate(1000, sizeof(int)); xMutex = xSemaphoreCreateMutex(); xTimer = xTimerCreate("Timer", 1000, pdTRUE, NULL, vTimerCallback); xTimerStart(xTimer, 0); xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); xTaskCreate(vTask2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); vTaskStartScheduler(); } void loop() {} 

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FreeRTOS рдирд╛рдо рдХреЗ рдвреЗрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (objdump рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ)

 ... 200009dc l O .bss 00002000 ucHeap ... 

рдпрд╛рдиреА рд╣рдо рдПрдХ рдмрдбрд╝рд╛ рдЯреБрдХрдбрд╝рд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╕рднреА FreeRTOS рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдХрдЯреМрддреА рдХреА рдЬрд╛рддреА рд╣реИ - рд╕реЗрдореАрдлреЙрд░реЗрд╕, рдореНрдпреВрдЯреЗрдХреНрд╕, рдЯрд╛рдЗрдорд░, рдХрддрд╛рд░, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд╛рд░реНрдп рднреАред рдЕрдВрддрд┐рдо 2 рдЕрдВрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрддрд╛рд░ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдвреЗрд░ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЧрд╣ рд▓реЗрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рднреА рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдВ, рдпрд╣ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХрд╛ рдПрдХ рдорд╛рдЗрдирд╕ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдкрдирд╛ рд╕реНрдЯреИрдХ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреИрдХ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрд╕рдореЗрдВ рди рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдХреЗ рдХреЗрд╡рд▓ рдХреЙрд▓ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ, рдмрд▓реНрдХрд┐ рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рд╕реНрдЯреИрдХ рднреАред рдЦреИрд░, рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдПрдХ рд░реБрдХрд╛рд╡рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рд╣рд░ рдХрд╛рд░реНрдп рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд░рд┐рдЬрд░реНрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, CortexM microcontrollers рдиреЗрд╕реНрдЯреЗрдб рдЗрдВрдЯрд░рдкреНрдЯреНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреИрдХ рдХреЛ рд╕рднреА рдЗрдВрдЯрд░рдкреНрдЯреНрд╕ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡реЗ рдПрдХ рд╕рд╛рде рд╣реЛрддреЗ рд╣реИрдВред

рдЯрд╛рд╕реНрдХ рд╕реНрдЯреИрдХ рдХрд╛ рдЖрдХрд╛рд░ рддрдм рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрд╛рд░реНрдп xTaskCreate рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдХрд╛ рдЖрдХрд╛рд░ configMINIMAL_STACK_SIZE рдкреИрд░рд╛рдореАрдЯрд░ (FreeRTOSConfig.h рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ) рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд░рд┐рдЬрд░реНрд╡ рд╣реИред рдвреЗрд░ рдХрд╛ рдЖрдХрд╛рд░ configTOTAL_HEAP_SIZE рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 8kb рд╣реИред

рдЕрдм рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реА рд╕рднреА рд╡рд╕реНрддреБрдПрдВ 8kb рдХреЗ рдвреЗрд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреА? рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА? рдФрд░ рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдп?
рдХреБрдЫ рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдвреЗрд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реБрдПред рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд, рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдмрд╕ рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдпрд╣реА рд╣реИред рдФрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рдвреЗрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреА рд╣реИред рдореБрдЭреЗ 12kb рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдврд╝рд╛рдирд╛ рдерд╛ред

рдмрдВрдж рдХрд░реЛ, рдЪрд░ xTimer, xQueue, xSemaphore, рдФрд░ xMutex рдХреНрдпрд╛ рд╣реИрдВ? рдХреНрдпрд╛ рд╡реЗ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдирд╣реАрдВ, рдпреЗ рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓ рд╣реИрдВ - рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд (рдЕрдкрд╛рд░рджрд░реНрд╢реА) рд╕рдВрд░рдЪрдирд╛ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЦреБрдж рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ

 200009cc g O .bss 00000004 xTimer 200009d0 g O .bss 00000004 xSemaphore 200009cc g O .bss 00000004 xQueue 200009d4 g O .bss 00000004 xMutex 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рддрд░рд╣ рд╣реА рдЗрд╕ рд╕рд╛рд░реА рдЧрдбрд╝рдмрдбрд╝реА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ - рд╣рдо рдЕрдкрдиреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╕реНрдерд┐рд░ рд╡рд┐рддрд░рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдпрджрд┐ configSUPPORT_STATIC_ALLOCATION рдкреИрд░рд╛рдореАрдЯрд░ рдлреНрд░реАрдЯреНрд░реАрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ 1 рдкрд░ рд╕реЗрдЯ рд╣реИред

рдЪрд▓реЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ FreeRTOS рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХреИрд╕реЗ рдХрддрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИ

 struct AMessage { char ucMessageID; char ucData[ 20 ]; }; #define QUEUE_LENGTH 10 #define ITEM_SIZE sizeof( uint32_t ) // xQueueBuffer will hold the queue structure. StaticQueue_t xQueueBuffer; // ucQueueStorage will hold the items posted to the queue. Must be at least // [(queue length) * ( queue item size)] bytes long. uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ]; void vATask( void *pvParameters ) { QueueHandle_t xQueue1; // Create a queue capable of containing 10 uint32_t values. xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold. ITEM_SIZE // The size of each item in the queue &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue. &xQueueBuffer ); // The buffer that will hold the queue structure. // The queue is guaranteed to be created successfully as no dynamic memory // allocation is used. Therefore xQueue1 is now a handle to a valid queue. // ... Rest of task code. } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрддрд╛рд░ рдХреЛ рддреАрди рдЪрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рдЗрдХрд╛рдИ 3 рд╡реИрд░рд┐рдПрдмрд▓ рдирд╣реАрдВ рд╣реИред рдПрдХ рд╡рд░реНрдЧ рдЬреЛ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ - рдкреНрд░рддреНрдпреЗрдХ рдХрддрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЖрдкрдХреЛ рдПрдХ рдмрдбрд╝реА рдХрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рдХреБрдЫ рддрддреНрд╡ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рд╣рдо рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдХрддрд╛рд░рдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдЗрд╕ рдЖрдХрд╛рд░ рдХреЛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 template<class T, size_t size> class Queue { QueueHandle_t xHandle; StaticQueue_t x QueueDefinition; T xStorage[size]; public: Queue() { xHandle = xQueueCreateStatic(size, sizeof(T), reinterpret_cast<uint8_t*>(xStorage), &xQueueDefinition); } bool receive(T * val, TickType_t xTicksToWait = portMAX_DELAY) { return xQueueReceive(xHandle, val, xTicksToWait); } bool send(const T & val, TickType_t xTicksToWait = portMAX_DELAY) { return xQueueSend(xHandle, &val, xTicksToWait); } }; 

рдЙрд╕реА рд╕рдордп, рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдереЗ, рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рднреА рдмрд╕реЗред

рдХрддрд╛рд░ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣

 Queue<int, 1000> xQueue; 

рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛

  xQueue.send(value); 

рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  int value; xQueue.receive(&value); 

рдЕрдм рд╣рдо рд╕реЗрдорд╛рдлреЛрд░рд╕ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдФрд░ рдпрджреНрдпрдкрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ (рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рдХреЗ рдЕрдВрджрд░) рд╕реЗрдорд╛рдлреЛрд░ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдХрддрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рдмреНрджрд╛рд░реНрде рдпреЗ 3 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╛рдЗрдорд░реА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рд╕реЗрдорд╛рдлреЛрд░ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ - рдпрд╣ рдмрд╕ рдХрдИ рдЪрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред

 class Sema { SemaphoreHandle_t xSema; StaticSemaphore_t xSemaControlBlock; public: Sema() { xSema = xSemaphoreCreateBinaryStatic(&xSemaControlBlock); } BaseType_t give() { return xSemaphoreGive(xSema); } BaseType_t take(TickType_t xTicksToWait = portMAX_DELAY) { return xSemaphoreTake(xSema, xTicksToWait); } }; 

рд╕реЗрдорд╛рдлреЛрд░ рдШреЛрд╖рдгрд╛

 Sema xSema; 

рд╕реЗрдореАрдлреЛрд░ рдХреИрдкреНрдЪрд░

  xSema.take(); 

рд╕реЗрдордлреЛрд░ рд░рд┐рд▓реАрдЬ

  xSema.give(); 

рдЕрдм рдореНрдпреВрдЯреЗрдХреНрд╕

 class Mutex { SemaphoreHandle_t xMutex; StaticSemaphore_t xMutexControlBlock; public: Mutex() { xMutex = xSemaphoreCreateMutexStatic(&xSemaControlBlock); } BaseType_t lock(TickType_t xTicksToWait = portMAX_DELAY) { return xSemaphoreTake(xMutex, xTicksToWait); } BaseType_t unlock() { return xSemaphoreGive(xMutex); } }; 

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

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

рдореНрдпреВрдЯреЗрдХреНрд╕, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЗрд╡рд▓ рдЙрд╕реА рд╕реНрдЯреНрд░реАрдо (рдХрд╛рд░реНрдп) рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ FreeRTOS рдЗрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕) рдЗрд╕рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред

рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯрд╛рдЗрд▓ рд╕реА, рдЕрд░реНрдерд╛рддреН рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реАрдзреЗ рдХреЙрд▓ рд▓реЙрдХ () / рдЕрдирд▓реЙрдХ ()ред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рд╕реА ++ рдореЗрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрд░рдПрдЖрдИрдЖрдИ рдХреЗ рдЖрдХрд░реНрд╖рдг рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЖрд╡рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рдХреИрдкреНрдЪрд░ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдХрд░реЗрдЧрд╛ред

 class MutexLocker { Mutex & mtx; public: MutexLocker(Mutex & mutex) : mtx(mutex) { mtx.lock(); } ~MutexLocker() { mtx.unlock(); } }; 

рд╕реНрдХреЛрдк рдЫреЛрдбрд╝рддреЗ рд╕рдордп, рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХрдИ рдирд┐рдХрд╛рд╕ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдореБрдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

  MutexLocker lock(xMutex); Serial.println(value); } // mutex will be unlocked here 

рдЕрдм рд╕рдордп рдХреА рдмрд╛рд░реА рд╣реИред

 class Timer { TimerHandle_t xTimer; StaticTimer_t xTimerControlBlock; public: Timer(const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction) { xTimer = xTimerCreateStatic(pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, &xTimerControlBlock); } void start(TickType_t xTicksToWait = 0) { xTimerStart(xTimer, xTicksToWait); } }; 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкрд┐рдЫрд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рд░рд╣реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдПрдкреАрдЖрдИ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рди рдХрд┐ рдЙрд╕реЗ рдЙрддреНрдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдирд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХрд╛рд░реНрдпред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЙрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдХрддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде - рд╣рдо рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦреЗрдВрдЧреЗ

 template<const uint32_t ulStackDepth> class Task { protected: StaticTask_t xTaskControlBlock; StackType_t xStack[ ulStackDepth ]; TaskHandle_t xTask; public: Task(TaskFunction_t pxTaskCode, const char * const pcName, void * const pvParameters, UBaseType_t uxPriority) { xTask = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, xStack, &xTaskControlBlock); } }; 

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

рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 tasks.c:(.text.vTaskStartScheduler+0x10): undefined reference to `vApplicationGetIdleTaskMemory' timers.c:(.text.xTimerCreateTimerTask+0x1a): undefined reference to `vApplicationGetTimerTaskMemory' 

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

рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдЯрд╛рдЗрдорд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╣реИред рдлреНрд░реАрдЖрд░рдЯреАрдУрдПрд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЯрд╛рдЗрдорд░ рдЕрдкрдиреЗ рджрдо рдкрд░ рдирд╣реАрдВ рд░рд╣рддреЗ рд╣реИрдВ - рдУрдПрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХрддрд╛рдИ рд╣реИ, рдЬреЛ рдЗрди рдЯрд╛рдЗрдорд░ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдмреНрд▓реЙрдХ рдФрд░ рдПрдХ рд╕реНрдЯреИрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдареАрдХ рдЙрд╕реА рддрд░рд╣, OS рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ vApplicationGetTimerTaskMemory () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ рддреБрдЪреНрдЫ рд╣реИрдВ рдФрд░ рдмрд╕ рдЗрд╕реА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

 extern "C" void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) { static StaticTask_t Idle_TCB; static StackType_t Idle_Stack[configMINIMAL_STACK_SIZE]; *ppxIdleTaskTCBBuffer = &Idle_TCB; *ppxIdleTaskStackBuffer = Idle_Stack; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; } extern "C" void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) { static StaticTask_t Timer_TCB; static StackType_t Timer_Stack[configTIMER_TASK_STACK_DEPTH]; *ppxTimerTaskTCBBuffer = &Timer_TCB; *ppxTimerTaskStackBuffer = Timer_Stack; *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; } 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ред

рдореИрдВ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рдд рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдХреЛрдб рдЫрд┐рдкрд╛рдКрдВрдЧрд╛, рдЖрдкрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рдерд╛
 template<class T, size_t size> class Queue { QueueHandle_t xHandle; StaticQueue_t xQueueDefinition; T xStorage[size]; public: Queue() { xHandle = xQueueCreateStatic(size, sizeof(T), reinterpret_cast<uint8_t*>(xStorage), &xQueueDefinition); } bool receive(T * val, TickType_t xTicksToWait = portMAX_DELAY) { return xQueueReceive(xHandle, val, xTicksToWait); } bool send(const T & val, TickType_t xTicksToWait = portMAX_DELAY) { return xQueueSend(xHandle, &val, xTicksToWait); } }; class Sema { SemaphoreHandle_t xSema; StaticSemaphore_t xSemaControlBlock; public: Sema() { xSema = xSemaphoreCreateBinaryStatic(&xSemaControlBlock); } BaseType_t give() { return xSemaphoreGive(xSema); } BaseType_t take(TickType_t xTicksToWait = portMAX_DELAY) { return xSemaphoreTake(xSema, xTicksToWait); } }; class Mutex { SemaphoreHandle_t xMutex; StaticSemaphore_t xMutexControlBlock; public: Mutex() { xMutex = xSemaphoreCreateMutexStatic(&xMutexControlBlock); } BaseType_t lock(TickType_t xTicksToWait = portMAX_DELAY) { return xSemaphoreTake(xMutex, xTicksToWait); } BaseType_t unlock() { return xSemaphoreGive(xMutex); } }; class MutexLocker { Mutex & mtx; public: MutexLocker(Mutex & mutex) : mtx(mutex) { mtx.lock(); } ~MutexLocker() { mtx.unlock(); } }; class Timer { TimerHandle_t xTimer; StaticTimer_t xTimerControlBlock; public: Timer(const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction) { xTimer = xTimerCreateStatic(pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, &xTimerControlBlock); } void start(TickType_t xTicksToWait = 0) { xTimerStart(xTimer, xTicksToWait); } }; template<const uint32_t ulStackDepth> class Task { protected: StaticTask_t xTaskControlBlock; StackType_t xStack[ ulStackDepth ]; TaskHandle_t xTask; public: Task(TaskFunction_t pxTaskCode, const char * const pcName, void * const pvParameters, UBaseType_t uxPriority) { xTask = xTaskCreateStatic(pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, xStack, &xTaskControlBlock); } }; extern "C" void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) { static StaticTask_t Idle_TCB; static StackType_t Idle_Stack[configMINIMAL_STACK_SIZE]; *ppxIdleTaskTCBBuffer = &Idle_TCB; *ppxIdleTaskStackBuffer = Idle_Stack; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; } extern "C" void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) { static StaticTask_t Timer_TCB; static StackType_t Timer_Stack[configTIMER_TASK_STACK_DEPTH]; *ppxTimerTaskTCBBuffer = &Timer_TCB; *ppxTimerTaskStackBuffer = Timer_Stack; *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; } 


рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХреЛрдбред

 Timer xTimer("Timer", 1000, pdTRUE, NULL, vTimerCallback); Sema xSema; Mutex xMutex; Queue<int, 1000> xQueue; Task<configMINIMAL_STACK_SIZE> task1(vTask1, "Task 1", NULL, tskIDLE_PRIORITY); Task<configMINIMAL_STACK_SIZE> task2(vTask2, "Task 2", NULL, tskIDLE_PRIORITY); void vTimerCallback(TimerHandle_t pxTimer) { xSema.give(); MutexLocker lock(xMutex); Serial.println("Test"); } void vTask1(void *) { while(1) { xSema.take(); int value = random(1000); xQueue.send(value); } } void vTask2(void *) { while(1) { int value; xQueue.receive(&value); MutexLocker lock(xMutex); Serial.println(value); } } void setup() { Serial.begin(9600); xTimer.start(); vTaskStartScheduler(); } void loop() {} 

рдЖрдк рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдирд░реА рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИ (рдУрдмреНрдЬреЗрдХреНрдЯрдореНрдк рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд░рдВрдЧрд╛ рд╣реБрдЖ рд╣реИ):

 0x200000b0 .bss 512 vApplicationGetIdleTaskMemory::Idle_Stack 0x200002b0 .bss 92 vApplicationGetIdleTaskMemory::Idle_TCB 0x2000030c .bss 1024 vApplicationGetTimerTaskMemory::Timer_Stack 0x2000070c .bss 92 vApplicationGetTimerTaskMemory::Timer_TCB 0x200009c8 .bss 608 task1 0x20000c28 .bss 608 task2 0x20000e88 .bss 84 xMutex 0x20000edc .bss 4084 xQueue 0x20001ed0 .bss 84 xSema 0x20001f24 .bss 48 xTimer 

рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдм рд╕рдм рдХреБрдЫ рдкреВрд░реНрдг рджреГрд╢реНрдп рдореЗрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдареАрдХ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЯрд╛рд╕реНрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдпреМрдЧрд┐рдХ рд╡рд╕реНрддреБрдПрдВ рдЕрдкрдиреЗ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдорд╛рдирддреА рд╣реИрдВ)ред рд╕рдВрдХрд▓рдХ рдЖрдБрдХрдбрд╝реЗ рднреА рдмреЗрд╣рдж рд╕рдЯреАрдХ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред

 Sketch uses 20,800 bytes (15%) of program storage space. Maximum is 131,072 bytes. Global variables use 9,332 bytes (45%) of dynamic memory, leaving 11,148 bytes for local variables. Maximum is 20,480 bytes. 

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рд╛рд▓рд╛рдБрдХрд┐ FreeRTOS рдЖрдкрдХреЛ рдлреНрд▓рд╛рдИ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ, рдХрддрд╛рд░реЛрдВ, рд╕реЗрдорд╛рдлреЛрд░ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рд╡реЗ рдЕрдЧрд▓реЗ рд░рд┐рдмреВрдЯ рддрдХ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рд╕реНрддрд░ рдкрд░ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рд╕реНрдореГрддрд┐ рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рдорд┐рд▓рддреА рд╣реИ, рдЬрд╣рд╛рдВ рдЭреВрда рдФрд░ рдХрд┐рддрдиреА рдореБрдХреНрдд рд╕реНрдореГрддрд┐ рдмрдиреА рд╣реБрдИ рд╣реИред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрд┐рдирдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

FreeRTOS рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕реНрдереИрддрд┐рдХ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ FreeRTOS рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдкрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реИрдкрд░ рднреА рд▓рд┐рдЦреЗ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЗрдирдХреИрдкреНрд╕ рднреА

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

рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ "рд▓реЗрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ" рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛, рдореИрдВ рд╕рд┐рд░реНрдл рд╡рд┐рдЪрд╛рд░ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдПрдХ рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЬрд░реВрд░рдд рдХрд┐рд╕реЗ рд╣реИ, рдореИрдВ рдЕрднреА frt рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВред рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рджрд┐рдорд╛рдЧ рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЦреИрд░, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред

рд▓реЗрдЦ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИ ред

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред рдореЗрд░реЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред

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


All Articles