рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП ARM: рд▓реЗрдЖрдЙрдЯ -2, рдЗрдВрдЯрд░рдкреНрдЯ рдФрд░ рд╣реЗрд▓реНрд▓реЛ рд╡рд░реНрд▓реНрдб!



рдореБрдЭреЗ рдПрдХ рдФрд░ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рдХреЛ "рд╕рдорд╛рдкреНрдд" рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛, рдЬрд╣рд╛рдВ рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдЕрдм рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ:


рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг: https://github.com/farcaller/arm-demos



рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдерд╛ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рдореЗрдВ рдХрд┐рди рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА рдХреНрдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдордиреЗ .bss рдФрд░ .bss рдкрддрд╛ .bss ред рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ рдХрд┐ .data рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╡реИрд╢реНрд╡рд┐рдХ (рд╕реНрдерд┐рд░) рдЪрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рд╕реЗ рд░реИрдо рддрдХ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред .bss рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, crt0.a рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ crt0.a (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕реА рд░рдирдЯрд╛рдЗрдо 0, рдЬрд╣рд╛рдБ 0 рдХрд╛ рдЕрд░реНрде рд╣реИ рдЖрд╡реЗрджрди рдХреЗ рдЬреАрд╡рди рдХреА рд╢реБрд░реБрдЖрдд)ред рдЖрдЬ рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓реМрдирд╛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП crt0 рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЕрд╕реНрд╡реАрдХрд░рдгред GNU ld рдореЗрдВ, рдПрдХ рд╣реА рддрд░рд╣ рдХреА рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡реЗрд░рд┐рдПрд╢рди рдФрд░ рд▓реЗрдЖрдЙрдЯ рдлреНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдореЗрд░реА рдХрд▓реНрдкрдирд╛ рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рди рд╣реИрдВ, рдЬреЛ LPCXpresso рд╕реЗ рд▓реЗрдЖрдЙрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рддрд╣рдд рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рд┐рдЦреЗрдВ!

рдЗрди-рдореЗрдорд░реА рдбреЗрдЯрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди


04-helloworld/platform/protoboard/layout.ld ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ: рдХрдИ рд╕реНрдерд┐рд░рд╛рдВрдХ, рд╕реНрдореГрддрд┐ рдХрд╛ рд╡рд░реНрдгрди, рдЕрдиреБрднрд╛рдЧред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .data рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ:
 .data : ALIGN(4) { _data = .; *(SORT_BY_ALIGNMENT(.data*)) . = ALIGN(4); _edata = .; } > ram AT>rom = 0xff 


4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде .data рд╕реЗрдХреНрд╢рди рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА, рдпрджрд┐ рдХрд░реНрд╕рд░ рдЗрд╕ рд╕реЗрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ 0x00000101 рдХреЗ рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ .data рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛)ред рдЕрдиреБрднрд╛рдЧ рд░реИрдо ( > ram ) рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА ( AT>rom ) рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдЕрдЧрд▓рд╛, _data , рд╡рд░реНрддрдорд╛рди рдХрд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐ рдмрдЪ рдЬрд╛рддреА рд╣реИред рдЪреВрдВрдХрд┐ рдЕрдиреБрднрд╛рдЧ рдореБрдЦреНрдп рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИ, _data рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░реЗрдЧрд╛: 0x10000000ред

рдПрдХ-рдПрдХ рдХрд░рдХреЗ, рд╕рднреА рд╕реНрд░реЛрдд рдЦрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред рд╕рднреА рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ .data рдХреЛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЫрдВрдЯрдиреА рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИ, рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдордЭреЗрдВ:
 uint16_t static_int = 0xab; uint8_t static_int2 = 0xab; uint16_t static_int3 = 0xab; uint8_t static_int4 = 0xab; 


