Jak na S a asm v CCS550

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Prosinec 23 21:11:34 CET 2014


Tak asi je to o tom, ze ARM, THUMBx instr. soubor je vymyslen hlavne pro 
prekladace a ne pro lidi, to je u AVR podobne i kdyz ne tak extremne.
U ARM se zjistilo, ze to nedokazou prekladace plne vyuzit do vsech 
moznosti tak se zavedla sada THUMB a CM-kova rada ma uz jenom THUMB.
Je to ale celkem fuk, pokud procesor podporuje oboje, lze to libovolne 
kombinovat (az na zacatek obsluhy preruseni)

Proste se nepredpoklada, ze by se to v assembleru nejak moc programovalo.
Dne 23. 12. 2014 v 20:57 Josef Štengl napsal(a):
> No a když už jsme u toho TI kompilátoru, překládáte/píšete to v THUMB 
> nebo v ARM? ARM procesor je v tomhle hrozný zvěrstvo. ARM assembler 
> (instukce) nejsou špatně navržené, jen jsou dlouhé celých 32 bitů a 
> proto vznikl THUMB (16 bit). No a pak se přišlo na to, že THUMB je 
> nevýkonný a přišlo THUMB2 :-D
>
> V dokumentu ARM DUI 0489? Kde ? je poslední nalezené písmeno (u mě G) 
> jsou všechny instrukce i s příklady použití.
> První, co si musíte určit je, ve které sadě instrukcí psát. Jsou si 
> dost podobné, ač se detaily liší. Hlavně ty zatracené {cond} jsou se 
> začátku zapeklité, ač se to ukáže jako dobrá myšlenka.
>
> Na x86 jsem ASM nepotřeboval, nemohu porovnat. Tak nízko jsem tam 
> neprogramoval :-)
>
> Jo, tady to mám. Příklad pro ARM s tabulkou (je to pro SWI přerušení, 
> ale to je principiálně jedno)
>
> ;------------------------------------------------------------------------------- 
>
>   .text    ; určení code section
>   .arm    ; .arm .thumb2 - styl
>
>
> ;--------------------------------------------------------------------------------- 
>
> ; Global Definitions
>
>   .ref func2    ; „import“ C funkce
>   .ref func3    ; „import“ C funkce
>
> ;------------------------------------------------------------------------------- 
>
> ; SWI handler
> ;------------------------------------------------------------------------------- 
>
>   .def sch_asmSvcHandler        ; název funkce
>   .asmfunc                ; tohle je pro debugger
> sch_asmSvcHandler            ; label funkce - počátek fukce
>     STMFD   SP!, {R7, LR}           ; store link register (don't touch 
> others register!) - uložení návratové hodnoty do stacku  LR regist + 
> jeden pracovní R7
>     LDRB    R7, [LR,#-1]            ; Load target function code. Only 
> for Big Endian! - Tohle souvisí s instrukcí SVC pro vás nepodstatné - 
> prostě nahrát index pole. pro vás asi číslo vektoru přerušení
>     LDR     LR, handler             ; jumptable address into r14
>     LDR     LR, [LR, R7, LSL #2]    ; set address to wanted function - 
> pointer jest 32 bitů - výpočet offsetu tabulky skoků
>     LDMFD   SP!, {R7}               ; restore contents of r7 - 
> všimněte si, že pro načtení jednoho registru není použito LDR. On si 
> to překladač správně přebere a přeloží LDR  :-)
>
>     BLX     LR                      ; jump to file handler - Já nevím 
> jestli je funkce v thumb nebo arm (to je to X na konci BL a nutnost 
> mít u R přerušení v ARM. Pro jednu sadu vynechte X
>
>     LDMFD   SP!, {LR}               ; obnovení LR (kam se má vrátit) - 
> vrací se sem po vykonání funkce z tabulky
>     MOVS   PC, LR               ; return návrat na předchozí adresu - 
> všiměte si, že se nic neodečítá - to je u SWI (SVC) přerušení u IRQ, 
> FIQ je návrat   subs    pc, lr, #4 (pro thumb si to ověřte je to někde 
> v tabulce, nevím jestli tam není #2)
>   .endasmfunc    ; konec funkce - jen info pro debugger
>
> handler:
>   .word jumptable
>
> ; tady volám funkce
> ; Když  psané v C v tomto případě všechny void FCE(void)
> jumptable
>   .word  fce1    ; asm funkce a
>   .word  fce2   ; c fce
>   .word  fce3   ; c fce
>   .word  fce4    ; asm
> ; a tak dále
>   .word  fcen
>
>
> Starterwar neznám.
>
> procesoru se neříká, kde je tabulka vektorů. Procesor říká, který 
> vektor přerušení nastal a pak voláte vlastní obsluhu daného vektoru 
> přerušení (pro IRQ, FIQ).
>
> Aha.
> Pokud myslíte vlastní tabulku přerušení procesoru, tak jsem vám psal 
> číslo a dokument, kde je umístěn v RAM.
> Já to mám jednoduchý, mám to od 0 takže píšu jenom b <label> na 
> začátku programu :-)
>
> Ale zkusil bych při startu něco jako (už jsem rok nepsal v asm, tak 
> jen idea)
>
>   LDR     R0, irq_isr    ; do r0 nahrát adresu irq obsluhy
>   LDR     R1, irq_vector ; adresa vektoru v ram  - najít viz předchozí 
> maily
>   STR      R0, [R1]    ; na adresu R1 uložím obsah R0
>
> Pak by se při přerušení měla zavolat obsluha.
>
> uložení a obnovu registrů v přerušen inebudu psát, protože mě tam 
> chybí dbi a nemám nested irq (R nemá data cache. Tedy vlastně RAM je 
> data cache (L1) ale nemá DRAM paměť :-)
>
>
>
> Dne 23.12.2014 v 19:48 Pavel Hudeček napsal(a):
>> Vlastně ani nevím, jsem z toho jelen...
>>
>> Už jen ten prasáckej asm. Ještě jsem dokázal pochopit, že asm pro AVR 
>> má místo MOV několik různých LDx a STx, že když to
>> začalo jako práce nějakého studenta, tak si asi chtěl ušetřit práci, 
>> aby překaldač nemusel analyzovat operandy. Poněkud mě
>> ovšem šokovalo, že stejně je na tom ARM, resp. hůř, neboť má místo 
>> MOV celekem asi 16 různých názvů pro různé kombinace
>> operandů.
>>
>> Zatím jsem např. nepřišel na to, jak zapíšu obsah banální proměnné do 
>> R0.
>>
>> Na x86 bych použil MOV a překladač by to vyřešil.
>>
>> Takže: V CCS 550 jsem vytvořil "hello world" projekt, k němu přidal 
>> include s různými #define na adresy registrů a makrem
>> HWREG. Následně jsem z té odkazované asm ukázky vykoukal nastavení 
>> všech registrů ohledně GPIO a přerušení. Pak jsem
>> přidal ještě interrupt.h a interrupt.c ze Starterwaru a použil 
>> IntAINTCInit(); a IntRegister(SYS_INT_GPIOINT2A, pokusIsr);
>> Ale stále to nefungovalo. LEDky blikaly, jak jim velela smyčka na 
>> konci mainu, když jsem udělal, aby se daly přímo ovládat
>> tlačítky přes čtení portu tlačítek, tak to fungovalo, ale přerušení 
>> prostě nic...
>>
>> Nakonec jsem zjisitil, že:
>> - V tom interrupt.h/c je pole fnRAMVectors, kam se reistrujou 
>> přerušení, ale není tam nic, co by řeklo procesoru, že tady
>> je ta tabulka vektorů.
>> - Odkaz na to fnRAMVectors se vyskytuje i v system.lib z dema ve 
>> Starterwaru, což jednak samo o sobě nefunguje bez
>> nastavení tuny dalších věcí a jednak je to monstrum, který bych do 
>> svého projektu nerad dával. A nenašel jsem od toho
>> zdroják. Stejne tak není od libc.a, co je v tom hello world projektu.
>>
>> PH
>>
>> Od: Josef Štengl <ok1ced na nagano.cz>
>>
>>     A překládáte to arm-none-eabi kompilátorem?
>>
>>     Abych řekl pravdu, Keilem se budu zabývat jen když mě za to budou 
>> platit.
>>
>>     Mimochodem všiml jste si, že ty ... tentonoc používají stejnou 
>> příponu pro C a header a ASM (.h)?
>>
>>     A ještě mám dojem, že to napsáno v THUMB2. Nikdy jsem THUMB2 kód 
>> neměl odvahu spustit v přerušení, protože je řečeno, že
>>     se přepíná do ARM. Ale to je u R ka, u A jsem se to asi 
>> nepřepíná, pokud si matně vzpomínám z vašeho předchozího dotazu.
>>
>>     Dne 23.12.2014 v 18:56 Pavel Hudeček napsal(a):
>>      > Díky, nějak mi časem vypadla. Teď už to zas hlásí původní chybu:
>>      > [E0004] Coprocessor information field must be an absolute 
>> constant
>>      > a to hned 2x za sebou
>>      >
>>      > Jenže takhle přesně jsem to zkpíroval ze souboru init.S, který 
>> je v 3000.trivial-a8.zip
>>      > 
>> <http://e2e.ti.com/cfs-file.ashx/__key/communityserver-discussions-components-files/791/3000.trivial_2D00_a8.zip>
>>      > odkazovaném zde:
>>      > 
>> http://e2e.ti.com/support/arm/sitara_arm/f/791/p/360758/1268334#1268334
>>      >
>>      > stejně je to i v start.S v io-irq.tar.gz
>>      > 
>> <http://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/791/io_2D00_irq.tar.gz> 
>> odkazovaném zde:
>>      > 
>> http://e2e.ti.com/support/arm/sitara_arm/f/791/p/389752/1376393#1376393
>>      >
>>      > jen mi zcela uniká, proč nikde před tím nevidím vložení adresy 
>> vektorů do R0. Tam je pro mě navíc naprosou záhadou celá
>>      > syntaxe, např. to, že je všechno deklarováno stylem "let 
>> main() -> void" wtf?
>>      >
>>      > Od: Milan B. <milan na bastl.sk>
>>      >
>>      > On 23. 12. 2014 18:08, Pavel Hudeček wrote:
>>      > > 3. Co dělám špatně, když mi překladač nepřeloží "MCR p15, 0 
>> r0, c12, c0"?
>>      > > Píše: [E0003] Unexpected trailing operand(s)
>>      >
>>      > Nechyba tam ciarka?
>>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


---
This email has been checked for viruses by Avast antivirus software.
http://www.avast.com



Další informace o konferenci Hw-list