C ++ рдФрд░ Cortex M4 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬрд░реНрд╡рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпрддрд╛


рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп!


рдирдП рд╕рд╛рд▓ рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдкрд░, рдореИрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реЛрдВ рдкрд░ C ++ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдСрдмреНрдЬрд░реНрд╡рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ (рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рдХ-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд╛рдХреНрдп) рдХреЗ рд╕рд╛рде-рд╕рд╛рде C рдкрд░ рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред ++ 17 рдФрд░ рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЗред


рдкрд░рд┐рдЪрдп


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


рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЗ рдЬреНрдЮрд╛рди рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрдВрдзреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдХрд┐рд╕реА рдХреЛ рднреА рдХрд┐рд╕реА рдкрд░ рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЗрдВ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВ, рд╣рдо рдкрд╣рд▓реЗ рдпрд╣ рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


  • рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
  • рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрдо рд╕реЗ рдХрдо рдХрд░реЗрдВ
  • рд╣рдо рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдХрд┐рд╕реА рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдмрджрд▓ рди рд╕рдХреЗ
  • рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣рдо рд░реИрдо рдореЗрдВ рд╕реНрдерд┐рдд рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

рдЕрдм рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВред


рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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


рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдмрдЯрди рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрд▓рдИрдбреА рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдПрд▓рдИрдбреА рджрдмрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдкрд░реАрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпреВрдПрдордПрд▓ рдореЗрдВ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ ...



рдпрд╣рд╛рдВ ButtonController рд╡рд░реНрдЧ рдмрдЯрди рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Led рдЧреНрд░рд╛рд╣рдХ рд╣реИред рдЗрди рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдХреЛ IPublisher рдФрд░ ISubsriber рдорд╛рдзреНрдпрдо рд╕реЗ IPublisher ISubsriber рдФрд░ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, ISubscriber рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХреЛрдИ рднреА рд╡рд╕реНрддреБ ButtonController рдПрдХ рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреА рд╣реИред


