рд╣рдо рдПрдЖрд░рдПрдо рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо 3 рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ

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

рддреЛ рдЪрд▓рд┐рдП!

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

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

рд╣рдорд╛рд░реА рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ test.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ:

static volatile unsigned int * const UART_DR = (unsigned int *)0x4000c000; static void uart_print(const char *s) { while (*s != '\0') { *UART_DR = *s; s++; } } void c_entry(void) { uart_print("Hello, World!\n"); while (1) ; } 

рдпрд╣ рдмрд╣реБрдд рдкрддрд╛ 0x4000c000 рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣рд╛рдВ DR рд░рдЬрд┐рд╕реНрдЯрд░ рд╢реВрдиреНрдп рд╢реВрдиреНрдп рд╣реИред рд╣рдо UART рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (рдЗрд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА), рд▓реЗрдХрд┐рди рд╣рдо рддреБрд░рдВрдд рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рдЗрд╕рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рдЕрдм, рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдлрд╝рд╛рдЗрд▓ test.centry рдореЗрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб (startup.S рдлрд╝рд╛рдЗрд▓) рдмрдирд╛рдПрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрдВрддрд┐рдо ELF рдЫрд╡рд┐ рдореЗрдВ рд░рдЦреЗрдВред

 .type start, %function .word stack_top /*     */ .word start /*    PC */ .global start start: ldr r1, =c_entry bx r1 

0x0 рдкрд░ рдкрд╣рд▓рд╛ рд╢рдмреНрдж рд╕реНрдЯреИрдХ (SP) рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред 0x4 рдкрд░ рдПрдХ рдкреАрд╕реА рд╣реИ, рдЬреЛ рдПрд╕рдкреА рдХреА рддрд░рд╣, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рд╛рд░рдВрдн рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо рдХреЛрдб рдХреЛ рдердВрдм рдореЛрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдПрдЖрд░рдПрдо рдХрдорд╛рдВрдб рдХрд╛ рдРрд╕рд╛ рд╕рд░рд▓реАрдХреГрдд рд╕реЗрдЯ рд╣реИ), рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░реИрдХреНрдЯ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдлреЙрд░реНрдо (рдкрддреЗ) рдореЗрдВ рд╣реЛрдВред 0x1) - рдЕрд░реНрдерд╛рдд рдкрддреЗ рдХреА рдЕрдВрддрд┐рдо рдмрд┐рдЯ 1 рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдЯрд╛рд░реНрдЯ рдлрдВрдХреНрд╢рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ c_entry () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ test.c рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ "bx r1" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЖрдк рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА (ROM) рдФрд░ рд░реИрдо (RAM) рдХреЗ рдкрддреЗ рдФрд░ рдЖрдХрд╛рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ test.ld рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ:

 SECTIONS { . = 0x0; /*   (ROM) */ .text : { startup.o(.text) test.o(.text) } . = 0x20000000; /*     RAM */ .data : { *(.data) } .bss : { *(.bss) } . = ALIGN(8); . = . + 0x1000; /*    4 */ stack_top = .; } 

рдкрддреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред "ред" рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рд░реЙрдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ .text рд╕реЗрдХреНрд╢рди (рдПрдбреНрд░реЗрд╕ 0x0) рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдСрд░реНрдбрд░ рдХреЗ рдмрд╛рдж - рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк .o (.text) рдкрд╣рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, RAM рдкрд░ рдЬрд╛рдПрдБ (; = 0x20000000;) рдФрд░ рд╡рд╣рд╛рдБ рдбреЗрдЯрд╛ (рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб рдЧреНрд▓реЛрдмрд▓ рдбреЗрдЯрд╛) рдФрд░ bss (рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рдЧреНрд▓реЛрдмрд▓ рдбреЗрдЯрд╛) рдбрд╛рд▓реЗрдВред рдиреАрдЪреЗ рд╣рдо ALIGN (8) рджреЗрдЦрддреЗ рд╣реИрдВ - ARM рдХреЛ 8. рд╕реЗ SP (Stack Pointer) рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╕реНрдЯреИрдХ рдиреАрдЪреЗ рдмрдврд╝рддрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рдХреЗ рдиреАрдЪреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛ рдЖрд╡рдВрдЯрди рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИред тАЭ =ред + 0x1000 тАЭред рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП 4kB рд╕реНрдЯреИрдХ рдПрдХ рдмрдбрд╝реЗ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рд╣реИред рдореИрдВ build.sh рд▓рд╛рддрд╛ рд╣реВрдВ:

 #!/bin/sh arm-none-eabi-as -c -mthumb -mlittle-endian -march=armv7-m -mcpu=cortex-m3 startup.S -o startup.o arm-none-eabi-gcc -c -mthumb -ffreestanding -mlittle-endian -march=armv7-m -mcpu=cortex-m3 test.c -o test.o arm-none-eabi-ld -T test.ld test.o startup.o -o test.elf 

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

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдкрд░реАрдХреНрд╖рдг рдорд┐рд▓рд╛ред рдЗрд╕реЗ QEMU рдкрд░ рдЪрд▓рд╛рдПрдБ:

 $ qemu-system-arm -M lm3s811evb -kernel test.elf -nographic Hello, World! 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

рдФрд░ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рдПрдореБрд▓реЗрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛ рдЬреЛ рд╣рдорд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд▓реЛрд╣реЗ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рд╣рдо рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдореЗрдВ рдЖрдИрдЯреА рдЙрддреНрд╕рд╡ techtrain.ru рдкрд░ рдЗрд╕ рд╢рдирд┐рд╡рд╛рд░ рдФрд░ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдЯреИрдВрдб рдкрд░ рд▓реЛрд╣реЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ, рдФрд░ рдбреЗрдореЛ рдЬрд╝реЛрди рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░реЗрдВ, рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

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


All Articles