рдХреЛрд░реНрдЯреЗрдХреНрд╕рдПрдо 4 рдХреЗ рд▓рд┐рдП "рд╕рднреА" рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реА ++ рд░реИрдкрд░

рдЫрд╡рд┐

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрд╛рдд рдХреА рдХрд┐ рдЖрдк рд▓реЗрдЦ STM32, C ++ рдФрд░ FreeRTOS рдореЗрдВ C ++ рдореЗрдВ рд▓рд┐рдЦреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП FreeRtos рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рдХрд╛рд╕ред рднрд╛рдЧ 1 рддрдм рд╕реЗ, рдЬрдм рддрдХ рдХрд┐ 3 рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╡реГрджреНрдз рд╣реЛ рдЧрдпрд╛, рддрдВрддреНрд░рд┐рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЦреЛ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдФрд░ "рдХрд┐рд╕реА рднреА" рд▓реЛрдХрдкреНрд░рд┐рдп рдЖрд░рдЯреАрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХреЛ рд╕реНрд╡реАрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдХреЛ рд╣рд┐рд▓рд╛рдХрд░ рд░рдЦ рджрд┐рдпрд╛ред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдордЬрд╛рдХ рд╣реИ, рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ "рд╕рднреА" рдХреЛ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд░рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдордЬрд╛рдХ рдореЗрдВ рдХреБрдЫ рд╕рдЪреНрдЪрд╛рдИ рд╣реИред

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

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдШрд░реЗрд▓реВ RTOS MAX рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦреБрд╢реА рдХреА рдмрд╛рдд рд╣реИред

рд▓реЗрдХрд┐рди рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ IEC_61508 рдорд╛рдирдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕рд┐рджреНрдз рд▓рдХреНрд╖реНрдп рдЙрдкрдпреЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ E.29 рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ ред рдареАрдХ рд╣реИ, рдпрд╛ рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдЖрдк SIL3 рд╕реНрддрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ (рдЙрдЪреНрдЪ рдЕрдиреБрд╢рдВрд╕рд┐рдд) рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдЗрд╕ рд╕реНрддрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рдФрд░ рд╕рдордп-рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП MAX MAX RTOS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдЕрдВрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, RTOS рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ IEC_61508 рдорд╛рдирдХреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FreeRTOS рдореЗрдВ рдПрдХ SafeRTOS рдХреНрд▓реЛрди рд╣реИ, рдФрд░ embos рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд▓реЛрди рд╣реИ, рдмреЗрд╢рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреИрд╕рд╛ рдХрдорд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди OS рдХреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдХрдИ рд╣рдЬрд╛рд░ рдЦрд░реНрдЪ рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рджрд╕рд┐рдпреЛрдВ рднреАред рд╣рдЬрд╛рд░ рдбреЙрд▓рд░ред

рд╡реИрд╕реЗ, рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг IAR рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рдХреАрдордд рд▓рдЧрднрдЧ 1,500 рдбреЙрд▓рд░ рд╣реИ, рд▓реЗрдХрд┐рди IAR рдкреНрд░рдорд╛рдгрд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд▓рд╛рдЧрдд рдкрд╣рд▓реЗ рд╣реА рд▓рдЧрднрдЧ 10,000 рд░реБрдкрдпреЗ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдЬрд╛рдБрдЪ рдХреА - рдмрд┐рдирд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕рдорд╛рди рд╣реИред рдареАрдХ рд╣реИ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рд╢рд╛рдВрддрд┐ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рдЫрд╡рд┐

рдЦреИрд░, рдпрд╛ рдРрд╕реЗ ...

