рдЖрдкрдХреЗ рдХреЙрдиреНрд╕реНрдЯреЗрдХреНрд╕ рдХреЙрд░реНрдЯреЗрдХреНрд╕рдПрдо рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ C ++ IAR рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

рдореИрдВ рдЕрдкрдиреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ STM32F411RE рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдмреЛрд░реНрдб рдкрд░ ROM рдХреЗ 512 kB рдФрд░ RAM рдХреЗ 128 kB рд╣реЛрддреЗ рд╣реИрдВ
рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░, ROM рдореЗрдореЛрд░реА рдХреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░реИрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд░реЛрдо рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред
STM32F411RE, ROM рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рдореЗрдореЛрд░реА 0x08000000 ... 0x0807FFFF , рдФрд░ RAM рдХреЗ рд╕рд╛рде 0x20000000 ... 0x2001FFFF рдХреЗ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ ред

рдФрд░ рдпрджрд┐ рд╕рднреА рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рд╣реА рд╣реИрдВ, рддреЛ рдЫрд╛рддреНрд░ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВ рдЙрд╕рдХрд╛ рдирд┐рд░рдВрддрд░ рд░реЙрдо рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ:

class WantToBeInROM { private: int i; public: WantToBeInROM(int value): i(value) {} int Get() const { return i; } }; const WantToBeInROM myConstInROM(10); int main() { std::cout << &myConstInROM << std::endl ; } 

рдЖрдк рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ROM рдпрд╛ RAM рдореЗрдВ рдирд┐рд░рдВрддрд░ MyConstIn рдХрд╣рд╛рдВ рд╣реИ?

рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ ROM рдореЗрдВ , рдореИрдВ рдЖрдкрдХреЛ рдмрдзрд╛рдИ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧрд▓рдд рд╣реИрдВ, рдирд┐рд░рдВрддрд░ рдЖрдо рддреМрд░ рдкрд░ RAM рдореЗрдВ рдЭреВрда рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ ROM рдореЗрдВ рдЖрдкрдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд╕рд╣реА рдФрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП - рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдкрд░реЗрд╢рд╛рди рдХреНрдпреЛрдВред
IEC 61508-3: 2010 рдпрд╛ GOST IEC 61508-3-2018 рдХреЗ рдШрд░реЗрд▓реВ рд╕рдордХрдХреНрд╖ рдХреЗ рдорд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп , рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

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

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

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

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

рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рднреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░ рдШреЛрд╖рд┐рдд, рдПрд▓рд╕реАрдбреА рдбреНрд░рд╛рдЗрд╡рд░, рдПрд╕рдкреАрдЖрдИ рдпрд╛ I2C рдХреА рдПрдХ рд╡рд╕реНрддреБ, рдЬрд┐рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рддрдХ рдХрд┐ рдмрд┐рдЬрд▓реА рдмрдВрдж рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА рддрдм рддрдХ рд╣рдЯрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ ROM рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдпрд╣ рд╕рдордп-рд╕рдордп рдкрд░ рдХреБрдЫ рдХрдо-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд░реАрдб-рдУрдирд▓реА рдореЗрдореЛрд░реА рдХреЗ рдЪреЗрдХрд╕рдо рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрджрд┐ рдЪреЗрдХрд╕рдо рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ ROM рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реВрдЪрдирд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдкреНрд░рдгрд╛рд▓реА рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧреАред

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

рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдирд┐рд░рдВрддрд░ рдбреЗрдЯрд╛ рд░реЛрдо рдореЗрдВ рд╣реИ ред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдЖрд░рдПрдо рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЗрдореЛрд░реА рд╕рдВрдЧрдарди


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

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

рдЗрд╕рд▓рд┐рдП, ROM (рдлреНрд▓реИрд╢) рдФрд░ RAM рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдЙрдиреНрд╣реЗрдВ рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IAR 8.40.1 рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; 

рдЗрд╕ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ RAM 0x20000000 ... 0x2001FFF, рдФрд░ ROM 0x008000000 ... 0x0807FFFF рдкрд░ рд╕реНрдерд┐рдд рд╣реИ ред
рдЖрдк рд░реИрдо рдПрдбреНрд░реЗрд╕ рдХреЛ рд╢реБрд░реБрдЖрддреА рдкрддрд╛ ROM_start рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, RAM_start рдФрд░ рдЕрдВрддрд┐рдо рдкрддреЗ ROM_end__ рдХреЛ RAM_end__ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ RAM рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред
рддреБрдо рднреА рд╡рд┐рдкрд░реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ROM рд╕реНрдореГрддрд┐ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реИрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрдХрдЯреНрдард╛ рдФрд░ рдлреНрд▓реИрд╢ рдХрд░реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ :)
рдХреБрдЫ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕, рдЬреИрд╕реЗ рдХрд┐ AVR, рдореЗрдВ рд╢реБрд░реВ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА, рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдФрд░ рдкреЗрд░рд┐рдлреЗрд░рд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдРрд╕реА рдЯреНрд░рд┐рдХ рд╡рд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ROM рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

