рдмреИрд╕рд╛рдЦреА рд╕реЗ рдмреБрд░рд╛ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдХреЗрд╡рд▓ рдЕрдзреВрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмреИрд╕рд╛рдЦреАред

рдпрд╣рд╛рдБ 8-рдмрд┐рдЯ AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕, Atmel Studio 7, C рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдХреАрдХреГрдд рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдорд╛рди рд╕реНрддрдВрдн рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд░ my_array рдореЗрдВ 0x8089 рдирдВрдмрд░ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, my_array рд╕рд░рдгреА 0x8089 рдкрддреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
рдЙрд╕реА рд╕рдордп, рдЯрд╛рдЗрдк рдХреЙрд▓рдо рд╣рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ: my_array, ROM рдореЗрдВ рд╕реНрдерд┐рдд int16_t рдкреНрд░рдХрд╛рд░ рдХреЗ 4 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ (рдпрд╣ рд░реИрдо рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╢рдмреНрдж рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ), рдкрддрд╛ 0x18089 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдмрдВрдж рдХрд░реЛ, рд▓реЗрдХрд┐рди рд╕рднреА рдХреЗ рдмрд╛рдж 0x8089! = 0x18089ред рд╕рд░рдгреА рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддрд╛ рдХреНрдпрд╛ рд╣реИ?
рд╕реА рднрд╛рд╖рд╛ рдФрд░ рд╣рд╛рд░реНрд╡рд░реНрдб рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
8-рдмрд┐рдЯ AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░, рдЬреЛ рдкрд╣рд▓реЗ Atmel рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рд╣реИ, рдФрд░ рдЕрдм рдорд╛рдЗрдХреНрд░реЛрдЪрд┐рдк рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╡реЗ рд╣рд╛рд░реНрд╡рд░реНрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд░реНрдорд┐рдд Arduino рдХреЗ рдЖрдзрд╛рд░ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреЛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ: рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рд╕реАред рдкрд╣рд▓реЗ, рдирд┐рд░реНрдорд╛рддрд╛ рдиреЗ рдПрдХ рдирд┐рд╢реБрд▓реНрдХ рдПрдХреАрдХреГрдд рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬреЛ рдХреЗрд╡рд▓ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рд╕реА, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реА ++ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдереЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IAR AVR рдФрд░ CodeVisionAVRред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВрдиреЗ 2008 рдореЗрдВ AVR рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХреА рдереА, рддреЛ AVR рд╕реНрдЯреВрдбрд┐рдпреЛ 4 рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрдлреНрдд WinAVR рдерд╛, рдФрд░ рдпрд╣ рдмрд╕ рд╡рд░реНрддрдорд╛рди Atmel рд╕реНрдЯреВрдбрд┐рдпреЛ 7 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
WinAVR рдкреНрд░реЛрдЬреЗрдХреНрдЯ GNU GCC рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рд╡реЙрди рдиреНрдпреВрдореИрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЧрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХрд╛ рдЕрд░реНрде рд░рдЦрддрд╛ рд╣реИред рдЬрдм AVR рдХреЗ рд▓рд┐рдП GCC рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдмреИрд╕рд╛рдЦреА рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛: рдкрддреЗ 0 рд╕реЗ 0x007fffff рдХреЛрдб (ROM, рдлрд╝реНрд▓реИрд╢), рдФрд░ 0x00800100 рдХреЗ рд▓рд┐рдП 0x0080ffff рдбреЗрдЯрд╛ (RAM, SRAM) рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреНрдп рдЪрд╛рд▓реЗрдВ рдереАрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 0x00800000 рд╕реЗ 0x008000ff рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдкрддреЗ рдЬреЛ рдХрд┐ рд░рд╛рдо рдХреЗ рд╕рдорд╛рди opcodes рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдЬреИрд╕реЗ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдЖрд░реНрдбрд┐рдиреЛ, рдФрд░ рд╣реИрдХрд░ рдирд╣реАрдВ, рддреЛ рдПрдХ рд╣реА рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ C / C ++ рдХреЛ рдорд┐рд▓рд╛рдХрд░, рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, WinAVR рдореЗрдВ AVR Libc рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдорд╛рдирдХ C рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ AVR- рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг, 2.0.0, рд▓рдЧрднрдЧ рддреАрди рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкреНрд░рд▓реЗрдЦрди рди рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдмрд▓реНрдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдирд┐рд░реНрдорд╛рддрд╛ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрд╕реА рдЕрдиреБрд╡рд╛рдж рднреА рд╣реИрдВред
рдХреЛрдб рдХреЗ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдбреЗрдЯрд╛
рдХрднреА-рдХрднреА рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдмрд╣реБрдд рдХреБрдЫ рдбрд╛рд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛: рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╕ рд░реИрдо рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рдбреЗрдЯрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рд╕рдордп рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реЗрдЦрд╛рдкреБрдВрдЬ рдЪрд┐рддреНрд░, рдПрдХ рд░рд╛рдЧ рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ред рдЗрд╕реА рд╕рдордп, рдХреЛрдб рдЕрдХреНрд╕рд░ рдЙрдкрд▓рдмреНрдз рд░реЛрдо рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдВрд╢ рдХреЛ рд▓реЗрддрд╛ рд╣реИред рддреЛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ? рдЖрд░рд╛рдо рд╕реЗ! Avr-libc 2.0.0 рдкреНрд░рд▓реЗрдЦрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдкреЗрд╕ рдореЗрдВ 5 рдбреЗрдЯрд╛ рдХреЗ рдкреВрд░реЗ рдЕрдзреНрдпрд╛рдп рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред RAM рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
unsigned char array2d[2][3] = {...}; unsigned char element = array2d[i][j];
рдФрд░ рдЗрд╕ рддрд░рд╣ ROM рдХреЗ рд▓рд┐рдП:
#include <avr/pgmspace.h> const unsigned char array2d[2][3] PROGMEM = {...}; unsigned char element = pgm_read_byte(&(array2d[i][j]));
рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдХрд┐ RuNet рдореЗрдВ рднреА рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рддреЛ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?
рдпрд╣ рдХрдерди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ 640 KB рд╕рднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдиреЗ 16-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ 32-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рд╕реЗ 64-рдмрд┐рдЯ рддрдХ рдХреИрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛? рд╡рд┐рдВрдбреЛрдЬ 98 рдиреЗ 512 рдПрдордмреА рд╕реЗ рдЕрдзрд┐рдХ рд░реИрдо рдкрд░ рдЕрд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрдмрдХрд┐ рдЗрд╕реЗ 2 рдЬреАрдмреА рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА BIOS рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдорджрд░рдмреЛрд░реНрдб 8 рдЬреАрдмреА рд╕реЗ рдмрдбрд╝реЗ рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗ? 80 рдЬреАрдмреА рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдХреВрджрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ, рдЙрдирдХреА рдорд╛рддреНрд░рд╛ рдХреЛ 32 рдЬреАрдмреА рддрдХ рдЯреНрд░рд┐рдо рдХрд░реЗрдВ?
рдЬрдм рдореИрдВрдиреЗ ROM рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 32 KB рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддреЛ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдиреЗ рдореБрдЭреЗ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред ROM рдореЗрдВ рдХреНрдпреЛрдВ, рдФрд░ RAM рдореЗрдВ рдирд╣реАрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ, 8-рдмрд┐рдЯ рдПрд╡реАрдЖрд░ рдХреЗ рд╕рд╛рде 32 рдХреЗрдмреА рд╕реЗ рдЕрдзрд┐рдХ рд░реИрдо рдХреЗрд╡рд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдФрд░ 256 рдмреА рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде - рдореМрдЬреВрдж рд╣реИрдВред рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рд░реИрдо рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП 16 рдмреА (2 рдмреА) рдЪреБрдирд╛ (рдФрд░ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП), рдЬрд┐рд╕реЗ рдЕрдзреНрдпрд╛рдп 11.14 рдореЗрдВ рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдХреНрдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? AVR Libc рдкреНрд░рд▓реЗрдЦрдиред рдУрд╣, рдФрд░ рд╣рдо рд╣реИрдХ рдХрд░рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд╕рд░рдгреА рдореЗрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдк 32,767 B (2 ^ (16 - 1) - 1 B) рд╕реЗ рдмрдбрд╝реА рд╡рд╕реНрддреБ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡рд╕реНрддреБ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддрдереНрдп рд╣реИ: рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгреА, рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ 32,768 рдмреА рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред 64-рдмрд┐рдЯ OS рдореЗрдВ 32-рдмрд┐рдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (4 рдЬреАрдмреА) рдХреЗ рдкрддреЗ рдХреА рдЬрдЧрд╣ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдЬреИрд╕рд╛ рд╣реИ, рд╣реИ рдирд╛?
рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рд╣рд▓ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк ROM рдореЗрдВ 32,768 рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рддреЛрдбрд╝ рджреЗрдВред
рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░: рдкреЙрдЗрдВрдЯрд░реНрд╕ 16 рдмрд┐рдЯреНрд╕ рд╣реИрдВред рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдкреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЕрдзреНрдпрд╛рдп 5 рдореЗрдВ рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдирд╣реАрдВ, рд╕рд┐рджреНрдзрд╛рдВрдд рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ, рдЕрднреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛, рдПрдХ рдбрд┐рдмрдЧрд░ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдирд╣реАрдВ) рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐ pgm_read_byte
рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ pgm_read_byte
рд╕рдХреНрд╖рдо рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрддреЗ 16 рдмрд┐рдЯреНрд╕ (64 KB; рдзрдиреНрдпрд╡рд╛рдж, 15 рдирд╣реАрдВ) рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред рддрдм рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣реЛрддрд╛ рд╣реИ, рдкреБрд░рд╛рдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрдХреЗрдд 16-рдмрд┐рдЯ рд╣реИрдВред рд▓реЗрдХрд┐рди рджреЛ рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВ: рдпрд╣ рдЕрдзреНрдпрд╛рдп 5 рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдПрдХ рдмрдпрд╛рдирдмрд╛рдЬреА рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛) рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдмрд┐рдирд╛ 64 рдХреЗрдмреА рд░реЛрдо рдХреА рд╕реАрдорд╛ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдзреНрдпрд╛рдп 5 рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ 25.18 pgmspace.h рдлрд╝рд╛рдЗрд▓ рд╕рдВрджрд░реНрдн рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ pgm_read_*
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдкрд░рд┐рд╡рд╛рд░ pgm_read_*_near
рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ pgm_read_*_near
, рдЬреЛ 16-рдмрд┐рдЯ рдкрддреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдБ рднреА pgm_read_*_far
, рдФрд░ рдЖрдк рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 32-рдмрд┐рдЯ рдкрддрд╛ рдпреВрд░реЗрдХрд╛!
рд╣рдо рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
unsigned char element = pgm_read_byte_far(&(array2d[i][j]));
рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрджрд┐ array2d 32 KB рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реИ)ред рдХреНрдпреЛрдВ? рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ &
рдСрдкрд░реЗрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 16-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИ! рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ pgm_read_*_near
рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 16-рдмрд┐рдЯ рдкрддреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ 64 KB рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, &
рдСрдкрд░реЗрд╢рди рдХреЗрд╡рд▓ 32 KB рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред pgm_read_*
рдЕрд▓рд╛рд╡рд╛ pgmspace.h рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? pgm_get_far_address(var)
рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╡рд░рдг рдХрд╛ рдЖрдзрд╛ рдкреГрд╖реНрда рд╣реИ, рдФрд░ &
рдСрдкрд░реЗрд╢рди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╢рд╛рдпрдж рд╕рд╣реА:
unsigned char element = pgm_read_byte_far(pgm_get_far_address(array2d[i][j]));
рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ред рд╣рдо рд╡рд┐рд╡рд░рдг рдкрдврд╝рддреЗ рд╣реИрдВ: 'var' рдХреЛ рдореМрдЬреВрджрд╛ рдкреНрд░рддреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдкрд░ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдЪрд░ рдирд╛рдо, рдПрдХ рд╕рд░рдгреА рдирд╛рдо (рд╕рд░рдгреА рдХрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рддрддреНрд╡ рдирд╣реАрдВ, рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░рдВрддрд░ рд╣реИ рддреЛ рд╕рдВрдХрд▓рдХ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрджрд┐ рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рд╣реИ рддреЛ рдкрддрд╛ рдкрд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ), рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдирд╛рдо рдпрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирд╛рдо, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдПрдХ рд▓рд┐рдВрдХрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рд╡рд░реНрддрдХ, ...
рд╣рдо рдПрдХ рдФрд░ рдмреИрд╕рд╛рдЦреА рдбрд╛рд▓рддреЗ рд╣реИрдВ: рд╣рдо рд╕рд░рдгреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рд╕реЗ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ:
unsigned char element = pgm_read_byte_far(pgm_get_far_address(array2d) + i*3*sizeof(unsigned char) + j*sizeof(unsigned char));
рдЕрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрджрд┐ рдЖрдк GCC рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 8-рдмрд┐рдЯ AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП C / C ++ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ ROM рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ:
- 32 рдХреЗрдмреА рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХреЗ рд░реЙрдо рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде, рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдкреЗрд╕ рдореЗрдВ рдЕрдзреНрдпрд╛рдп 5 рдбреЗрдЯрд╛ рдкрдврд╝рдХрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓реЗрдВрдЧреЗ;
- 32 рдХреЗрдмреА рд╕реЗ рдмрдбрд╝реЗ рд░реЛрдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
pgm_read_*_far
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ pgm_get_far_address
, pgm_get_far_address
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП &
рд╕рд░рдгреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп, рдФрд░ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ 32,767 B рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрджрд░реНрдн