рдЫрд╡рд┐

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

  • рдХрд╛рд░реНрдп
  • рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб
  • рдШрдЯрдирд╛рдПрдБ рдФрд░ рдХрд╛рд░реНрдп рд╕реВрдЪрдирд╛
  • рд╕реЗрдорд╛рдлреЛрд░реЗрд╕ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕
  • рдХрддрд╛рд░реЛрдВ

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

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

  • рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рджреЛрд╣рд░реЗ рд╕рдорд╛рд╡реЗрд╢ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреЛрдИ рдореИрдХреНрд░реЛрдЬрд╝ , рдареАрдХ рдирд╣реАрдВ рд╣реИ ред рдореИрдХреНрд░реЛрдЬрд╝ рдмреБрд░рд╛рдИ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдмреНрд░рд╣реНрдорд╛рдВрдб рдЗрддрдирд╛ рдкреБрд░рд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕ рджреМрд░рд╛рди рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рд╡рд┐рдзрд╛рдпреА рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреЛрд░реЗрдВрдЯ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЛрдирд╕ рд▓реЗрдВ
  • рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ ред рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдРрд╕реА рдЬрдЧрд╣реЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реИрдкрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рджрд╛рджрд╛ рд╕реЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  • рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдмрд╕ рдПрдХ рд╣реАрдк рд▓реАрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдвреЗрд░ рдХреЗ рд▓рд┐рдП рд░реИрдо рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдвреЗрд░ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде, рдпрд╣ рдбреАрдлрд╝реНрд░реЗрдЧреНрдореЗрдВрдЯреЗрдб рд╣реИ рдФрд░ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХред рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ FreeRTOS рдХреЛ рдХреЗрд╡рд▓ configSUPPORT_STATIC_ALLOCATION 1 рд╕реЗрдЯ рдХрд░рдХреЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдбрд┐рдлреЙрд▓реНрдЯ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, FreeRTOS OS рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдмрд╕ configSUPPORT_STATIC_ALLOCATION 0 рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░
    configSUPPORT_DYNAMIC_ALLOCATION 1 рдФрд░ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд▓реНрд▓реЛрдХреНрд╕ рдФрд░ рдХреЙрд▓реЛрдХреНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рд╛рдЗрд▓ FreeRtos / рдкреЛрд░реНрдЯреЗрдмрд▓ / MemMang / heap_1.c рд╣реИред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдЭреБрдВрдб рдХреЗ рд▓рд┐рдП рд░рд┐рдЬрд░реНрд╡ рдХреЗ рд╕рд╛рде рд░реИрдо рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рд░реИрдо рдХреА рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, (рдЖрдЗрдбрд▓ рдЪрд╛рд▓реВ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯрд╛рдЗрдорд░ рдХрд╛рд░реНрдп рдЪрд╛рд▓реВ рд╣реИ, рдореЗрд░реЗ рджреЛ рдХрд╛рдо, рдХрддрд╛рд░, рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдЖрдХрд╛рд░ 10 рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд╣реАрдВ рд╣реИ) рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рддреЛ рдХрд╛рдо рдХрд┐рдпрд╛:
    рдкрдардиреАрдп рдХреЛрдб рдореЗрдореЛрд░реА рдХреЗ 7 357 рдмрд╛рдЗрдЯреНрд╕
    535 рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА рдмрд╛рдЗрдЯреНрд╕
    6,053 рд░реАрдбрд░рд╛рдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА рдмрд╛рдЗрдЯреНрд╕

    рд╕реНрдерд┐рд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди "рдереЛрдбрд╝рд╛" рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ:
    рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдореЗрдореЛрд░реА рдХреА 7,329 рдмрд╛рдЗрдЯреНрд╕
    535 рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА рдмрд╛рдЗрдЯреНрд╕
    3,877 рд░реАрдбрд░рд╛рдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА рдмрд╛рдЗрдЯреНрд╕

    рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, "рднрдпрд╛рдирдХ ... рдЕрдкрдиреЗ рдЖрдк рдХреЛ," рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рд╡рд╛рд▓ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ "рдореИрдВрдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ 3KB рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ 128B рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ 3 рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд┐рдП рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЪреМрдереЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рд╣реИ" , рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рд╣реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рдФрд░ рд╕реНрдерд┐рд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред
  • рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдкреНрд░рдХрд╛рд░ рди рдбрд╛рд▓реЗрдВ ред рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рднреВрддреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрднреА рднреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдирдо рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛), рдФрд░ рдХрднреА-рдХрднреА рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдпрд╣, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╕рд╛рджрдЧреА рдФрд░ рд╕реБрд╡рд┐рдзрд╛ ред рд░реИрдкрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЙрд╕рдХрд╛ рдЬреАрд╡рди рддреЗрд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд╣ рдЕрднреА рддрдХ рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ - рдЙрд╕рдиреЗ рдХрд╛рд░реНрдп рдмрдирд╛рдпрд╛, рдЗрд╕рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЗрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдЬреАрд╡рди рдХрд╛ рдЖрдирдВрдж рд▓реЗрдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред

рд╣рдо рдЗрд╕рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЦреБрдж рдХреЛ рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ (рдпрд╣ "рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖рд┐рджреНрдз") рд╕реЗ рд╕рд╣реА рдирд┐рдХрд▓рд╛ред

рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп


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

