ROM рдФрд░ рд╕реНрдерд┐рд░ рдЪрд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рд╕рд┐рдВрдЧрд▓рдЯрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд░реНрдЯреЗрдХреНрд╕ M4 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++)

рдЫрд╡рд┐

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдХреЙрд░реНрдЯреЗрдХреНрд╕рдПрдо рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ C ++ IAR рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдкрд░ рдЖрдкрдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, ROM рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП, рдЗрд╕ рд╕рд╡рд╛рд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред рдЕрдм, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рд░реЛрдо рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреЗрд▓реЗ рдЬрдирд░реЗрдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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


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

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

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

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

рд░реИрдо рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд┐рдВрдЧрд▓рдЯрди


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

  • рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ
  • рдЕрдХреНрд╕рд░ рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрднреА рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реНрдерд╛рди рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

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

template <typename T> class Singleton { public: static T & GetInstance() { static T instance ; return instance ; } Singleton() = delete ; Singleton(const Singleton<T> &) = delete ; const Singleton<T> & operator=(const Singleton<T> &) = delete ; } ; 

рдпрд╣ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рд╛рд░рдВрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдмрд╛рд░ GetInstance() рдХрд╣рд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдорд╛рдирддреЗ рд╣реИрдВред

 int main() { //   Timer1      auto& objRef = Singleton<Timer1>::GetInstance(); //  ,      auto& objRef1 = Singleton<Timer1>::GetInstance(); return 0; } 

рдФрд░ рд╡рд┐рд▓рдореНрдм рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рдВрдЧрд▓рдЯрди:

 template <typename T> class Singleton { public: static constexpr T & GetInstance() { return instance ; } Singleton() = delete ; Singleton(const Singleton<T> &) = delete ; const Singleton<T> & operator=(const Singleton<T> &) = delete ; private: inline static T instance ; //      } ; 

рджреЛрдиреЛрдВ рд╕рд┐рдВрдЧрд▓рдЯрди рд░реИрдо рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреБрд░рд╛рдиреА рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ рдПрдХ рдПрд▓рдИрдбреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рддреЛ, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рд╡рд░реНрдЧ Led1 рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдХреНрд╖рд╛ Pin<PortA, 5> :

 using PortA = Port<GpioaBaseAddr> ; using Led1 = Pin<PortA, 5> ; using GreenLed = Pin<PortA, 5> ; Led1 myLed ; //        RAM constexpr GreenLed greenLed ; //        ROM int main() { static GreenLed myGreenLed ; //     RAM Led1 led1; //     myGreenLed.Toggle(); led1.Toggle() ; } 

рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЛрд░реНрдЯ рдФрд░ рдкрд┐рди рдХрдХреНрд╖рд╛рдПрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ
 constexpr std::uint32_t OdrAddrShift = 20U; template <std::uint32_t addr> struct Port { __forceinline inline static void Toggle(const std::uint8_t bit) { *reinterpret_cast<std::uint32_t*>(addr ) ^= (1 << bit) ; } }; template <typename T, std::uint8_t pinNum> class Pin { // Singleton   ,     friend class Singleton<Pin> ; public: __forceinline inline void Toggle() const { T::Toggle(pinNum) ; } //  = const Pin & operator=(const Pin &) = delete ; private: // ,      constexpr Pin() {} ; //  ,      //   ,      constexpr Pin(const Pin &) = default ; } ; 


рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ RAM рдФрд░ ROM рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА 4 рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреЛрд░реНрдЯ рдП рдХреЗ рд╕рдорд╛рди рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ:
рдЦреИрд░, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднреВрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ GreenLed рдФрд░ Led1 1 рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ рдФрд░ рдХрдИ рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрддреЛрдВ рдкрд░ рдЬрдЧрд╣ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдпрд╣ рднреА рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Led1 рдФрд░ GreenLed рдХреА рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдпрд╛ рдерд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рднреА рдмрдирд╛рдпрд╛ред

рджреВрд╕рд░рд╛, рдЖрдо рддреМрд░ рдкрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдирд╣реАрдВ рд╣реИ,

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

рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБрдПрдБ рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 using PortA = Port<GpioaBaseAddr> ; using Led1 = Pin<PortA, 5> ; using GreenLed = Pin<PortA, 5> ; int main() { //        GreenLed //   GreenLed& myGreenLed = Singleton<GreenLed>::GetInstance(); //            Led1& led1 = Singleton<Led1>::GetInstance(); myGreenLed.Toggle() ; led1.Toggle() ; //  , Singleton<Led1>::GetInstance().Toggle() } 

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

рд╕реНрдереИрддрд┐рдХ рд╡рд╕реНрддреБ


рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рдордЭрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХреНрдпрд╛ рд╣реИред

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

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

рд╕реНрдереИрддрд┐рдХ рднрдВрдбрд╛рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдЖрд░рдВрднреАрдХрд░рдг рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ рдЗрд╕рдХреЗ рдЖрд░рдВрдн рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрд░рдВрднреАрдХреГрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рдзрд╛рдЧрд╛ рджреВрд╕рд░реЗ рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рдЖрд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдШреЛрд╖рдгрд╛ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЖрд░рдВрдн рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

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

рдЗрд╕ рддрд░рд╣ рдХреА рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗрддреА рд╣реИрдВ рдХрд┐ рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рд░ рдЪрд░ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 struct Test1{ Test1(int value): j(value) {} int j; } ; Test1 &foo() { static Test1 test(10) ; return test; } int main() { for (int i = 0; i < 10; ++i) { foo().j ++; } return 0; } 

рдпрд╣рд╛рдВ, рдкрд╣рд▓реА рдмрд╛рд░ foo() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ test1 рдХреЛ рдЕрднреА рддрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ Test1(10) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рджреВрд╕рд░реЗ рдФрд░ рдмрд╛рдж рдХреЗ рдкрд╛рд╕ рдореЗрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╕реНрдЯреЗрдк рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред return test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдлреНрд▓реИрдЧ foo()::static guard for test 0x00100004 0x1 Data Lc main.o рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХреА рдкрд╣рд▓реА рдШреЛрд╖рдгрд╛ рдореЗрдВ, рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдзреНрд╡рдЬ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдЕрдЧрд▓реЗ рдкрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдзреНрд╡рдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЪреЗрдХ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



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

рдЫрд╡рд┐

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

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

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рджреБрд░реНрдШрдЯрдирд╛ рджреЗрдЦреЗрдВ
рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИрдВ: (1) рдХреНрд╖рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЙрддреНрдкрдиреНрди рдЕрд▓реНрдлрд╛ рдХрдг, (2) рдиреНрдпреВрдЯреНрд░реЙрди, (3) рд╡рд┐рджреНрдпреБрдд рдЪреБрдореНрдмрдХреАрдп рд╡рд┐рдХрд┐рд░рдг рдХрд╛ рдПрдХ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд, рдФрд░ (4) рдЖрдВрддрд░рд┐рдХ рдХреНрд░реЙрд╕рд╕реНрдЯреЙрдХред

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

рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рд░ рдЪрд░ рдХреЛ рдкрд╣рд▓реЗ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдЯреЗрдЯрд┐рдХ рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ, рд╕рд╛рде рд╣реА рд╕реНрдереИрддрд┐рдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░, рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрджреЗрд╢ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ
рдЕрдм рд╡рд╛рдкрд╕ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдкрд╛рд╕ред

рд╕рд┐рдВрдЧрд▓рдЯрди рд░реЛрдо рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЦрддрд╛ рд╣реИ


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

рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрджреНрднреБрдд рдкреНрд▓рд╕ рд╣реИ: рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░ GetInstance() рд╕рдордп рдкрд╣рд▓реА рдмрд╛рд░ GetInstance() рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкрд╣рд▓реЗ рддреАрди рдХрдорд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ

рд╡рд┐рд▓рдпрди рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рд▓рдореНрдм рдХреЗ рд╕рд┐рдВрдЧрд▓рдЯрди
 template<typename T, class Enable = void> class Singleton { public: Singleton(const Singleton&) = delete ; Singleton& operator = (const Singleton&) = delete ; Singleton() = delete ; static T& GetInstance() { return instance; } private: static T instance ; } ; template<typename T, class Enable> T Singleton<T,Enable>::instance ; 


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

рдЗрд╕ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдП рдФрд░ T рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ROM рдореЗрдВ static constexpr T instance рдмрдЬрд╛рдп static T instance рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ static constexpr T instance :

 template <typename T> class Singleton { public: static constexpr T & GetInstance() { return instance ; } Singleton() = delete ; Singleton(const Singleton<T> &) = delete ; const Singleton<T> & operator=(const Singleton<T> &) = delete ; private: // constexpr  constexpr   //           T static constexpr T instance{T()}; } ; template<typename T> constexpr T Singleton<T>::instance ; 

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ:

 class A { friend class Singleton<A>; public: const A & operator=(const A &) = delete ; int Get() const { return test2.Get(); } void Set(int v) const { test.SetB(v); } private: B& test; //    RAM const C& test2; //    ROM //      constexpr A(const A &) = default ; //     RAM  ROM,  Singleton constexpr A() : test(Singleton<B>::GetInstance()), test2(Singleton<C>::GetInstance()) { } }; int main() { //      ROM auto& myObject = Singleton<A>::GetInstance() ; //           myObject.Set(myObject.Get()) ; cout<<"Singleton<A> - address: "<< &myObject <<std::endl; } 

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

ROM рдФрд░ RAM рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛
 //    ,     ROM class RomObject{}; //  ROM  template<typename T> class Singleton<T, typename std::enable_if_t<std::is_base_of<RomObject, T>::value>> { public: Singleton(const Singleton&) = delete; Singleton& operator = (const Singleton&) = delete; Singleton() = delete; static constexpr const T& GetInstance() { return instance; } private: static constexpr T instance{T()}; }; template<typename T> constexpr T Singleton<T, typename std::enable_if_t<std::is_base_of<RomObject, T>::value>>::instance ; //  RAM  template<typename T, class Enable = void> class Singleton { public: Singleton(const Singleton&) = delete; Singleton& operator = (const Singleton&) = delete; Singleton() = delete; constexpr static T& GetInstance() { return instance; } private: static T instance ; }; template<typename T, class Enable> T Singleton<T,Enable>::instance ; 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 //      RAM,   SetB()    (j) class B { friend class Singleton<B>; public: const B & operator=(const B &) = delete ; void SetB(int value) { j = value ; } private: // ,        B(const B &) = default ; B() = default; int j = 0; } //      ROM class A: public RomObject{ friend class Singleton<A>; public: const A & operator=(const A &) = delete ; int Get() const { return test2.Get(); } //     B,    void Set(int v) const { test.SetB(v); } private: B& test; //    RAM const C& test2; //    ROM //        A(const A &) = default ; //     RAM  ROM,  Singleton constexpr A() : test(Singleton<B>::GetInstance()), test2(Singleton<C>::GetInstance()) { } }; int main() { //      ROM auto& romObject = Singleton<A>::GetInstance() ; //    B  RAM auto& ramObject = Singleton<B>::GetInstance() ; //           ramObject.SetB(romObject.Get()) ; cout<<"Singleton<A> - address: "<< &romObject <<std::endl; cout<<"Singleton<B> - address: "<< &ramObject <<std::endl; } 

рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд┐рдВрдЧрд▓рдЯрди рдЙрджрд╛рд╣рд░рдг


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

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

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрд▓рдИрдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рд░реЛрдо рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд░реИрдо рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рднреА рдирд╣реАрдВ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП RomObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рдЬреЛрдбрд╝ RomObject , рдПрдХ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЯрд╛рдЗрдорд░ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВред

рдПрд▓рдИрдбреА рд╡рд╕реНрддреБ
 //      class ITimerSubscriber { public: virtual void OnTimeOut() const = 0; } ; template <typename T, std::uint8_t pinNum> class Pin: public RomOject, public ITimerSubscriber { // Singleton   ,     friend class Singleton<Pin> ; public: __forceinline inline void Toggle() const { T::Toggle(pinNum) ; } //       __forceinline inline void OnTimeOut() const override { Toggle() ; } //  = const Pin & operator=(const Pin &) = delete ; private: // ,      constexpr Pin() = default ; Pin(const Pin &) = default ; } ; 

рд▓реЗрдХрд┐рди рдореИрдВ TIM_TypeDef рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ RAM рдореЗрдВ рдереЛрдбрд╝реА TIM_TypeDef рдХреЗ рд╕рд╛рде TIM_TypeDef рд╣реВрдВ, рдореИрдВ TIM_TypeDef рд╕рдВрд░рдЪрдирд╛, рдПрдХ рдЕрд╡рдзрд┐ рдФрд░ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ TIM_TypeDef , рдФрд░ рдореИрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реВрдВрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯрд╛рдЗрдорд░ рдХреЛ ROM рдкрд░ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛):

рдХрдХреНрд╖рд╛ рдЯрд╛рдЗрдорд░
 class Timer { public: const Timer & operator=(const Timer &) = delete ; void SetPeriod(const std::uint16_t value) { period = value ; timer.PSC = TimerClockSpeed / 1000U - 1U ; timer.ARR = value ; } //      __forceinline inline void OnInterrupt() { if ((timer.SR & TIM_SR_UIF) && (timer.DIER & TIM_DIER_UIE)) { //   ,     OnTimeOut //       Toggle() subscriber->OnTimeOut() ; timer.SR &=~ TIM_SR_UIF ; } } //    TimeOut  ,   ITimerSubscriber,   __forceinline inline void Subscribe(const ITimerSubscriber& obj) { subscriber = &obj ; } inline void Start() { timer.CR1 |= TIM_CR1_URS ; timer.DIER |= TIM_DIER_UIE ; SetPeriod(period) ; timer.CR1 &=~TIM_CR1_OPM ; timer.EGR |= TIM_EGR_UG ; timer.CR1 |= TIM_CR1_CEN ; } protected: // ,         explicit Timer(TIM_TypeDef& tim): timer{tim} {}; const ITimerSubscriber * subscriber = nullptr ; TIM_TypeDef& timer ; std::uint16_t period = 1000; } ; 


 //       class BlinkTimer: public Timer { friend class Singleton<BlinkTimer> ; public: const BlinkTimer & operator=(const BlinkTimer &) = delete ; private: BlinkTimer(const BlinkTimer &) = default ; inline BlinkTimer(): Timer{*TIM2} { } } ; int main() { BlinkTimer & blinker = Singleton<BlinkTimer>::GetInstance() ; using Led1 = Pin<PortA, 5> ; // Led1,   ROM,      blinker.Subscribe(Singleton<Led1>::GetInstance()) ; blinker.Start() ; } 

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

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

 extern "C" void __iar_program_start(void) ; class InterruptHandler { public: static void DummyHandler() { for(;;) {} } static void Timer2Handler() { //   BlinkTimer Singleton<BlinkTimer>::GetInstance().OnInterrupt(); } }; using tIntFunct = void(*)(); using tIntVectItem = union {tIntFunct __fun; void * __ptr;}; #pragma segment = "CSTACK" #pragma location = ".intvec" const tIntVectItem __vector_table[] = { { .__ptr = __sfe( "CSTACK" ) }, //    __iar_program_start, //      InterruptHandler::DummyHandler, InterruptHandler::DummyHandler, InterruptHandler::DummyHandler, InterruptHandler::DummyHandler, InterruptHandler::DummyHandler, 0, 0, 0, 0, InterruptHandler::DummyHandler, InterruptHandler::DummyHandler, 0, InterruptHandler::DummyHandler, InterruptHandler::DummyHandler, //External Interrupts InterruptHandler::DummyHandler, //Window Watchdog InterruptHandler::DummyHandler, //PVD through EXTI Line detect/EXTI16 .... InterruptHandler::Timer2Handler, //      BlinkTimer InterruptHandler::DummyHandler, //TIM3 ... InterruptHandler::DummyHandler, //SPI 5 global interrupt }; extern "C" void __cmain(void) ; extern "C" __weak void __iar_init_core(void) ; extern "C" __weak void __iar_init_vfp(void) ; #pragma required = __vector_table void __iar_program_start(void) { __iar_init_core() ; __iar_init_vfp() ; __cmain() ; } 

рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛, рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдкрд╛рд╡рд░-рдЕрдк рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдпрд╛ рдПрдХ рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж, рдПрдХ рд░реАрд╕реЗрдЯ рдирдВрдмрд░ -8 рдХреЗ рд╕рд╛рде рдмрд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдпрд╣ рд╢реВрдиреНрдп рддрддреНрд╡ рд╣реИ, рд░реАрд╕реЗрдЯ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реВрдиреНрдп рддрддреНрд╡ рд╡реЗрдХреНрдЯрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реВрдЪрдХ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ STACK рдЦрдВрдб рдХреЗ рд╕реНрдерд╛рди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдерд╛ред рдкреЙрдЗрдВрдЯрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдкрд░ рдЬрд╛рдПрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, __iar_program_start рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдкрд░ред рдЕрдЧрд▓рд╛, рдХреЛрдб рдХреЛ рдЖрдкрдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд┐рд░ рдЪрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдХреЛрдкрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЬрдм рдХреЛрдИ рд╡реНрдпрд╡рдзрд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реЛрдз рдирд┐рдпрдВрддреНрд░рдХ рд░реБрдХрд╛рд╡рдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрддреЗ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ InterruptHandler::Timer2Handler , рдЬреЛ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдорд╛рд░реЗ рдмреНрд▓рд┐рдВрдХ рдЯрд╛рдЗрдорд░ рдХреЗ OnInterrupt() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдкреЛрд░реНрдЯ рд▓реЗрдЧ рдХрд╛ OnTimeOut() рд╡рд┐рдзрд┐ OnTimeOut() ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдм рд╣реИ, рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред IAR 8.40 рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИ ред
ROM рдФрд░ RAM рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдВрдХ:


PS рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд┐рддреНрд░ рдореЗрдВ, рд╕рднреА рд╕рдорд╛рди, рд╕рд┐рдВрдЧрд▓рдЯрди ROM рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрд╣рд┐рд╕реНрдХреА рд╣реИред

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


All Articles