рдЪреВрдВрдХрд┐ рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП 3 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдШреЛрд╖рд┐рдд рдХреАред рдпрд╛рдиреА рдЕрдзрд┐рдХрддрдо 3 рдЧреНрд░рд╛рд╣рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, ButttonsController рд╡рд░реНрдЧ рдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ ButttonsController рд╕рдХрддреА рд╣реИ


 struct ButtonController : IPublisher { void Run() { for(;;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const override { //          HandleEvent() for(auto it: pSubscribers) { if (it != nullptr) { it->HandleEvent() ; } } } } ; 

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


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓рдИрдбреА рдХреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХрд╛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ:


 template <typename Port, std::uint32_t pinNum> struct Led: ISubscriber { static void Toggle() { Port::ODR::Toggle(1 << pinNum); } void HandleEvent() override { //  ,    ,  Toggle() ; } }; 

рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 template<typename Port, std::size_t pinNum> struct Button { static bool IsPressed() { bool result = false; if ((Port::IDR::Read() & (1 << pinNum)) == 0) //   { while ((Port::IDR::Read() & (1 << pinNum)) == 0) //     { }; result = true; } return result; } } ; //     GPIOC.13 using UserButton = Button<GPIOC, 13> ; struct ISubscriber { virtual void HandleEvent() = 0; } ; struct IPublisher { virtual void Notify() const = 0; virtual void Subscribe(ISubscriber* subscriber) = 0; } ; template <typename Port, std::uint32_t pinNum> struct Led: ISubscriber { static void Toggle() { Port::ODR::Toggle(1 << pinNum); } void HandleEvent() override { Toggle() ; } }; struct ButtonController : IPublisher { void Run() { for(; ;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const override { for(auto it: pSubscribers) { if (it != nullptr) { it->HandleEvent() ; } } } void Subscribe(ISubscriber* subscriber) override { if (index < pSubscribers.size()) { pSubscribers[index] = subscriber ; index ++ ; } //   3   ...   } private: std::array<ISubscriber*, 3> pSubscribers ; std::size_t index = 0U ; } ; 

рдХреЛрдб рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ? рдФрд░ рдЗрд╕рд▓рд┐рдП:


 int main() { //  Led1    5  GPIOC static Led<GPIOC,5> Led1 ; //  Led2    8  GPIOC static Led<GPIOC,8> Led2 ; //  Led3    9  GPIOC static Led<GPIOC,9> Led3 ; ButtonController buttonController ; //  3  buttonController.Subscribe(&Led1) ; buttonController.Subscribe(&Led2) ; buttonController.Subscribe(&Led3) ; //       buttonController.Run() ; } 

рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдордп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ, рд╕реНрдерд┐рд░ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рд╣рдореЗрдВ рдЗрд╕ рдХреЛрдб рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдкрддрд╛ Led1 , Led2 , Led3 рдХреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд░реЛрдо рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?


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


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


рдЦреИрд░, рдмреБрд░реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╕рдорд╛рдзрд╛рди рд░реЛрдо рдФрд░ рд░реИрдо рджреЛрдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд┐рддрдиреЗ ROM рдФрд░ RAM рд▓реЗрддрд╛ рд╣реИ:


рдореЙрдбреНрдпреВрд▓рдЖрд░рдУ рдХреЛрдбрдЖрд░рдУ рдбреЗрдЯрд╛рдЖрд░рдбрдмреНрд▓реНрдпреВ рдбреЗрдЯрд╛
main.o4886421

рдпрд╛рдиреА ROM рдореЗрдВ рдХреБрд▓ 552 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ RAM рдореЗрдВ 21 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ - рдПрдХ рдмрдЯрди рджрдмрд╛рдиреЗ рдФрд░ рддреАрди рдПрд▓рдИрдбреА рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВред


рдЦреИрд░, рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпрддрд╛


рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдирд╛рдо рджреВрдВрдЧрд╛:


  • рдкрд╛рд░рдВрдкрд░рд┐рдХ рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗрдЯ рдХрд░рдирд╛ред
  • рдЕрдкрд░рдВрдкрд░рд╛рдЧрдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ред (рдпрд╣рд╛рдВ, рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рди рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди)

рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдЖрдЗрдП рд╕рдВрдХрд▓рди рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдЫреЛрдЯрд╛ рдХрд░рддреЗ рд╣реИрдВ:



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


 struct ButtonController : IPublisher { template<typename... Args> constexpr ButtonController(Args const*... args): pSubscribers() { std::initializer_list<ISubscriber const*> result = {args...} ; std::size_t index = 0U; for(auto it: result) { if (index < size) { pSubscribers[index] = const_cast<ISubscriber*>(it); } index ++ ; } } private: static constexpr std::size_t size = 3U; ISubscriber* pSubscribers[size] ; } ; 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдХреЛрдб
 struct ISubscriber { virtual void HandleEvent() const = 0; } ; struct IPublisher { virtual void Notify() const = 0; } ; template<typename Port, std::size_t pinNum> struct Button { static bool IsPressed() { bool result = false; if ((Port::IDR::Read() & (1 << pinNum)) == 0) //   { while ((Port::IDR::Read() & (1 << pinNum)) == 0) //     { }; result = true; } return result; } } ; template <typename Port, std::uint32_t pinNum> struct Led: ISubscriber { constexpr Led() { } static void Toggle() { Port::ODR::Toggle(1<<pinNum); } void HandleEvent() const override { Toggle() ; } }; //     GPIOC.13 using UserButton = Button<GPIOC, 13> ; struct ButtonController : IPublisher { template<typename... Args> constexpr ButtonController(Args const*... args): pSubscribers() { std::initializer_list<ISubscriber const*> result = {args...} ; std::size_t index = 0U; for(auto it: result) { if (index < size) { pSubscribers[index] = const_cast<ISubscriber*>(it); } index ++ ; } } void Run() const { for(; ;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const override { for(auto it: pSubscribers) { if (it != nullptr) { it->HandleEvent() ; } } } private: static constexpr std::size_t size = 3U; ISubscriber* pSubscribers[size] ; } ; 

рдЕрдм рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 int main() { //  Led1    5  GPIOC static constexpr Led<GPIOC,5> Led1 ; //  Led2    8  GPIOC static constexpr Led<GPIOC,8> Led2 ; //  Led3    9  GPIOC static constexpr Led<GPIOC,9> Led3 ; static constexpr ButtonController buttonController(&Led1, &Led2, &Led3) ; buttonController.Run() ; return 0 ; } ; 

рдпрд╣рд╛рдВ, buttonController рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ ROM рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде:


рдореБрдЦреНрдп :: рдмрдЯрдирдХрдВрдЯреНрд░реЛрд▓рд░ 0x800'1f04 0x10 рдбреЗрдЯрд╛ main.o [1]

рд╕рдм рдХреБрдЫ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреЗрд╡рд▓ 3 рдЧреНрд░рд╛рд╣рдХреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдФрд░ рдкреНрд░рдХрд╛рд╢рдХ рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдПрдХ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ ROM рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреНрдЮрд╛рдд рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ, рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдлрд┐рд░ рд╕реЗ рд░реИрдо рдкрд░ рдЬрд╛рдПрдЧреАред


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


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рдХреИрд╕реА рд╣реИрдВ:


рдореЙрдбреНрдпреВрд▓рдЖрд░рдУ рдХреЛрдбрдЖрд░рдУ рдбреЗрдЯрд╛рдЖрд░рдбрдмреНрд▓реНрдпреВ рдбреЗрдЯрд╛
main.o172760

рдФрд░ рдпрджреНрдпрдкрд┐ рдкрд░рд┐рдгрд╛рдо "рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ" рд╣реИ: рдХреБрд▓ рд░реИрдо рдХреА рдЦрдкрдд 0 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдФрд░ ROM 248 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЖрдзреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╣реИ, рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред рдЗрди 248 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 50 рд╕рд┐рд░реНрдл рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдердб рдЯреЗрдмрд▓ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреА рд╣реИрдВред


рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░:
рдЖрдзреБрдирд┐рдХ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП 256 kB рдХреЗ ROM рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░рдг рдЖрджрд░реНрд╢ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TI рдХреЙрд░реНрдЯреЗрдХреНрд╕ M4 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ 256 kB рдХрд╛ ROM рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 512 kB рд╣реИ)ред рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрдм 50 рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ 256 kByte ROM рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдЬрд┐рддрдирд╛ рдХрд┐ 50 рд╕реЗрдВрдЯ (256 рдФрд░ 512 kBytes ROM рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдЯреНрд░реЙрд▓рд░ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ 50-60 рд╕реЗрдВрдЯ)ред


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


рдЕрдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдФрд░ рд░реЙрдо рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 int main() { //  Led1    5  GPIOC static Led<GPIOC,5> Led1 ; //  Led2    8  GPIOC static Led<GPIOC,8> Led2 ; //  Led3    9  GPIOC static Led<GPIOC,9> Led3 ; //   ButtonController<Led1, Led2, Led3> buttonController ; buttonController.Run() ; return 0 ; } 

рд╣рдорд╛рд░рд╛ рдХрд╛рдо рджреЛ рд╡рд╕реНрддреБрдУрдВ рдкреНрд░рдХрд╛рд╢рдХ ( ButtonController ) рдФрд░ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ ( Led ) рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рди рдЬрд╛рдиреЗрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА ButtonController Led рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХреЗред


рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ ButtonController рдХреНрд▓рд╛рд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 template <Led<GPIOC,5>& subscriber1, Led<GPIOC,8>& subscriber2, Led<GPIOC,9>& subscriber3> struct ButtonController { void Run() const { for(; ;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const { subscriber1.HandleEvent() ; subscriber2.HandleEvent() ; subscriber3.HandleEvent() ; } ... } ; 

рд▓реЗрдХрд┐рди рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ BbuttonController рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА ButtonController рдмрд╕ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ ButtonController рдХреЛ рд▓реЗрдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред


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


 template <auto& ... subscribers> struct ButtonController { void Run() const { for(; ;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const { pass((subscribers.HandleEvent() , true)...) ; } ... } ; 

рдХреИрд╕реЗ рдкрд╛рд╕ (..) рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

Notify() рд╡рд┐рдзрд┐ рдореЗрдВ pass() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИ; рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


  void Notify() const { pass((subscribers.HandleEvent() , true)...) ; } 

pass() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдЕрдХрд▓реНрдкрдиреАрдп рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ:


 template<typename... Args> void pass(Args...) const { } } ; 

рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП HandleEvent() рдлрд╝рдВрдХреНрд╢рди рдХрдИ рдХреЙрд▓ рдореЗрдВ рдХреИрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ?


рдЪреВрдВрдХрд┐ pass() рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рддрд░реНрдХреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк bool рдХрдИ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк pass(true, true, true) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред


рд▓рд╛рдЗрди (subscribers.HandleEvent() , true) рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ "," (рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо), рдЬреЛ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб (рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рдпрд╣рд╛рдВ subscribers.HandleEvent() ред subscribers.HandleEvent() рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП true рд╣реЛрдЧрд╛ред pass() true рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдареАрдХ рд╣реИ, "..." рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╣реБрдд рд╣реА рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 pass((subscribers.HandleEvent() , true)...) ; -> pass((Led1.HandleEvent() , true), (Led2.HandleEvent() , true), (Led3.HandleEvent() , true)) ; -> Led1.HandleEvent() ; -> pass(true, (Led2.HandleEvent() , true), (Led3.HandleEvent() , true)) ; -> Led2.HandleEvent() ; -> pass(true, true, (Led3.HandleEvent() , true)) ; -> Led3.HandleEvent() ; -> pass(true, true, true) ; 

рд▓рд┐рдВрдХ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 template <auto* ... subscribers> struct ButtonController { ... } ; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рдореАрд░рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдпреЗ рд╕рднреА рдиреГрддреНрдп рд╕рд╛рде рд╣реИрдВ рдбрдл C ++ 17 рдореЗрдВ pass рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдСрдкрд░реЗрдЯрд░ "," рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЛ рдЧреБрдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИ (рдЬреЛ C ++ 17 рдорд╛рдирдХ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 template <auto& ... subscribers> struct ButtonController { void Run() const { for(; ;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const { ((subscribers.HandleEvent()), ...) ; } } ; 

рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ:



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


рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рднреА рдХреЛрдб рднреА рдЕрдм рдЖрд╕рд╛рди рд╣реИ:


 template<typename Port, std::size_t pinNum> struct Button { static bool IsPressed() { bool result = false; if ((Port::IDR::Read() & (1 << pinNum)) == 0) //   { while ((Port::IDR::Read() & (1 << pinNum)) == 0) //     { }; result = true; } return result; } } ; //     GPIOC.13 using UserButton = Button<GPIOC, 13> ; template <typename Port, std::uint32_t pinNum> struct Led { static void Toggle() { Port::ODR::Toggle(1<<pinNum); } void HandleEvent() const { Toggle() ; } }; template <auto& ... subscribers> struct ButtonController { void Run() const { for(; ;) { if (UserButton::IsPressed()) { Notify() ; } } } void Notify() const { ((subscribers.HandleEvent()), ...) ; } } ; int main() { //  Led1    5  GPIOC static constexpr Led<GPIOC,5> Led1 ; //  Led2    8  GPIOC static constexpr Led<GPIOC,8> Led2 ; //  Led3    9  GPIOC static constexpr Led<GPIOC,9> Led3 ; static constexpr ButtonController<Led1, Led2, Led3> buttonController ; buttonController.Run() ; return 0 ; } 

Notify() рдХреЙрд▓ Run() рд╡рд┐рдзрд┐ рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЙрд▓ рдореЗрдВ рдкрддрд┐рдд рд╣реИ


 Led1.HandleEvent() ; Led2.HandleEvent() ; Led3.HandleEvent() ; 

рдпрд╣рд╛рдБ рд╕реНрдореГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рдореЙрдбреНрдпреВрд▓рдЖрд░рдУ рдХреЛрдбрдЖрд░рдУ рдбреЗрдЯрд╛рдЖрд░рдбрдмреНрд▓реНрдпреВ рдбреЗрдЯрд╛
main.o18640

ROM рдХреБрд▓ 190 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ 0 рдмрд╛рдЗрдЯреНрд╕ RAMред рдЕрдм рдЖрджреЗрд╢, рдпрд╣ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 3 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред


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


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

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


IAR 8.40.2 рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


рдЖрдиреЗ рдХреЗ рд╕рд╛рде рд╕рднреА! рдФрд░ рдирдП рд╕рд╛рд▓ рдореЗрдВ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!

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


All Articles