CortexM рдореЗрдВ рд╕рднреА рдкрддрд╛ рд╕реНрдерд╛рди рдПрдХрд▓ рд╣реИ, рдФрд░ рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХрд╣реАрдВ рднреА рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ ROM рдФрд░ RAM рдкрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред IAR рд░реЛрдо рдХреНрд╖реЗрддреНрд░ рдореЗрдВ .text рдХреЛрдб рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ

рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕реЗрдЧрдореЗрдВрдЯ


рдКрдкрд░, рдореИрдВрдиреЗ рдХреЛрдб рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ:

  • рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдЧрдореЗрдВрдЯ
  • DWARF рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛
  • рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛

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

  • рдХреЛрдб - рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб
  • рдЖрд╕рд╛рдиреА рд╕реЗ - рд▓рдЧрд╛рддрд╛рд░ рдЪрд░
  • readwrite - рдЖрд░рдВрднрд┐рдХ рдЪрд░
  • рд╢реВрдиреНрдп-рд╢реВрдиреНрдп-рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░

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

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

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

  • .bss - 0 рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
  • .CSTACK - рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрдЯреИрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ
  • .data - рдЗрд╕рдореЗрдВ рд╕реНрдерд┐рд░ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд░рдВрднрд┐рдХ рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
  • .data_init - рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • HEAP - рдбрд╛рдпрдиреЗрдорд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╣реАрдк рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • .intvec - рдПрдХ рд░реБрдХрд╛рд╡рдЯ рд╡реЗрдХреНрдЯрд░ рддрд╛рд▓рд┐рдХрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ
  • .rodata - рдирд┐рд░рдВрддрд░ рдбреЗрдЯрд╛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • .text - рдЗрд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЦрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦреЗрдВрдЧреЗ
.rodata - рдПрдХ рдЦрдВрдб рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ,
.data - рдПрдХ рдЦрдВрдб рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ,
.bs - рдПрдХ рдЦрдВрдб рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕реНрдерд┐рд░ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ .data рдЪрд░ рд╢реВрдиреНрдп (0) рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ:
.text - рдХреЛрдб рд╕рдВрдЪрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрдВрдбред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╡реИрд░рд┐рдПрдмрд▓ int val = 3 рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЪрд░ рд╕реНрд╡рдпрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ .data рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ рдФрд░ рд░реАрдбрд░рд╛рдЗрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрдЧрд╛, рдФрд░ рдирдВрдмрд░ 3 рдХреЛ рдпрд╛ рддреЛ .text рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдпрд╛ .rodata рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ред .data_init рдореЗрдВ рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрджреЗрд╢ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

.рд░реЛрдбрд╛рдЯрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдирд┐рд░рдВрддрд░ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рд░рдВрддрд░ рдЪрд░, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рдХреБрд▓ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╣реАрдВ рднреА рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдХреНрдпреЛрдВ:

 place in ROM_region { readonly }; //   .rodata  .data_init (  )  ROM: place in RAM_region { readwrite, //   .data, .bss,  .noinit block STACK }; //  STACK  HEAP  RAM 

рдпрд╣реА рд╣реИ, рд░реАрдбрдСрдирд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ ROM_region рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдбреЗрдЯрд╛, рд▓реЗрдХрд┐рди рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд, ROM рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЦреИрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рд░реЛрдо рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ, рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХреНрдпрд╛ рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрднреА рднреА рд░реИрдо рдореЗрдВ рд╣реИ?
 class WantToBeInROM { private: int i; public: WantToBeInROM(int value): i(value) {} int Get() const { return i; } }; const WantToBeInROM myConstInROM(10); int main() { std::cout << &myConstInROM << std::endl ; } 



рд▓рдЧрд╛рддрд╛рд░ рдбреЗрдЯрд╛


рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐, рд╕реНрдерд╛рдиреАрдп рдЪрд░, рдЕрд░реНрдерд╛рддреН рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред "рд╕рд╛рдорд╛рдиреНрдп" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рдЪрд░ рд╕реНрдЯреИрдХ рдкрд░ рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдерд┐рд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рднреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

