
рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп!
рдирдП рд╕рд╛рд▓ рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдкрд░, рдореИрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реЛрдВ рдкрд░ 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 {
рд╕рднреА рдирдордХ Publisher
рд╡рд░реНрдЧ рдХреА Notify()
рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕реВрдЪреА рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ HandleEvent()
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╕рдм рдЖрдкрдХрд╛ рджрд┐рд▓ рдЬреЛ рднреА рдЪрд╛рд╣рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рд╢реИрддрд╛рди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЙрд╕рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реБрдХрд╛рд╡рдЯ рд╕реЗ рдФрд░ рдЖрдкрдХреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд▓рдВрдмреА рдФрд░ рдмреБрд░реА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддрд░реНрдХ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓рдИрдбреА рдХреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХрд╛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ:
template <typename Port, std::uint32_t pinNum> struct Led: ISubscriber { static void Toggle() { Port::ODR::Toggle(1 << pinNum); } void HandleEvent() override {
рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди template<typename Port, std::size_t pinNum> struct Button { static bool IsPressed() { bool result = false; if ((Port::IDR::Read() & (1 << pinNum)) == 0)
рдХреЛрдб рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ? рдФрд░ рдЗрд╕рд▓рд┐рдП:
int main() {
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдордп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ, рд╕реНрдерд┐рд░ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рд╣рдореЗрдВ рдЗрд╕ рдХреЛрдб рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдкрддрд╛ Led1
, Led2
, Led3
рдХреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд░реЛрдо рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЬреЛрдЦрд┐рдо рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрдИ рдереНрд░реЗрдб рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ Subsribe()
рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдХрд┐рддрдиреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдВрдЧреЗ? рд╣рдо рдХреЗрд╡рд▓ 3 рдЧреНрд░рд╛рд╣рдХреЛрдВ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рд╣рдо 4 рдПрд▓рдИрдбреА рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдЖрд░рдВрдн рдореЗрдВ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЗрд╕ рд╕рджрд╕реНрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ рд╣реИред рдкреЙрдЗрдВрдЯрд░ рдЗрди рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕ рдХрд╛ рдкрддрд╛ рдЬреАрд╡рди рднрд░ рдХреЗ рд▓рд┐рдП рд░рдЦреЗрдЧрд╛ред рдФрд░ рд╡рд╣ рджрд┐рди рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ рдЬрдм рдЗрд╕реЗ рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╕реБрдкрд░рдиреЛрд╡рд╛ рдкреНрд░рдХреЛрдк рдХреЗ рдХрд╛рд░рдг (рдмреЗрд╢рдХ, рдЕрдЧрд░ рд╣рдо рд╕рдордп рдХреА рдПрдХ рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реИрдо рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░реЙрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рд░реИрдо рдореЗрдВ рд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред
рдЦреИрд░, рдмреБрд░реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╕рдорд╛рдзрд╛рди рд░реЛрдо рдФрд░ рд░реИрдо рджреЛрдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд┐рддрдиреЗ ROM рдФрд░ RAM рд▓реЗрддрд╛ рд╣реИ:
рдпрд╛рдиреА 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)
рдЕрдм рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
int main() {
рдпрд╣рд╛рдВ, buttonController
рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ ROM рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде:
рдореБрдЦреНрдп :: рдмрдЯрдирдХрдВрдЯреНрд░реЛрд▓рд░ 0x800'1f04 0x10 рдбреЗрдЯрд╛ main.o [1]
рд╕рдм рдХреБрдЫ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреЗрд╡рд▓ 3 рдЧреНрд░рд╛рд╣рдХреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдФрд░ рдкреНрд░рдХрд╛рд╢рдХ рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдПрдХ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ ROM рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреНрдЮрд╛рдд рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ, рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдлрд┐рд░ рд╕реЗ рд░реИрдо рдкрд░ рдЬрд╛рдПрдЧреАред
рдЕрдиреНрдп рдХрдорд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ - рдЪреВрдВрдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдмрд┐рдЯ рд╕реЗ рдмрд┐рдЯ рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╕рдВрд╕рд╛рдзрди рд╕рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдирдВрдд рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЗрд╕ рдкрд░ рд╣рдереМрдбрд╝рд╛ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдмрдбрд╝рд╛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд▓реЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рдЗрдЯ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рд╕реИрдХрдбрд╝реЛрдВ рднреМрддрд┐рдХ рд╕реИрдХрдбрд╝реЛрдВ рд╕реЗрдВрд╕рд░реЛрдВ рдЬреИрд╕реЗ рд╡рд┐рдирд┐рд░реНрдорд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рдХреИрд╕реА рд╣реИрдВ:
рдФрд░ рдпрджреНрдпрдкрд┐ рдкрд░рд┐рдгрд╛рдо "рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ" рд╣реИ: рдХреБрд▓ рд░реИрдо рдХреА рдЦрдкрдд 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() {
рд╣рдорд╛рд░рд╛ рдХрд╛рдо рджреЛ рд╡рд╕реНрддреБрдУрдВ рдкреНрд░рдХрд╛рд╢рдХ ( 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)
Notify()
рдХреЙрд▓ Run()
рд╡рд┐рдзрд┐ рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЙрд▓ рдореЗрдВ рдкрддрд┐рдд рд╣реИ
Led1.HandleEvent() ; Led2.HandleEvent() ; Led3.HandleEvent() ;
рдпрд╣рд╛рдБ рд╕реНрдореГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
ROM рдХреБрд▓ 190 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ 0 рдмрд╛рдЗрдЯреНрд╕ RAMред рдЕрдм рдЖрджреЗрд╢, рдпрд╣ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 3 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдкрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢рд░реНрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ
рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ- рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
- рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрдо рд╕реЗ рдХрдо рдХрд░реЗрдВ
- рд╣рдо рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдХрд┐рд╕реА рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдмрджрд▓ рди рд╕рдХреЗ
- рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣рдо рд░реИрдо рдореЗрдВ рд╕реНрдерд┐рдд рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде, рдЖрдк рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рдХ-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рди рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрд╣рд╛рд░ рдХрд╛рд░реНрдб рдХрд╛ рджрд╛рд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡рд░реНрд╖ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдмреЛрдирд╕ рднреАред
IAR 8.40.2 рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЖрдиреЗ рдХреЗ рд╕рд╛рде рд╕рднреА! рдФрд░ рдирдП рд╕рд╛рд▓ рдореЗрдВ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!