
рдореБрдЭреЗ рдПрдХ рдФрд░ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рдХреЛ "рд╕рдорд╛рдкреНрдд" рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛, рдЬрд╣рд╛рдВ рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдЕрдм рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
- "рдЬрдЯрд┐рд▓" GNU ld рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ;
- рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛
- рдЕрдВрдд рдореЗрдВ рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдУ!
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ:
рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:
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,
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдХреЛрдбрд╛рдВрддрд░рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕реА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╕реЗ рджреВрд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред рд╕реНрд╡рддрдВрддреНрд░ рд╡реНрдпрд╡рдзрд╛рди рд╣реИрдВрдбрд▓рд░ рднреА рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдПрдХ рд╕рд╛рдорд╛рдиреНрдп
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(); } }
рдЬрдм рддрдХ рд╕рд┐рд╕реНрдЯрдо рдХрд╛рдЙрдВрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдЪрдХреНрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмреАрдЪ рдореЗрдВ рд╕реНрдЯреИрдВрдбрдмрд╛рдИ рдореЛрдб (рд╕реНрд▓реАрдк рдореЛрдб) рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ 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
рдХреНрд▓рд╛рд╕рд┐рдХ 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; }
рд╣рдо рдлреАрдлреЛ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреБрдЫ рдЕрдЬреАрдм рдбреЗрдЯрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рджрдлрди рдирд╣реАрдВ рд╣реИред
рд╣рдо рд░рд┐рд╕реЗрдкреНрд╢рди рдкрд░ рд░реБрдХрд╛рд╡рдЯреЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ)ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
LPC1768 рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╕рднреА рдкрд░рд┐рдзреАрдп рдЪрд╛рд▓реВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ: mbed рдореЗрдВ рддреАрди UARTs рдмрд╛рд╣рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд┐рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЪреВрдВрдХрд┐ USB рд╕рдВрдЪрд╛рд░ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдХреЛрдб рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ UART рдХреЛ FTDI рдХреЗрдмрд▓ рдХреЛ рд╣реБрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпреЗ P13 / P14 рд╣реИрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╣рдирд╛
рд╣рдордиреЗ рд▓рд┐рдВрдХрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рд░реАрдврд╝ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рд╕реАрдПрдордПрд╕рдЖрдИрдПрд╕ рдФрд░ рдПрдХ рдбреЗрдореЛ рднреА рд▓реЗрдВ (рдХреЗрд╡рд▓ рдХреЛрдб рдкрдврд╝реЗрдВ, рдПрд▓рдкреАрд╕реАрдПрдХреНрд╕рдкреНрд░реЗрд╕реЛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреБрдЦ рдХреА рдбрд┐рдЧреНрд░реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ)ред
рдЖрдЧреЗ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рдерд╛, рдмрд╣реБрдд рд╕реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдЕрднреА рддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИрдВ! рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдлрд┐рд░ рднреА, рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рджрд┐рдиреЛрдВ рдХреЗ "рд╕реНрдереВрд▓" рдХреЗ рдмрд╛рдж рдПрдВрдмреЗрдбреЗрдЯреНрд╕ рдХреЗ "рдорд╛рдЗрдХреНрд░реЛрд╡рд░реНрд▓реНрдб" рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдПред
PS рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░реВрдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред
рдпрд╣ рдХрд╛рдо рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рдПрдЯреНрд░рд┐рдмреНрдпреВрд╢рди-рдиреЙрди-рдХреЙрдорд░реНрд╢рд┐рдпрд▓-рдиреЛрдПрд░реНрдбреАрд╡реНрд╕ 3.0 рдЕрдирдкреЛрд░реНрдЯреЗрдб рдХреЗ рддрд╣рдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реИ ред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рдпреВрдиреАрд▓реЗрдВрд╕ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЙрдкрд▓рдмреНрдз рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрд╣ рдХрд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд▓реЗрдЦрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рдпрд╛ рдкрд┐рдЫрд▓реЗ рдирд┐рдпреЛрдХреНрддрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реИред