Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download
1986┬┼1╥
╩юф ьюцэю шёяюыэ Є№ Єюы№ъю шч ╧╟╙ ш юсырёЄш ╬╟╙ 0x20100000 (16K), шч тэх°эхую ╬╟╙ (ё рфЁхёр, эряЁшьхЁ, 0x60000000, эю эх 0x50000000).
└фЁхё яхЁхїюфр фюыцхэ с√Є№ эхў╕Єэ√ь, шэрўх hardfault.
╫Єхэшх ёыют Єюы№ъю т√Ёютэхээюьє рфЁхёє, шэрўх hardfault.
╤шёЄхьр ъюьрэф Thumb1 ё эхсюы№°шьш фюяюыэхэш ьш (шёяюы№чєхь Єюы№ъю Thumb1).
╧юёых ёсЁюёр ўшЄрхЄ PC=[4]
─ы ЁрсюЄ√ ё тэх°эхщ ярь Є№■ эрфю эрёЄЁюшЄ№ ьэюую ЁхушёЄЁют.
┬эх°э ярь Є№ ╬╟╙ ЁрчьхЁюь 1╠ тшфэр ё рфЁхёют 0x50000000, 0x60000000 ш фЁ.
╤ЄрЁ°шщ сшЄ рфЁхёр (A19) яхЁхъЁ√трхЄ ъэюяъє RIGHT.
╧Ёш яюсрщЄютющ чряшёш яєЄрхЄ ў╕Єэ√х-эхў╕Єэ√х срщЄ√.
═х ЁрсюЄрхЄ т Ёхцшьх LOW8 (ё ы■с√ьш LOW16, ENDIAN).
┬ Ёхцшьх LOW16 фєсышЁєхЄ ярЁ√ срщЄ, Єръ ЁрсюЄрЄ№ эхы№ч .
┬ Ёхцшьх ENDIAN яЁюЎхёёюЁ ьхэ хЄ 0..3<->3..0, Єръ ўЄю яюёых ¤Єюую єцх яєЄр■Єё ў╕Єэ√х-эхў╕Єэ√х ёыютр, ўЄю Єюцх схёяюыхчэю.
╩ръ шёяЁртшЄ№:
эрфю т√эєЄ№ яхЁхь√ўъш PC9-BE0, PC10-BE1, PC11-BE2, PC12-BE3
ш єёЄрэютшЄ№ яЁютюфр PC9-BE1, PC10-BE0, PC11-BE3, PC12-BE2.
╧юёых ¤Єюую тё╕ яЁртшы№эю ўшЄрхЄё яю срщЄрь ш яю ёыютрь.
╠юцэю яюёЄртшЄ№ ярь Є№ сюы№°х, Є.ъ. CS эр A20,A21 ь√ т√ёЄрты хь тЁєўэє■.
═р юЄырфюўэющ яырЄх A19 яхЁхёхърхЄё ё ъэюяъющ RIGHT, эю ЄхюЁхЄшўхёъш ьюцэю ёфхырЄ№ яЁютюфюъ юЄ ъэюяъш эр фЁєує■ эюцъє (яюёЄртшы эр PF2 тьхёЄю A31).
╤ яЁютюфрьш яЁш CPU_CLK = 96 ╠├Ў (эрёЄЁющър шч яЁшьхЁр) яюыєўшыё фхышЄхы№ WAIT_STATE ьшэшьєь "7" (2+4+2), Є.х. 12 ╠├Ў (>83 эё). ─рцх яЁш "4" (2+2+1) ЁрсюЄрхЄ Єюы№ъю яюыютшэр ЄхёЄр ярь Єш (ё яЁютюфрьш).
╧Ёш CPU_CLK = 128 ╠├Ў (ъръ яюыєўшЄ№ 144 ╠├Ў шч 8 ╠├Ў? эрфю фЁєующ юёЎшыы ЄюЁ HSE?) фхышЄхы№ WAIT_STATE ьшэшьєь "8" (3+4+2), Є.х. 14.2 ╠├Ў (>70 эё) - тшфшью, яЁш "6" (2+3+2) ш "7" (2+4+2) эхєфрўэ√х ЁрёЄръЄютъш.
╤рьр ьшъЁюёїхьр ярь Єш шьххЄ "┬Ёхь т√сюЁъш яю рфЁхёє ш ёшуэрыє n╤┼1
ш CE2 эх сюыхх 30 эё", "┬Ёхь Ўшъыр ёўшЄ√трэш шэЇюЁьрЎшш ьшэ 30 эё", "┬Ёхь Ўшъыр чряшёш шэЇюЁьрЎшш ьшэ 30 эё".
╧ю фюъх эр ьшъЁюёїхьє ╬╟╙ ш яЁш ўЄхэшш, ш яЁш чряшёш эх эєцэр чрфхЁцър рфЁхёр яюёых ёэ Єш єяЁрты ■∙шї ёшуэрыют.
╠шэшьры№эр ЁрсюЄр■∙р Ёєўэр ЁрёЄръЄютър 2+4+0, Є.х. 21.3 ╠├Ў (47 эё). ═х ЁрсюЄрхЄ 1+4+0, Є.х. 25.6 ╠├Ў (39 эё).
─ы ёЁртэхэш , ёъюЁюёЄ№ тёЄЁюхээюую ╧╟╙: 16 срщЄ чр 40 эё (ёЄЁрээю, ўЄю ЁрсюЄрхЄ, ъюуфр т EEPROM_CMD Delay=0!!!).
╩¤°шЁєхЄё ыш фюёЄєя ъ тэх°эхьє ╬╟╙? ┬ фюъєьхэЄрЎшш эр 1986┬┼1╥ єяюьшэр■Єё Єюы№ъю эрёЄЁющъш ъ¤°шЁютрэш ш сєЇхЁшчрЎшш фы DMA.
┬ J-Em v2 ё ╘шЄюэюь ьюцэю єёЄрэютшЄ№ Єюы№ъю 2 сЁ ъяющэЄр ш Єюы№ъю т ╧╟╙. ╧ю¤Єюьє Єюўъш юёЄрэютр ёЄртшь ышсю тЁєўэє■ т яЁюуЁрььх, ышсю тЁєўэє■ т юъэх фшчрёьр шыш фрьяр.
фы ARM thumb яюэрфюсшЄё ЄрсышЎр ъюэёЄрэЄ, схч ъюЄюЁющ эшъръ
т thumb эхЄ ёяюёюср яЁшётрштрэш яю ўрёЄ ь!!!
сюыхх Єюую, т эхъюЄюЁ√ї рЁшЇьхЄшўхёъшї юяхЁрЎш ї хёЄ№ юуЁрэшўхэшх эр срщЄют√х ъюэёЄрэЄ√ (ASR/LSL фю 31, фтєїрфЁхёэ√щ ADD/SUB фю 7, р MOV,CMP ш юфэюрфЁхёэ√щ ADD/SUB фю 0xff)
AND,ORR,EOR Єюы№ъю т ЁхушёЄЁрї фтєїрфЁхёэю
шыш фхырЄ№ тёх ъюэёЄрэЄ√ ўхЁхч ld:jr:dw? яЁхфёърч√трхЄё шфхры№эю, т ъ¤° ыюцшЄё шфхры№эю, Єюы№ъю юфэр ыш°э ъюьрэфр ш эрфю єўшЄ√трЄ№ т√Ёртэштрэшх эр 4 (.ALIGN 2 эр т√їюфх т√ЁртэштрхЄ эр 4, ьюцэю яЁ ью хую ш шёяюы№чютрЄ№, Єюы№ъю Єюуфр эрфю єэшъры№эє■ ьхЄъє фы фцрьяр!)
LDR Rr,[PC,#0xNN] NN = 0x000...0x3fc (ъЁрЄэю 4) Єюы№ъю тяхЁ╕ф!!! шэЄхЁхёэю, юЄ ъръюую PC
%0100 1rrr NNNN NNNN
эр рфЁхёх 062a ъюьрэфр LDR Rr,[PC,#0x00] ўшЄрхЄ шч 062c (Єрь ыхцшЄ 44ff,42ba, т ЁхушёЄЁ яюярфрхЄ 42ba44ff)
эр рфЁхёх 061c ъюьрэфр LDR Rr,[PC,#0x00] ўшЄрхЄ шч 0620 (Єрь ыхцшЄ d00f,07d9, т ЁхушёЄЁ яюярфрхЄ 07d9d00f)
т PUSH ьюцэю єърчрЄ№ ёяшёюъ ЁхушёЄЁют (Єюы№ъю R0..R7 ш LR):
PUSH {R0,R2,R7,LR}
%1011 010L 7654 3210
т POP ьюцэю єърчрЄ№ ёяшёюъ ЁхушёЄЁют (Єюы№ъю R0..R7 ш PC):
POP {R0,R2,R7,PC}
%1011 110P 7654 3210
ъюЁюЄъшщ яхЁхїюф (-800..+800):
B addr
%1110 0sLL LLLL LLLL (S ё фюяюыэхэшхь фю 2)
L фюьэюцрхЄё фю 2 ш яЁшсрты хЄё ъ PC+4!!! (схч юъЁєуыхэш фю 4)
фышээ√щ яхЁхїюф (-400000..+400000):
BL addr
%1111 0sHH HHHH HHHH
%1111 1LLL LLLL LLLL
HL фюьэюцрхЄё фю 2 ш яЁшсрты хЄё ъ PC яюёых ъюэЎр ъюьрэф√, Є.х. PC+4 (схч юъЁєуыхэш фю 4)
тёх тхЄтыхэш ъюЁюЄъшх:
BEQ addr (==)
%1101 0000 sLLL LLLL
BNE addr (!=)
%1101 0001 sLLL LLLL
BCS 2
BCC 3
BMI 4
BPL 5
BVS 6
BVC 7
BHI 8
BLS 9
BGE a (>=)
BLT b (<)
BGT c (>)
BLE d (<=)
L фюьэюцрхЄё фю 2 ш яЁшсрты хЄё ъ PC+4!!! (схч юъЁєуыхэш фю 4)
чрЁрэхх эх єчэрЄ№, фрыхъю ыш эрфю яЁ√урЄ№ тяхЁ╕ф - Єю хёЄ№ т if/while эрфю фышээ√щ яхЁхїюф ё ъюЁюЄъшь юсїюфюь
яхЁхїюф яю ЁхушёЄЁє:
BX Rr
%0100 0111 0rrr r000
BLX Rr
%0100 0111 1rrr r000
switch?
SWI n
%1101 1111 nnnn nnnn
ўЄю фхырхЄ?
т ╠шырэфЁх Єрь svc #N
MOVS R,r
%0000 0000 00rr rRRR
MOV R,r
%0100 0110 Rrrr rRRR
MVNS R,r
%0100 0011 11rr rRRR
LDR R,[r,N*4]
%0110 1NNN NNrr rRRR
STR R,[r,N*4]
%0110 0NNN NNrr rRRR
ADDS R,r,a
%0001 100a aarr rRRR
ADDS R,r,N
%0001 110N NNrr rRRR
todo уЁєчшЄ№ R0 т эрўрых яЁюЎхфєЁ√, р яхЁхьхээ√х рфЁхёютрЄ№ юЄэюёшЄхы№эю эрўрыр шї сыюър (є ¤Єющ яЁюЎхфєЁ√). ┼ёыш яхЁхьхээр ёыш°ъюь фрыхъю, Єю рфЁхёютрЄ№ ўхЁхч фЁєующ ЁхушёЄЁ (Єюуфр єц яЁшётюшЄ№ хую), р R0 эх яюЁЄшЄ№.
└ ъръ цх Єюуфр т√чют√? ╧юёых т√чютют эрфю юя Є№ уЁєчшЄ№ R0, цхырЄхы№эю шч Єющ цх ъюэёЄрэЄ√, эю хёыш юэр фрыхъю, Єю шч эютющ Єръющ цх.
todo ёфтшуш шэырщэ ъюьрэфрьш
todo фюсртшЄ№ эхфюёЄр■∙шх ъюьрэф√ Єшяр REV
Keil:
Example 9. Placing literal pools
AREA Loadcon, CODE, READONLY
ENTRY ; Mark first instruction to execute
start
BL func1 ; Branch to first subroutine
BL func2 ; Branch to second subroutine
stop
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (formerly SWI)
func1
LDR r0, =42 ; => MOV R0, #42
LDR r1, =0x55555555 ; => LDR R1, [PC, #offset to
; Literal Pool 1]
LDR r2, =0xFFFFFFFF ; => MVN R2, #0
BX lr
LTORG ; Literal Pool 1 contains
; literal Ox55555555
func2
LDR r3, =0x55555555 ; => LDR R3, [PC, #offset to
; Literal Pool 1]
; LDR r4, =0x66666666 ; If this is uncommented it
; fails, because Literal Pool 2
; is out of reach
BX lr
LargeTable
SPACE 4200 ; Starting at the current location,
; clears a 4200 byte area of memory
; to zero
END ; Literal Pool 2 is empty
Procedure Call Standard for the ARM Architecture (AAPCS).
4 Using Assembly and Intrinsics in C or C++ Code 4.3 Calling assembly functions from C and C++
The AAPCS describes a contract between caller functions and callee functions. For example, for integer or pointer types, it specifies that:
Х Registers R0-R3 pass argument values to the callee function, with subsequent arguments passed on the stack.
Х Register R0 passes the result value back to the caller function.
Х Caller functions must preserve R0-R3 and R12, because these registers are allowed to be corrupted by the callee function.
Х Callee functions must preserve R4-R11 and LR, because these registers are not allowed to be corrupted by the callee function.
R13=SP
R14=LR (link register, рфЁхё тючтЁрЄр)
R15=PC
є эрё ёхщўрё эх Єръ: r0=rtemp, r1..r4 - ЁхушёЄЁ√ фрээ√ї (r1=Ёхчєы№ЄрЄ), ярЁрьхЄЁ√ эх яхЁхфр■Єё т ЁхушёЄЁрї
r7=0xff
r8=0x00
r5,r6 ётюсюфэ√