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 LLLLHL фюьэюцрхЄё фю 2 ш яЁшсрты хЄё ъ PC яюёых ъюэЎр ъюьрэф√, Є.х. PC+4 (схч юъЁєуыхэш фю 4)тёх тхЄтыхэш ъюЁюЄъшх:BEQ addr (==)%1101 0000 sLLL LLLLBNE addr (!=)%1101 0001 sLLL LLLLBCS 2BCC 3BMI 4BPL 5BVS 6BVC 7BHI 8BLS 9BGE a (>=)BLT b (<)BGT c (>)BLE d (<=)L фюьэюцрхЄё фю 2 ш яЁшсрты хЄё ъ PC+4!!! (схч юъЁєуыхэш фю 4)чрЁрэхх эх єчэрЄ№, фрыхъю ыш эрфю яЁ√урЄ№ тяхЁ╕ф - Єю хёЄ№ т if/while эрфю фышээ√щ яхЁхїюф ё ъюЁюЄъшь юсїюфюьяхЁхїюф яю ЁхушёЄЁє:BX Rr%0100 0111 0rrr r000BLX Rr%0100 0111 1rrr r000switch?SWI n%1101 1111 nnnn nnnnўЄю фхырхЄ?т ╠шырэфЁх Єрь svc #NMOVS R,r%0000 0000 00rr rRRRMOV R,r%0100 0110 Rrrr rRRRMVNS R,r%0100 0011 11rr rRRRLDR R,[r,N*4]%0110 1NNN NNrr rRRRSTR R,[r,N*4]%0110 0NNN NNrr rRRRADDS R,r,a%0001 100a aarr rRRRADDS R,r,N%0001 110N NNrr rRRRtodo уЁєчшЄ№ R0 т эрўрых яЁюЎхфєЁ√, р яхЁхьхээ√х рфЁхёютрЄ№ юЄэюёшЄхы№эю эрўрыр шї сыюър (є ¤Єющ яЁюЎхфєЁ√). ┼ёыш яхЁхьхээр ёыш°ъюь фрыхъю, Єю рфЁхёютрЄ№ ўхЁхч фЁєующ ЁхушёЄЁ (Єюуфр єц яЁшётюшЄ№ хую), р R0 эх яюЁЄшЄ№.└ ъръ цх Єюуфр т√чют√? ╧юёых т√чютют эрфю юя Є№ уЁєчшЄ№ R0, цхырЄхы№эю шч Єющ цх ъюэёЄрэЄ√, эю хёыш юэр фрыхъю, Єю шч эютющ Єръющ цх.todo ёфтшуш шэырщэ ъюьрэфрьшtodo фюсртшЄ№ эхфюёЄр■∙шх ъюьрэф√ Єшяр REVKeil:Example 9. Placing literal poolsAREA Loadcon, CODE, READONLYENTRY ; Mark first instruction to executestartBL func1 ; Branch to first subroutineBL func2 ; Branch to second subroutinestopMOV r0, #0x18 ; angel_SWIreason_ReportExceptionLDR r1, =0x20026 ; ADP_Stopped_ApplicationExitSVC #0x123456 ; ARM semihosting (formerly SWI)func1LDR r0, =42 ; => MOV R0, #42LDR r1, =0x55555555 ; => LDR R1, [PC, #offset to; Literal Pool 1]LDR r2, =0xFFFFFFFF ; => MVN R2, #0BX lrLTORG ; Literal Pool 1 contains; literal Ox55555555func2LDR 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 reachBX lrLargeTableSPACE 4200 ; Starting at the current location,; clears a 4200 byte area of memory; to zeroEND ; Literal Pool 2 is emptyProcedure 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=SPR14=LR (link register, рфЁхё тючтЁрЄр)R15=PCє эрё ёхщўрё эх Єръ: r0=rtemp, r1..r4 - ЁхушёЄЁ√ фрээ√ї (r1=Ёхчєы№ЄрЄ), ярЁрьхЄЁ√ эх яхЁхфр■Єё т ЁхушёЄЁрїr7=0xffr8=0x00r5,r6 ётюсюфэ√