рдЪрд╛рд░ рдЦрдВрдб рдпрд╣рд╛рдБ .data рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ?
 .data 0x0000000010000000 0xc load address 0x00000000000007b0 0x0000000010000000 _data = . *(.data*) .data.static_int2 0x0000000010000000 0x1 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000000 static_int2 *fill* 0x0000000010000001 0x3 ff .data.static_int3 0x0000000010000004 0x4 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000004 static_int3 .data.static_int4 0x0000000010000008 0x1 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000008 static_int4 *fill* 0x0000000010000009 0x1 ff .data.static_int 0x000000001000000a 0x2 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x000000001000000a static_int 0x000000001000000c . = ALIGN (0x4) 0x000000001000000c _edata = . 

рд╕реВрдЪрдирд╛ *fill* рдмрд╛рдЗрдЯреНрд╕ рдХрд┐ рд╢рдмреНрдж рд╕реАрдорд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВред рдПрдХ рдЦрд░рд╛рдм рдЖрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг, рд╣рдордиреЗ рдЙрд╕реА рддрд░рд╣ 4 рдмрд╛рдЗрдЯ рдЦреЛ рджрд┐рдПред рдСрдкрд░реЗрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ, рдЗрд╕ рдмрд╛рд░ SORT_BY_ALIGNMENT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
 .data 0x0000000010000000 0x8 load address 0x00000000000007b0 0x0000000010000000 _data = . *(SORT(.data*)) .data.static_int3 0x0000000010000000 0x4 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000000 static_int3 .data.static_int 0x0000000010000004 0x2 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000004 static_int .data.static_int2 0x0000000010000006 0x1 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000006 static_int2 .data.static_int4 0x0000000010000007 0x1 build/d0f0154f60ed1a9c2083183e7c731846451d2bdb_helloworld.o 0x0000000010000007 static_int4 0x0000000010000008 . = ALIGN (0x4) 0x0000000010000008 _edata = . 

рдЪрд░ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдордиреЗ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ (33%) рдмрдЪрд╛рдпрд╛!

рдХрд░реНрд╕рд░ рдкрд░ рд╡рд╛рдкрд╕, рдЬреЛ рдЕрдм рддреБрд░рдВрдд рд╕рднреА .data рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдирд┐рд░реНрдорд╛рдг . = ALIGN(4) . = ALIGN(4) рд╢рдмреНрдж рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдХрд░реНрд╕рд░ (рдпрджрд┐ рдЗрдирдкреБрдЯ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкреВрд░реНрдг рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИ . = ALIGN(4) рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдореВрд▓реНрдп _edata рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реЗрдХреНрд╢рди рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реИ, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рддреАрдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: _data_load = LOADADDR(.data) ред LOADADDR рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд▓реЛрдб рдкрддрд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХреБрдЫ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдп рд╣реИрдВ: ADDR рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ "рд╡рд░реНрдЪреБрдЕрд▓" рдкрддрд╛, SIZEOF - рдЕрдиреБрднрд╛рдЧ рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИред

.data рдЕрдиреБрднрд╛рдЧ, 04-hello-world/platform/common/platform.c рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
 uint32_t *load_addr = &_data_load; for (uint32_t *mem_addr = &_data; mem_addr < &_edata;) { *mem_addr++ = *load_addr++; } 

рд▓реВрдк рдореЗрдВ, рд╣рдо load_addr рд╕реЗ load_addr рддрдХ рдорд╛рди рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред

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

рдЕрдВрддрд┐рдо рдЦрдВрдб - /DISCARD/ - рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ / dev / null рд▓рд┐рдВрдХрд░ рд╣реИред рд╕рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрд╕ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрднрд╛рдЧ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛)ред рдпрд╣ рдЦрдВрдб рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ARMv6-M0 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдирдкреБрдЯ рдЕрдиреБрднрд╛рдЧ рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред

рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдкрд╣рд▓реЗ рдЦрдВрдб рдкрд░ рдзреНрдпрд╛рди .isr_vector_nvic ред .isr_vector_nvic , рдЬрд╣рд╛рдВ рджреЛ рдирдП рдЖрддреЗ рд╣реИрдВ: .isr_vector рдФрд░ .isr_vector_nvic ред рджреЛрдиреЛрдВ рдПрдХ рдХреЗрдИрдИрдкреА рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ, рдЬреЛ рд▓рд┐рдВрдХрд░ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ "рдЕрдиреБрдХреВрд▓рд┐рдд" рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред .isr_vector рдореЗрдВ рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдо рд░реБрдХрд╛рд╡рдЯ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ platform/common/isr.c рдореЗрдВ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 __attribute__ ((weak)) void isr_nmi(); __attribute__ ((weak)) void isr_hardfault(); __attribute__ ((weak)) void isr_svcall(); __attribute__ ((weak)) void isr_pendsv(); __attribute__ ((weak)) void isr_systick(); __attribute__ ((section(".isr_vector"))) void (* const isr_vector_table[])(void) = { &_stack_base, main, // Reset isr_nmi, // NMI isr_hardfault, // Hard Fault 0, // CM3 Memory Management Fault 0, // CM3 Bus Fault 0, // CM3 Usage Fault &_boot_checksum, // NXP Checksum code 0, // Reserved 0, // Reserved 0, // Reserved isr_svcall, // SVCall 0, // Reserved for debug 0, // Reserved isr_pendsv, // PendSV isr_systick, // SysTick }; 


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

рддрд╛рд▓рд┐рдХрд╛ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ isr_vector_table_nvic рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИред

рдФрд░ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


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

рдПрдирд╡реАрдЖрдИрд╕реА - рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╡реЗрдХреНрдЯрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдЖрд░рдПрдо рдХреЛрд░ рдХреЗ рдкреАрдЫреЗ рдкрд░рд┐рдзрд┐ рд╕реЗ рдмрд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рдзрд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ, рдЙрдиреНрд╣реЗрдВ рдХреЗрдВрджреНрд░реАрдп рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ, рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдирдП рд╕рд┐рд╕реНрдЯрд┐рдХ-рдЖрдзрд╛рд░рд┐рдд рдЯрд╛рдЗрдорд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
 static volatile uint32_t systick_10ms_ticks = 0; void platform_delay(uint32_t msec) { uint32_t tenms = msec / 10; uint32_t dest_time = systick_10ms_ticks + tenms; while(systick_10ms_ticks < dest_time) { __WFI(); } } // override isr_systick from isr.c void isr_systick(void) { ++systick_10ms_ticks; } 

рдЬрдм рддрдХ рд╕рд┐рд╕реНрдЯрдо рдХрд╛рдЙрдВрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдЪрдХреНрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмреАрдЪ рдореЗрдВ рд╕реНрдЯреИрдВрдбрдмрд╛рдИ рдореЛрдб (рд╕реНрд▓реАрдк рдореЛрдб) рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ 10 ms, SysTick рдУрд╡рд░рдлреНрд▓реЛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрд╡рд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ isr_systick рдХрд╛рдЙрдВрдЯрд░ рдХреЛ 1. рд╕реЗ systick_10ms_ticks ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ systick_10ms_ticks рдХреЛ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк systick_10ms_ticks рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЪрд░ рдХрд╛ рдорд╛рди (рдФрд░) рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд╣рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдореБрдЦреНрдп рдореЗрдореЛрд░реА (рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛) рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

libgcc


рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд╣рдо рдкрд╣рд▓реА рдмрд╛рд░ рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд░реНрдЯреЗрдХреНрд╕- M0 :-) рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдбрд┐рд╡реАрдЬрди рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп, __aeabi_uidiv рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди (рдФрд░ рдХреБрдЫ рдФрд░ рд╕рдорд╛рди) рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд░реНрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: libgcc.aред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рд▓рд┐рдВрдХрд░ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рдЕрдкреНрд░рд┐рдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ:
 build/5a3e7023bbfde5552a4ea7cc57c4520e0e458a53_timer.o: In function `platform_delay': timer.c:(.text.platform_delay+0x4): undefined reference to `__aeabi_uidiv' 

рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХрд░ рдХреЙрд▓ рдХреЛ рд╕реАрдзреЗ рдЬреАрд╕реАрд╕реА рдХреЙрд▓ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗ рдХрд┐ рдХрд┐рд╕рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдЬреАрд╕реАрд╕реА рдЗрд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ -nostartfiles рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░рд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рд╣реИ, рдФрд░ -ffreestanding рдорд╛рдзреНрдпрдо рд╕реЗ -ffreestanding рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдУрдПрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╣реИрд▓реЛ рд╣рдмрд▓!


рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдХреБрдЫ рд╣рдж рддрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ UART рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рди рдХреЗрд╡рд▓ рдПрдХ рдлреНрд▓реИрд╢ рдПрд▓рдИрдбреА рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЪрд╛рд▓рдХ:
platform/protoboard/uart.c
 extern uint32_t platform_clock; void platform_uart_setup(uint32_t baud_rate) { NVIC_DisableIRQ(UART_IRQn); 
рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдирд╡реАрдЖрдИрд╕реА рдкрд░ рд░реЛрдХ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); LPC_IOCON->PIO1_6 &= ~0x07; LPC_IOCON->PIO1_6 |= 0x01; LPC_IOCON->PIO1_7 &= ~0x07; LPC_IOCON->PIO1_7 |= 0x01; 
рдЕрдЧрд▓рд╛, рд╣рдо рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдмреНрд▓реЙрдХ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд┐рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ TXD / RXD рдХрд╛рд░реНрдЯ рдореЛрдб рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдиреЗ рдореЗрд░рд╛ рдмрд╣реБрдд рдЦреВрди рдмрд╣рд╛рдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ UART рдПрдХ рд░рд┐рдмреВрдЯ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдХрднреА-рдХрднреА рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ!
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); LPC_SYSCON->UARTCLKDIV = 0x1; 
рдЕрдм рдЖрдк UART рдХреЛ рд╕реНрд╡рдпрдВ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рд╕рдордп рдЗрдирдкреБрдЯ рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рднрдХреНрдд рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  LPC_UART->LCR = 0x83; uint32_t Fdiv = platform_clock //   / LPC_SYSCON->SYSAHBCLKDIV //      / LPC_SYSCON->UARTCLKDIV //    UART / 16 //   16,   / baud_rate; // , ,   LPC_UART->DLM = Fdiv / 256; LPC_UART->DLL = Fdiv % 256; LPC_UART->FDR = 0x00 | (1 << 4) | 0; LPC_UART->LCR = 0x03; 
рдХреНрд▓рд╛рд╕рд┐рдХ 8 рдПрди 1 рдореЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдмрд┐рдЯрд░реЗрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрдбрд░ рддрдХ рдкрд╣реБрдВрдЪ рдЦреЛрд▓рддреЗ рд╣реИрдВред рд╣рдо рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдХреЗ рд▓рд┐рдП, рд╕реВрддреНрд░ рдореИрдиреБрдЕрд▓ рдХреЗ рдЦрдВрдб 13.5.15 рдореЗрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдФрд░ рднреА рд╕рдЯреАрдХ рд╢рд░реАрд░ рджрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рднрдХреНрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, 9580 рдиреЗ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ :-)
  LPC_UART->FCR = 0x07; volatile uint32_t unused = LPC_UART->LSR; while(( LPC_UART->LSR & (0x20|0x40)) != (0x20|0x40) ) ; while( LPC_UART->LSR & 0x01 ) { unused = LPC_UART->RBR; } 
рд╣рдо рдлреАрдлреЛ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреБрдЫ рдЕрдЬреАрдм рдбреЗрдЯрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рджрдлрди рдирд╣реАрдВ рд╣реИред
  // NVIC_EnableIRQ(UART_IRQn); // LPC_UART->IER = 0b101; 
рд╣рдо рд░рд┐рд╕реЗрдкреНрд╢рди рдкрд░ рд░реБрдХрд╛рд╡рдЯреЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ)ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ: mbed рдореЗрдВ рддреАрди UARTs рдмрд╛рд╣рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд┐рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЪреВрдВрдХрд┐ USB рд╕рдВрдЪрд╛рд░ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдХреЛрдб рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ UART рдХреЛ FTDI рдХреЗрдмрд▓ рдХреЛ рд╣реБрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпреЗ P13 / P14 рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╣рдирд╛


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

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

PS рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░реВрдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред

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

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


All Articles