class Thread { public: virtual void Execute() = 0 ; private: tTaskHandle taskHandle ; tTaskContext context ; } ; 

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

 class MyTask : public Thread { public: virtual void Execute() override { while(true) { //do something.. } } ; using tMyTaskStack = std::array<OsWrapper::tStack, static_cast<tU16>(OsWrapper::StackDepth::minimal)> ; inline static tMyTaskStack Stack; //!C++17 } ; MyTask myDesiredTask int main() { Rtos::CreateThread(myTask, MyTask::Stack.data(), "myTask") ; } 

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

 void OS_TASK_CreateEx( OS_TASK* pTask, const char* pName, OS_PRIO Priority, void (*pRoutine)(void * pVoid ), void OS_STACKPTR *pStack, OS_UINT StackSize, OS_UINT TimeSlice, void* pContext); 

рд╢реВрдиреНрдп * pContext - рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреА рдХреБрдВрдЬреА рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рдзрд┐ рд╣реИ, рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд┐рдбреНрдпреВрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдереНрд░реЗрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдБ рд╣рдо рд╕реАрдзреЗ рдПрдХреНрд╕рдХреНрдпреВрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдареАрдХ рдЙрд╕реА рдХреНрд╖рдг рд╣реИ рдЬрдм рдХреЛрдИ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 static void Run(void *pContext ) { static_cast<Thread*>(pContext)->Execute() ; } 

рдпрд╛рдиреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдСрдкрд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рдЕрдиреБрд╕реВрдЪрдХ рд░рди рд╡рд┐рдзрд┐ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдереНрд░реЗрдб рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд░рди рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рди рд╡рд┐рдзрд┐ рд╕реАрдзреЗ рдПрдХреНрд╕рдХреНрдпреВрдЯ () рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЬреЛ рдереНрд░реЗрдб рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

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

рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рдо рдЗрдирд▓рд╛рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдерд╛ред рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдУрдПрд╕ рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рдореНрди rtosFreeRtos.cpp рдлрд╝рд╛рдЗрд▓ рдирд┐рдХрд▓реА

 #include "rtos.hpp" //For FreeRTOS functions prototypes #include <FreeRTOS.h> //For xTaskCreate #include <task.h> namespace OsWrapper { void wCreateThread(Thread & thread, const char * pName, ThreadPriority prior,const tU16 stackDepth, tStack *pStack) { #if (configSUPPORT_STATIC_ALLOCATION == 1) if (pStack != nullptr) { thread.handle = xTaskCreateStatic(static_cast<TaskFunction_t>(Rtos::Run), pName, stackDepth, &thread, static_cast<uint32_t>(prior), pStack, &thread.taskControlBlock); } #else thread.handle = (xTaskCreate(static_cast<TaskFunction_t>(Rtos::Run), pName, stackDepth, &thread, static_cast<uint32_t>(prior), &thread.handle) == pdTRUE) ? thread.handle : nullptr ; #endif } 

ROSosEmbOS.cpp рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЙрд╕рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬреИрд╕реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ

 #include "rtos.hpp" //For embOS functions prototypes #include <rtos.h> namespace OsWrapper { void wCreateThread(Thread &thread, const char * pName, ThreadPriority prior,const tU16 stackDepth, tStack *pStack) { constexpr OS_UINT timeSliceNull = 0 ; if (pStack != nullptr) { OS_CreateTaskEx(&(thread.handle), pName, static_cast<OS_PRIO>(prior), Rtos::Run, pStack, ((stackSize == 0U) ? sizeof(pStack) : stackSize), timeSliceNull, &thread) ; } } 

рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рднреА рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рд╕рдВрджрд░реНрдн рдХреА рд╕рдВрд░рдЪрдирд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реИрдкрд░ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде rtosdefs.hpp рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред

 #include <FreeRTOS.h> //For TaskHandle_t namespace OsWrapper { using tTaskContext = StaticTask_t; using tTaskHandle = TaskHandle_t; using tStack = StackType_t ; } 

EmbOS рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 #include <rtos.h> //For OS_TASK namespace OsWrapper { using tTaskContext = OS_TASK; using tTaskHandle = OS_TASK; using tStack = tU16 //   void,      tU16 ; } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрд┐рд╕реА рдЕрдиреНрдп RTOS рдХреЗ рддрд╣рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рдЗрди рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ rtosdefs.cpp рдФрд░ rtos.cpp рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЕрдм рдереНрд░реЗрдб рдФрд░ рдЖрд░рдЯреЛрд╕ рдХрдХреНрд╖рд╛рдПрдВ рд╕реА рддрд╕реНрд╡реАрд░реЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ

рдЫрд╡рд┐

рдУрдПрд╕ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛


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

 static void HandleSvcInterrupt() ; static void HandleSvInterrupt() ; static void HandleSysTickInterrupt() ; static void Start() ; 

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

рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рдирд┐рдХрд▓рд╛, рдХреЛрдИ рднреА рдУрдПрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рд╢рд╛рдпрдж uc-OS-II рдФрд░ III рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдШрдЯрдирд╛рдУрдВ рдХрд╛ рддрдВрддреНрд░ рдЖрдо рддреМрд░ рдкрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдУрд╣ рдареАрдХ рд╣реИ, "рд╕рдм рдХреБрдЫ" рдмрд╛рдХреА рд╣реИ рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЫрд╡рд┐

rtos.hpp
 /******************************************************************************* * Filename : Rtos.hpp * * Details : Rtos class is used to create tasks, work with special Rtos * functions and also it contains a special static method Run. In this method * the pointer on Thread should be pass. This method is input point as * the task of Rtos. In the body of the method, the method of concrete Thread * will run. *******************************************************************************/ #ifndef __RTOS_HPP #define __RTOS_HPP #include "thread.hpp" // for Thread #include "../../Common/susudefs.hpp" #include "FreeRtos/rtosdefs.hpp" namespace OsWrapper { extern void wCreateThread(Thread &, const char *, ThreadPriority, const tU16, tStack *) ; extern void wStart() ; extern void wHandleSvcInterrupt() ; extern void wHandleSvInterrupt() ; extern void wHandleSysTickInterrupt() ; extern void wEnterCriticalSection(); extern void wLeaveCriticalSection(); class Rtos { public: static void CreateThread(Thread &thread , tStack * pStack = nullptr, const char * pName = nullptr, ThreadPriority prior = ThreadPriority::normal, const tU16 stackDepth = static_cast<tU16>(StackDepth::minimal)) ; static void Start() ; static void HandleSvcInterrupt() ; static void HandleSvInterrupt() ; static void HandleSysTickInterrupt() ; friend void wCreateThread(Thread &, const char *, ThreadPriority, const tU16, tStack *); private: //cstat !MISRAC++2008-7-1-2 To prevent reinterpet_cast in the CreateTask static void Run(void *pContext ) { static_cast<Thread*>(pContext)->Execute() ; } } ; } ; #endif // __RTOS_HPP 


thread.hpp
 /******************************************************************************* * Filename : thread.hpp * * Details : Base class for any Taskis which contains the pure virtual * method Execute(). Any active classes which will have a method for running as * a task of RTOS should inherit the Thread and override the Execute() method. * For example: * class MyTask : public OsWrapper::Thread * { * public: * virtual void Execute() override { * while(true) { * //do something.. * } * } ; * *******************************************************************************/ #ifndef __THREAD_HPP #define __THREAD_HPP #include "FreeRtos/rtosdefs.hpp" #include "../../Common/susudefs.hpp" namespace OsWrapper { extern void wSleep(const tTime) ; extern void wSleepUntil(tTime &, const tTime) ; extern tTime wGetTicks() ; extern void wSignal(tTaskHandle const &, const tTaskEventMask) ; extern tTaskEventMask wWaitForSignal(const tTaskEventMask, tTime) ; constexpr tTaskEventMask defaultTaskMaskBits = 0b010101010 ; enum class ThreadPriority { clear = 0, lowest = 10, belowNormal = 20, normal = 30, aboveNormal = 80, highest = 90, priorityMax = 255 } ; enum class StackDepth: tU16 { minimal = 128U, medium = 256U, big = 512U, biggest = 1024U }; class Thread { public: virtual void Execute() = 0 ; inline tTaskHandle GetTaskHanlde() const { return handle; } static void Sleep(const tTime timeOut = 1000ms) { wSleep(timeOut) ; }; inline void Signal(const tTaskEventMask mask = defaultTaskMaskBits) { wSignal(handle, mask); }; inline tTaskEventMask WaitForSignal(tTime timeOut = 1000ms, const tTaskEventMask mask = defaultTaskMaskBits) { return wWaitForSignal(mask, timeOut) ; } friend void wCreateThread(Thread &, const char *, ThreadPriority, const tU16, tStack *); private: tTaskHandle handle ; tTaskContext context ; } ; } ; #endif // __THREAD_HPP 


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

 namespace OsWrapper { extern void wEnterInterrupt() ; extern void wLeaveInterrupt() ; class InterruptEntry { public: inline InterruptEntry() { wEnterInterrupt() ; } inline ~InterruptEntry() { wLeaveInterrupt() ; } } ; } ; 

рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 void Button::HandleInterrupt() { const OsWrapper::InterruptEntry ie; EXTI->PR = EXTI_PR_PR13 ; myDesiredTask.Signal(); } void myDesiredTask::Execute() { while(true) { if (WaitForSignal(100000ms) == defaultTaskMaskBits) { GPIOC->ODR ^= (1 << 5) ; } } } ; 

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

 namespace OsWrapper{ class CriticalSection { public: inline CriticalSection() { wEnterCriticalSection() ; } inline ~CriticalSection() { wLeaveCriticalSection() ; } } ; } ; 

рдЕрдм рдлрд╝рд╛рдЗрд▓ рдореЗрдВ FreeRtos API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдЪреЗрдХ рдЪрд▓рд╛рдПрдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ :)
rtosFreeRtos.cpp
 /******************************************************************************* * Filename : rtosFreeRtos.cpp * * Details : This file containce implementation of functions of concrete * FreeRTOS to support another RTOS create the same file with the * same functions but another name< for example rtosEmbOS.cpp and * implement these functions using EmbOS API. * *******************************************************************************/ #include "../thread.hpp" #include "../mutex.hpp" #include "../rtos.hpp" #include "../../../Common/susudefs.hpp" #include "rtosdefs.hpp" #include "../event.hpp" #include <limits> namespace OsWrapper { /***************************************************************************** * Function Name: wCreateThread * Description: Creates a new task and passes a parameter to the task. The * function should call appropriate RTOS API function to create a task. * * Assumptions: RTOS API create task function should get a parameter to pass the * paramete to task. * Some RTOS does not use pStack pointer so it should be set to nullptr * * Parameters: [in] thread - refernce on Thread object * [in] pName - name of task * [in] prior - task priority * [in] stackDepth - size of Stack * [in] pStack - pointer on task stack * Returns: No ****************************************************************************/ void wCreateThread(Thread & thread, const char * pName, ThreadPriority prior, const tU16 stackDepth, tStack *pStack) { #if (configSUPPORT_STATIC_ALLOCATION == 1) if (pStack != nullptr) { thread.handle = xTaskCreateStatic(static_cast<TaskFunction_t>(Rtos::Run), pName, stackDepth, &thread, static_cast<uint32_t>(prior), pStack, &thread.context); } #else thread.handle = (xTaskCreate(static_cast<TaskFunction_t>(Rtos::Run), pName, stackDepth, &thread, static_cast<uint32_t>(prior), &thread.handle) == pdTRUE) ? thread.handle : nullptr ; #endif } /***************************************************************************** * Function Name: wStart() * Description: Starts the RTOS scheduler * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wStart() { vTaskStartScheduler() ; } /***************************************************************************** * Function Name: wHandleSvcInterrupt() * Description: Handle of SVC Interrupt. The function should call appropriate * RTOS function to handle the interrupt * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wHandleSvcInterrupt() { vPortSVCHandler() ; } /***************************************************************************** * Function Name: wHandleSvInterrupt() * Description: Handle of SV Interrupt. The function should call appropriate * RTOS function to handle the interrupt * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wHandleSvInterrupt() { xPortPendSVHandler() ; } /***************************************************************************** * Function Name: wHandleSysTickInterrupt() * Description: Handle of System Timer Interrupt. The function should call * appropriate RTOS function to handle the interrupt * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wHandleSysTickInterrupt() { xPortSysTickHandler() ; } /***************************************************************************** * Function Name: wSleep() * Description: Suspends the calling task for a specified period of time, * or waits actively when called from main() * * Assumptions: No * Parameters: [in] timeOut - specifies the time interval in system ticks * Returns: No ****************************************************************************/ void wSleep(const tTime timeOut) { vTaskDelay(timeOut) ; } /***************************************************************************** * Function Name: wEnterCriticalSection() * Description: Basic critical section implementation that works by simply * disabling interrupts * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wEnterCriticalSection() { taskENTER_CRITICAL() ; } /***************************************************************************** * Function Name: wLeaveCriticalSection() * Description: Leave critical section implementation that works by simply * enabling interrupts * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wLeaveCriticalSection() { taskEXIT_CRITICAL() ; } /**************************************************************************** * Function Name: wEnterInterrupt() * Description: Some RTOS requires to inform the kernel that interrupt code * is executing * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wEnterInterrupt() { } /**************************************************************************** * Function Name: wLeaveInterrupt() * Description: Some RTOS requires to inform that the end of the interrupt r * outine has been reached; executes task switching within ISR * * Assumptions: No * Parameters: No * Returns: No ****************************************************************************/ void wLeaveInterrupt() { } /**************************************************************************** * Function Name: wSignal() * Description: Signals event(s) to a specified task * * Assumptions: No * Parameters: [in] taskHandle - Reference to the task structure * [in] mask - The event bit mask containing the event bits, * which shall be signaled. * Returns: No ****************************************************************************/ void wSignal(tTaskHandle const &taskHandle, const tTaskEventMask mask) { BaseType_t xHigherPriorityTaskWoken = pdFALSE ; xTaskNotifyFromISR(taskHandle, mask, eSetBits, &xHigherPriorityTaskWoken) ; portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) ; } /**************************************************************************** * Function Name: wWaitForSignal() * Description: Waits for the specified events for a given time, and clears * the event memory when the function returns * * Assumptions: No * Parameters: [in] mask - The event bit mask containing the event bits, * which shall be waited for * [in] timeOut - Maximum time in system ticks waiting for events * to be signaled. * Returns: Set bits ****************************************************************************/ tTaskEventMask wWaitForSignal(const tTaskEventMask mask, tTime timeOut) { uint32_t ulNotifiedValue = 0U ; xTaskNotifyWait( 0U, std::numeric_limits<uint32_t>::max(), &ulNotifiedValue, timeOut); return (ulNotifiedValue & mask) ; } /**************************************************************************** * Function Name: wCreateEvent() * Description: Create an Event object * * Assumptions: No * Parameters: [in] event - reference on tEvent object * * Returns: Handle of created Event ****************************************************************************/ tEventHandle wCreateEvent(tEvent &event) { #if (configSUPPORT_STATIC_ALLOCATION == 1) return xEventGroupCreateStatic(&event); #else return xEventGroupCreate(); #endif } /**************************************************************************** * Function Name: wDeleteEvent() * Description: Create an Event object * * Assumptions: No * Parameters: [in] eventHandle - reference on tEventHandle object * * Returns: No ****************************************************************************/ void wDeleteEvent(tEventHandle &eventHandle) { vEventGroupDelete(eventHandle); } /**************************************************************************** * Function Name: wSignalEvent() * Description: Sets an resumes tasks which are waiting at the event object * * Assumptions: No * Parameters: [in] event - reference on eventHandle object * [in] mask - The event bit mask containing the event bits, * which shall be signaled * * Returns: No ****************************************************************************/ void wSignalEvent(tEventHandle const &eventHandle, const tEventBits mask) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; xEventGroupSetBitsFromISR(eventHandle, mask, &xHigherPriorityTaskWoken) ; portYIELD_FROM_ISR(xHigherPriorityTaskWoken) ; } /**************************************************************************** * Function Name: wWaitEvent() * Description: Waits for an event and suspends the task for a specified time * or until the event has been signaled. * * Assumptions: No * Parameters: [in] event - Reference on eventHandle object * [in] mask - The event bit mask containing the event bits, * which shall be signaled * [in] timeOut - Maximum time in RTOS system ticks until the * event must be signaled. * [in] mode - Indicate mask bit behaviour * * Returns: Set bits ****************************************************************************/ tEventBits wWaitEvent(tEventHandle const &eventHandle, const tEventBits mask, const tTime timeOut, OsWrapper::EventMode mode) { BaseType_t xWaitForAllBits = pdFALSE ; if (mode == OsWrapper::EventMode::waitAnyBits) { xWaitForAllBits = pdFALSE; } return xEventGroupWaitBits(eventHandle, mask, pdTRUE, xWaitForAllBits, timeOut) ; } /**************************************************************************** * Function Name: wCreateMutex() * Description: Create an mutex. Mutexes are used for managing resources by * avoiding conflicts caused by simultaneous use of a resource. The resource * managed can be of any kind: a part of the program that is not reentrant, a * piece of hardware like the display, a flash prom that can only be written to * by a single task at a time, a motor in a CNC control that can only be * controlled by one task at a time, and a lot more. * * Assumptions: No * Parameters: [in] mutex - Reference on tMutex structure * [in] mode - Indicate mask bit behaviour * * Returns: Mutex handle ****************************************************************************/ tMutexHandle wCreateMutex(tMutex &mutex) { #if (configSUPPORT_STATIC_ALLOCATION == 1) return xSemaphoreCreateMutexStatic(&mutex) ; #else return xSemaphoreCreateMutex(); #endif } /**************************************************************************** * Function Name: wDeleteMutex() * Description: Delete the mutex. * * Assumptions: No * Parameters: [in] mutex - handle of mutex * * Returns: Mutex handle ****************************************************************************/ void wDeleteMutex(tMutexHandle &handle) { vSemaphoreDelete(handle) ; } /**************************************************************************** * Function Name: wLockMutex() * Description: Claim the resource * * Assumptions: No * Parameters: [in] handle - handle of mutex * [in] timeOut - Maximum time until the mutex should be available * * Returns: true if resource has been claimed, false if timeout is expired ****************************************************************************/ bool wLockMutex(tMutexHandle const &handle, tTime timeOut) { return static_cast<bool>(xSemaphoreTake(handle, timeOut)) ; } /**************************************************************************** * Function Name: wUnLockMutex() * Description: Releases a mutex currently in use by a task * * Assumptions: No * Parameters: [in] handle - handle of mutex * * Returns: No ****************************************************************************/ void wUnLockMutex(tMutexHandle const &handle) { BaseType_t xHigherPriorityTaskWoken = pdFALSE ; xSemaphoreGiveFromISR(handle, &xHigherPriorityTaskWoken) ; portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) ; } /**************************************************************************** * Function Name: wSleepUntil() * Description: Suspends the calling task until a specified time, or waits * actively when called from main() * * Assumptions: No * Parameters: [in] last - Refence to a variable that holds the time at which * the task was last unblocked. The variable must be initialised * with the current time prior to its first use * [in] timeOut - Time to delay until, the task will be unblocked * at time * * Returns: No ****************************************************************************/ void wSleepUntil(tTime & last, const tTime timeOut) { vTaskDelayUntil( &last, timeOut) ; } /**************************************************************************** * Function Name: wGetTicks() * Description: Returns the current system time in ticks as a native integer * value * * Assumptions: No * Parameters: No * * Returns: Current system time in ticks ****************************************************************************/ tTime wGetTicks() { return xTaskGetTickCount(); } } 


рдЫрд╡рд┐

рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ


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

 void MyTask::Execute() { while(true) { DoCalculation(); //It takes about 10ms Led1.Toggle() ; Sleep(100ms) ; } } 

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

рдЫрд╡рд┐

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

  class Thread { public: virtual void Execute() = 0 ; friend class Rtos ; private: void Run() { lastWakeTime = wGetTicks() ; Execute(); } ... tTime lastWakeTime = 0ms ; ... } 

Run Rtos, Execute(), Run() Thread. Rtos , Run() Thread.

 static void Run(void *pContext ) { static_cast<Thread*>(pContext)->Run() ; } 

SleepUntil() , . , , , SleepUntil() , . :
рдЫрд╡рд┐

thread.hpp
 /******************************************************************************* * Filename : thread.hpp * * Details : Base class for any Taskis which contains the pure virtual * method Execute(). Any active classes which will have a method for running as * a task of RTOS should inherit the Thread and override the Execute() method. * For example: * class MyTask : public OsWrapper::Thread * { * public: * virtual void Execute() override { * while(true) { * //do something.. * } * } ; * * Author : Sergey Kolody *******************************************************************************/ #ifndef __THREAD_HPP #define __THREAD_HPP #include "FreeRtos/rtosdefs.hpp" #include "../../Common/susudefs.hpp" namespace OsWrapper { extern void wSleep(const tTime) ; extern void wSleepUntil(tTime &, const tTime) ; extern tTime wGetTicks() ; extern void wSignal(tTaskHandle const &, const tTaskEventMask) ; extern tTaskEventMask wWaitForSignal(const tTaskEventMask, tTime) ; constexpr tTaskEventMask defaultTaskMaskBits = 0b010101010 ; enum class ThreadPriority { clear = 0, lowest = 10, belowNormal = 20, normal = 30, aboveNormal = 80, highest = 90, priorityMax = 255 } ; enum class StackDepth: tU16 { minimal = 128U, medium = 256U, big = 512U, biggest = 1024U }; class Thread { public: virtual void Execute() = 0 ; inline tTaskHandle GetTaskHanlde() const { return handle; } static void Sleep(const tTime timeOut = 1000ms) { wSleep(timeOut) ; }; void SleepUntil(const tTime timeOut = 1000ms) { wSleepUntil(lastWakeTime, timeOut); }; inline void Signal(const tTaskEventMask mask = defaultTaskMaskBits) { wSignal(handle, mask); }; inline tTaskEventMask WaitForSignal(tTime timeOut = 1000ms, const tTaskEventMask mask = defaultTaskMaskBits) { return wWaitForSignal(mask, timeOut) ; } friend void wCreateThread(Thread &, const char *, ThreadPriority, const tU16, tStack *); friend class Rtos ; private: tTaskHandle handle ; tTaskContext context ; tTime lastWakeTime = 0ms ; void Run() { lastWakeTime = wGetTicks() ; Execute(); } } ; } ; #endif // __THREAD_HPP 


rtos.hpp
 /******************************************************************************* * Filename : Rtos.hpp * * Details : Rtos class is used to create tasks, work with special Rtos * functions and also it contains a special static method Run. In this method * the pointer on Thread should be pass. This method is input point as * the task of Rtos. In the body of the method, the method of concrete Thread * will run. *******************************************************************************/ #ifndef __RTOS_HPP #define __RTOS_HPP #include "thread.hpp" // for Thread #include "../../Common/susudefs.hpp" #include "FreeRtos/rtosdefs.hpp" namespace OsWrapper { extern void wCreateThread(Thread &, const char *, ThreadPriority, const tU16, tStack *) ; extern void wStart() ; extern void wHandleSvcInterrupt() ; extern void wHandleSvInterrupt() ; extern void wHandleSysTickInterrupt() ; extern void wEnterCriticalSection(); extern void wLeaveCriticalSection(); class Rtos { public: static void CreateThread(Thread &thread , tStack * pStack = nullptr, const char * pName = nullptr, ThreadPriority prior = ThreadPriority::normal, const tU16 stackDepth = static_cast<tU16>(StackDepth::minimal)) ; static void Start() ; static void HandleSvcInterrupt() ; static void HandleSvInterrupt() ; static void HandleSysTickInterrupt() ; friend void wCreateThread(Thread &, const char *, ThreadPriority, const tU16, tStack *); friend class Thread ; private: //cstat !MISRAC++2008-7-1-2 To prevent reinterpet_cast in the CreateTask static void Run(void *pContext ) { static_cast<Thread*>(pContext)->Run() ; } } ; } ; #endif // __RTOS_HPP 



рдШрдЯрдирд╛рдУрдВ


, , , , , , . , .

, , , , , , , . , . , , , , .



:

 OsWrapper::Event event{10000ms, 3}; //  ,    10000ms,    0    1. void SomeTask::Execute() { while(true) { using OsWrapper::operator""ms ; Sleep(1000ms); event.Signal() ; //      0   1. Sleep(1000ms); event.SetMaskBits(4) //    2. event.Signal() ; //      2. } } ; void AnotherTask::Execute() { while(true) { using namespace::OsWrapper ; //,      ,    10000ms if ((event.Wait() & defaultTaskMaskBits) != 0) { GPIOC->ODR ^= (1 << 5) ; } } } ; 


,


, , : GitHub OsWrapper . , :
 OsWrapper::MailBox<tU32, 10> queue; //    10   int void ReceiveTask::Execute() { tU32 item; while(true) { using OsWrapper::operator""ms ; if (queue.Get(item, 10000ms)) { //    GPIOC->ODR ^= (1 << 9); } } } ; void SendTask::Execute() { tU32 item = 0U; while(true) { queue.Put(item); item ++; SleepUntil(1000ms); } } ; 



, , , : LedTask , 2 , 2 myTask , 10 , , . 2 . , event . , :)

 using OsWrapper::operator""ms ; OsWrapper::Event event{10000ms, 1}; class MyTask : public OsWrapper::Thread { public: virtual void Execute() override { while(true) { if (event.Wait() != 0) { GPIOC->ODR ^= (1 << 9); } } } using tMyTaskStack = std::array<OsWrapper::tStack, static_cast<tU16>(OsWrapper::StackDepth::minimal)> ; inline static tMyTaskStack Stack; //C++17   IAR 8.30 } ; class LedTask : public OsWrapper::Thread { public: virtual void Execute() override { while(true) { GPIOC->ODR ^= (1 << 5) ; using OsWrapper::operator""ms ; SleepUntil(2000ms); event.Signal() ; } } using tLedStack = std::array<OsWrapper::tStack, static_cast<tU16>(OsWrapper::StackDepth::minimal)> ; inline static tLedStack Stack; //C++17   IAR 8.30 } ; MyTask myTask; LedTask ledTask; int main() { using namespace OsWrapper ; Rtos::CreateThread(myTask, MyTask::Stack.data(), "myTask", ThreadPriority::lowest, MyTask::Stack.size()) ; Rtos::CreateThread(ledTask, LedTask::Stack.data()) ; Rtos::Start(); return 0; } 


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


. , ++ ++ . ++.
, ++, , , , , , , . , .

, , ++ :)

Clion . , , IAR toolchain, , , elf , hex , , GDB. тАФ , , , 2 , , , , . , Clion. , IAR toolchain , .

IAR 8.30.1, . : XNUCLEO-F411RE , ST-Link. , , Clion тАФ , :)

рдЫрд╡рд┐

IAR : IAR 8.30.1 , , github, , , FreeRtos.

ZY GitHub

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


All Articles