C ++ рдореЗрдВ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 void foo(const int& C1, const int& C2, const int& C3, const int& C4, const int& C5, const int& C6) { std::cout << C1 << C2 << C3 << C4 << C5 << C6 << std::endl; } //     constexpr int Case1 = 1 ; //  (      ) const int Case2 = 2; int main() { //  . const int Case3 = 3 ; // . static const int Case4 = 4 ; //      ,     . constexpr int Case5 = Case1 + 5 ; //     . static constexpr int Case6 = 6 ; foo(Case1,Case2,Case3,Case4,Case5,Case6); return 1; } 

рдпрд╣ рд╕рднреА рдирд┐рд░рдВрддрд░ рдбреЗрдЯрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдирд┐рд░реНрдорд╛рдг рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  • Case1 рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ ROM рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред .Rodata рдЦрдВрдб рдореЗрдВ
  • Case2 рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ ROM рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред .Rodata рдЦрдВрдб рдореЗрдВ
  • Case3 рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ RAM рдореЗрдВ рдЭреВрда рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕реНрдерд┐рд░ STACK рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)
  • Case4 рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ ROM рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред .Rodata рдЦрдВрдб рдореЗрдВ
  • Case5 рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рд░рд╛рдВрдХ RAM рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╕ 3 рдХреЗ рд╕рдорд╛рди рд╣реИ)
  • Case6 рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ ROM рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред .Rodata рдЦрдВрдб рдореЗрдВ

рдЕрдм рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЬреЗрдирд░реЗрдЯ рдореИрдк рдлрд╛рдЗрд▓ рдХреЛ рджреЗрдЦреЗрдВред рдбрд┐рдмрдЧрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреМрди рд╕реЗ рдкрддреЗ рдкрд░ рд╣реИрдВред

рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛, рдкрддреЗ 0x0800 ... рдпреЗ ROM рдкрддреЗ рд╣реИрдВ, рдФрд░ 0x200 ... рдпреЗ RAM рд╣реИрдВ ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдиреЗ рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХрд┐рд╕ рдЦрдВрдб рдореЗрдВ рдмрд╛рдВрдЯрд╛ рд╣реИ:

  .rodata const 0x800'4e2c 0x4 main.o //Case1 .rodata const 0x800'4e30 0x4 main.o //Case2 .rodata const 0x800'4e34 0x4 main.o //Case4 .rodata const 0x800'4e38 0x4 main.o //Case6 

рдЪрд╛рд░ рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдереИрддрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ .рд░реЛрдбрд╛рдЯрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдЧрд┐рд░ рдЧрдП, рдФрд░ рджреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореИрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рдЖрдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рдХреЗ рдкрддреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред CSTACK рдЦрдВрдб 0x2000'2488 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ 0x2000'0488 рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЪрд┐рддреНрд░ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред

рд╕рдВрдХрд▓рдХ рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ .rodata рдЦрдВрдб рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕реНрдерд╛рди рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ int i = 3 рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдиреЗ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рдЦрдВрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓рд┐рдВрдХрд░ рдиреЗ рдЗрд╕реЗ 0x20000000 рдкрд░ рд░рдЦрд╛ рд╣реИ:
.data inited 0x2000'0000 ,
рдФрд░ рдЗрд╕рдХрд╛ рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп (3) .xata рдЦрдВрдб рдореЗрдВ 0x8000190 рдкрддреЗ рдкрд░ рд╣реЛрдЧрд╛:
Initializer bytes const 0x800'0190
рдпрджрд┐ рдЖрдк рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 int i = 3; const int c = i; 

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

рдЕрдм рдЕрдЧрд░ рд╣рдо рд╡рд╛рдкрд╕ рдЕрдкрдиреЗ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг
 class WantToBeInROM { private: int i; public: WantToBeInROM(int value): i(value) {} int Get() const { return i; } }; const WantToBeInROM myConstInROM(10); int main() { std::cout << &myConstInROM << std::endl ; } 

рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ: рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рдирд┐рд░рдВрддрд░ рдСрдмреНрдЬреЗрдХреНрдЯ myConstInROM рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛? рдФрд░ рд╣рдореЗрдВ рдЙрддреНрддрд░ рдорд┐рд▓рддрд╛ рд╣реИ: рд╕реНрдерд┐рд░ .bs рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдЭреВрда рд╣реЛрдЧрд╛ , рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рд╢реВрдиреНрдп (0) рд╕реЗ рдЖрд░рдВрднрд┐рдХ рд╣реЛрдВрдЧреЗред
.bss inited 0x2000'0004 0x4
myConstInROM 0x2000'0004 0x4


рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ C ++ рдореЗрдВ, рдПрдХ рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд░реАрдб-рд░рд╛рдЗрдЯ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдбрд╛рдпрдиреЗрдорд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ, const WantToBeInROM myConstInROM(10) , рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗред рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╕рднреА рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реБрдП .bs рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд╛рд▓ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХрдВрдЯреЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рд╡реИрд▓реНрдпреВ 10 рдХреЗ i рдлреАрд▓реНрдб i рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрдкрдиреА рд╡рд╕реНрддреБ .rodata рдЦрдВрдб рдореЗрдВ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрдн рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

1. рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЗ IAR рдХреЗ рд▓рд┐рдП, рдЖрдк __ro_placement рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
__ro_placement const WantToBeInROM myConstInROM
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде, рдХрдВрдкрд╛рдЗрд▓рд░ рдЪрд░ рдХреЛ ROM рдореЗрдВ рдкрддреЗ рдкрд░ рд░рдЦреЗрдЧрд╛:
myConstInROM 0x800'0144 0x4 Data
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ :)

2. рдпрд╣ рдПрдХ constexpr рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рддреБрд░рдВрдд рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ, рдЬрдм рдкреВрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдЧрдгрдирд╛" рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВред

рдСрдмреНрдЬреЗрдХреНрдЯ рд░реЛрдо рдореЗрдВ рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ
 class WantToBeInROM { private: int i; public: constexpr WantToBeInROM(int value): i(value) {} int Get() const { return i; } }; const WantToBeInROM myConstInROM(10); int main() { std::cout << &myConstInROM << std::endl ; } 


рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреА рдирд┐рд░рдВрддрд░ рд╡рд╕реНрддреБ ROM рдореЗрдВ рд╣реИ, рдЖрдкрдХреЛ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. .Text рдЦрдВрдб рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ ROM рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. .Rodata рд╕реЗрдЧрдореЗрдВрдЯ рдЬрд┐рд╕рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ ROM рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рд▓рд┐рдВрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  3. рд╕реНрдерд┐рд░рд╛рдВрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдпрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  4. рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рд╡рд░реНрдЧ рдХреЗ рдЧреБрдг рдкрд░рд┐рд╡рд░реНрддрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП
  5. рд╡рд╕реНрддреБ рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдЬрд┐рд╕рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд┐рд░ рд╣реЛрдЧрд╛ рдЙрд╕реЗ рд╕реНрдереИрддрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЙрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХреЛрдИ рдЧрддрд┐рд╢реАрд▓ рдЖрд░рдВрднреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ)
  6. рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд╛рд╕реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп ROM рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдФрд░ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред Const рдФрд░ constexpr рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд░рдирд╡реЗ рддрдХ const рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╕рдВрдХрд▓рд┐рдд рдЪрд░ рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рднреА constexpr рдЪрд░ рдкреНрд░рдХрд╛рд░ const рдХреЗ рд╣реИрдВред

рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕рдкреНрд░ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
  • рдПрдХ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
     struct D2 : virtual BASE { //error, D2 must not have virtual base class. constexpr D2() : BASE(), mem(55) { } private: int mem; }; 
  • рдХрдХреНрд╖рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмреЙрдбреА рдХреЛ = delete рдпрд╛ = default рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рдиреАрдЪреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ:
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмреЙрдбреА рдореЗрдВ рдХреЛрдИ рднреА try catch рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИрдВред
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмреЙрдбреА nullptr рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмреЙрдбреА static_assert рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, typedef рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рдЧрдгрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  • рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдирд┐рдХрд╛рдп рдирд┐рд░реНрджреЗрд╢рди рдФрд░ рдШреЛрд╖рдгрд╛рдУрдВ using
  • рдХрд┐рд╕реА рд╡рд░реНрдЧ рдпрд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдп рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдПрдХ рд╡рд░реНрдЧ рдпрд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЬрд┐рд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рдм constexpr , рдХреЛ constexpr рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╕рднреА рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП constexpr рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП
  • рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, reinterpret_cast рдФрд░ void* рд╕реЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ void* рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рдирд┐рд╣рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред рдЕрдм рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЙрджрд╛рд╣рд░рдг 1. рд░реЛрдо рдореЗрдВ рд╡рд╕реНрддреБ
 class Test { private: int i; public: Test() {} ; int Get() const { return i + 1; } } ; const Test test; //  ROM.    . i  0  . int main() { std::cout << test.Get() << std::endl ; return 0; } 


рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╡рд┐рд╢реЗрд╖рддрд╛ i рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ RAM рдореЗрдВ рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛

рдЙрджрд╛рд╣рд░рдг 2. рд░реИрдо рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ
 class Test { private: int i = 1; // i.       constexpr . public: Test() {} ; //       ,       ,  constexpr int Get() const { return i + 1; } } ; const Test test; //  RAM. i     int main() { std::cout << test.Get() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 3. рд░реИрдо рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ
 class Test { private: int i; public: Test(int value): i(value) {} ; int Get() const { return i + 1; } } ; const Test test(10); //  RAM. i     int main() { std::cout << test.Get() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 4. рд░реЛрдо рдореЗрдВ рд╡рд╕реНрддреБ
 class Test { private: int i; public: constexpr Test(int value): i(value) {} ; int Get() const { return i + 1; } } ; const Test test(10); //  ROM. i     constexpr  int main() { std::cout << test.Get() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 5. рд░реИрдо рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ
 class Test { private: int i; public: constexpr Test(int value): i(value) {} ; int Get() const { return i + 1; } } ; int main() { const Test test(10); //  RAM.    std::cout << test.Get() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 6. рд░реЛрдо рдореЗрдВ рд╡рд╕реНрддреБ
 class Test { private: int i; public: constexpr Test(int value): i(value) {} ; int Get() const { return i + 1; } } ; int main() { static const Test test(10); //  ROM.    std::cout << test.Get() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 7. рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐
 class Test { private: int i; public: constexpr Test(int value): i(value) {} ; int Get() // Get  ,  ,       (i),     .   ,       . { return i + 1; } } ; const Test test(10); int main() { std::cout << test.Get() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 8. ROM рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ, рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА
 class ITest { private: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class Test: public ITest { private: int i; public: constexpr Test(int value): i(value), ITest(value+1) {} ; int Get() const override { return i + 1; } } ; const Test test(10); //  ROM. i     constexpr , j   constexpr  ITest int main() { std::cout << test.Give() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 9. ROM рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд░реИрдо рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИ
 class ITest { protected: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class TestImpl: public ITest { private: int k; public: TestImpl(int value): k(value), ITest(value) { } int Get() const override { return j + 10; } void Set(int value) { k = value; j = value + 10; } } ; TestImpl testImpl(1); //    RAM. class Test: public ITest { private: int i; TestImpl & obj; //    public: constexpr Test(int value, TestImpl & ref): i(value), obj(ref), ITest(value+1) { } ; int Get() const override { return i + 1; } bool Set() const { obj.Set(100) ; //     return true; } } ; constexpr Test test(10, testImpl); //  ROM.     constexpr  int main() { std::cout << test.Set() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 10. ROM рдореЗрдВ рд╕рдорд╛рди рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ
 class ITest { protected: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class TestImpl: public ITest { private: int k; public: TestImpl(int value): k(value), ITest(value) { } int Get() const override { return j + 10; } void Set(int value) { k = value; j = value + 10; } } ; class Test: public ITest { private: int i; TestImpl & obj; //    public: constexpr Test(int value, TestImpl & ref): i(value), obj(ref),ITest(value+1) { } ; int Get() const override { return i + 1; } bool Set() const { obj.Set(100) ; //     return true; } } ; int main() { static TestImpl testImpl(1); //  static constexpr Test test(10, testImpl); //    ROM.     constexpr  std::cout << test.Set() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 11. рдФрд░ рдЕрдм рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП RAM рдореЗрдВ рд╣реИ
 class ITest { protected: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class TestImpl: public ITest { private: int k; public: TestImpl(int value): k(value), ITest(value) { } int Get() const override { return j + 10; } void Set(int value) { k = value; j = value + 10; } } ; class Test: public ITest { private: int i; TestImpl & obj; //    public: constexpr Test(int value, TestImpl & ref): i(value), obj(ref),ITest(value+1) { } ; int Get() const override { return i + 1; } bool Set() const { obj.Set(100) ; //     return true; } } ; int main() { static TestImpl testImpl(1); //  const Test test(10, testImpl); //    RAM. std::cout << test.Set() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 12. рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ред
 class ITest { protected: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class TestImpl: public ITest { private: int k; public: TestImpl(int value): k(value), ITest(value) { } int Get() const override { return j + 10; } void Set(int value) { k = value; j = value + 10; } } ; class Test: public ITest { private: int i; TestImpl obj; //   TestImpl public: constexpr Test(int value): i(value), obj(TestImpl(value)), //   constexpr   TestImpl ITest(value+1) { } ; int Get() const { return i + 1; } bool Set() const { obj.Set(100) ; //     return true; } } ; int main() { static TestImpl testImpl(1); //  static const Test test(10); //   std::cout << test.Set() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 13. рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐
 class ITest { protected: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class TestImpl: public ITest { private: int k; public: constexpr TestImpl(int value): k(value), ITest(value) //   constexpr { } int Get() const override { return j + 10; } void Set(int value) //   ,  k  j.       ROM,        RAM { k = value; j = value + 10; } } ; class Test: public ITest { private: int i; TestImpl obj; public: constexpr Test(int value): i(value), obj(TestImpl(value)), // constexpr     obj,    obj  .rodata . ITest(value+1) { } ; int Get() const { return i + 1; } bool Set() const { obj.Set(100) ; //        constexpr     return true; } } ; int main() { static TestImpl testImpl(1); //  static const Test test(10); //   std::cout << test.Set() << std::endl ; return 0; } 



рдЙрджрд╛рд╣рд░рдг 14. рд░реЛрдо рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ
 class ITest { protected: int j; public: virtual int Get() const = 0; constexpr ITest(int value) : j(value) { } int Give() const { return j ; } }; class TestImpl: public ITest { private: int k; public: constexpr TestImpl(int value): k(value), ITest(value) { } int Get() const override { return j + 10; } void Set(int value) const //   const { //do something } } ; class Test: public ITest { private: int i; const TestImpl obj; // ,    constexpr  public: constexpr Test(int value): i(value), obj(TestImpl(value)), ITest(value+1) { } ; int Get() const { return i + 1; } bool Set() const { obj.Set(100) ; //   return true; } } ; int main() { //static TestImpl testImpl(1); //  static const Test test(10); //    ROM.     constexpr  std::cout << test.Set() << std::endl ; return 0; } 



рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рдгреА рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдпреБрдХреНрдд рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБред
 class Test { private: int k[100]; constexpr void InitArray() { int i = 0; for(auto& it: k) { it = i++ ; } } public: constexpr Test(): k() { InitArray(); // constexpr     } int Get(int index) const { return k[index]; } } ; int main() { static const Test test; //    ROM.     ,  constexpr . std::cout << test.Get(10) << std::endl ; return 0; } 


рд╕рдВрджрд░реНрдн:
IAR C / C ++ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЧрд╛рдЗрдб
рдХрд╛рдВрд╕реНрдЯреЗрдХреНрд╕ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ (C ++ 11)
рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ (C ++)

рдкреБрдирд╢реНрдЪред
Valdaros рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред C ++ рдорд╛рдирдХ рдФрд░ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░ N1076.pdf

1. рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ (рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА

  const int ci = 1 ; int* iptr = const_cast<int*>(&ci); //UB,       *iptr = 2 ; 

  int i = 1; const int* ci = &i ; int* iptr = const_cast<int *> (ci); //   *iptr = 2 ; // UB,   i 

2. рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдХреЗ рджреМрд░рд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдРрд╕рд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рд╡реИрдз рд╣реИ:

 class Test { public: int i; constexpr Test(): i(0) { foo(this) ; } } ; Test *test1; constexpr void foo(Test* value) { value->i = 1; //       0  1 test1 = value ; //           } const Test test; int main() { test1->i = 2; //          2. std::cout << &test << std::endl; } 

рдФрд░ рдЗрд╕реЗ рдХрд╛рдиреВрдиреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдордиреЗ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕рдореЗрдВ рдХреЙрдиреНрд╕рдЯреЗрдХреНрдк рдлрд╝рдВрдХреНрд╢рдиред рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реАрдзреЗ рд░реИрдо рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп const - constexpr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдЬреЛ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧреА рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

 class Test { public: int i; constexpr Test(): i(0) { foo(this) ; } } ; Test *test1; constexpr void foo(Test* value) { value->i = 1; //       0  1 test1 = value ; //           } constexpr Test test; // / Error[Pe2400]: calling the default constructor for "Test" does not produce a constant value main.cpp 151 int main() { test1->i = 2; //          2. std::cout << &test << std::endl; } 

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


All Articles