ARM

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 08:21

Zdar pani!
Tak zakladam tuto temu za ucelom konzultacii s tymto jadrom.
Moj dotaz:
procesor STM32xxxx s ARM jadrom, ako co najjednoduchsie (C, ASM) skopirujem stav jedneho vyvodu portu na druky vyvod (moze byt aj ten samy port) bez ovplyvnenia ostatnych.
0

Používateľov profilový obrázok
Peťus
Ultimate člen
Ultimate člen
Príspevky: 3940
Dátum registrácie: 07 Mar 2009, 00:00
Bydlisko: Praha
Vek: 34
Kontaktovať používateľa:

Re: ARM

Príspevok od používateľa Peťus » 23 Sep 2011, 08:35

arm neznám, ale v céčku třeba rotace a pak vymaskování?
0
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, STM32, ESP8266, ESP32,...)

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 09:09

Peťus napísal:arm neznám, ale v céčku třeba rotace a pak vymaskování?
mno tak rotacia O.K., ale ovplyvnis ostatne. Nake riesenie mam, hladam ine, chcem porovnat svoje, pripadne ASM.
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: ARM

Príspevok od používateľa jaromir » 23 Sep 2011, 09:17

xmilos napísal:mno tak rotacia O.K., ale ovplyvnis ostatne. Nake riesenie mam, hladam ine, chcem porovnat svoje, pripadne ASM.
Neovplyvnis nic.
Pokial mas porty nasekane do struktury po jednom bite, tak asi takto:

Kód: Vybrať všetko

if (PORT.BIT_A) PORT.BIT_B = 1;
 else PORT.BIT_B = 0;
Ak nie a mas pristup na cele porty (8 alebo 16 bitove) tak

Kód: Vybrať všetko

if (PORT & (1<<BIT_A)) PORT = PORT | (1<<BIT_B);
 else PORT = PORT & ( ~ (1<<BIT_B) );
Skopiruje stav pinu cislo A na pin cislo B na porte PORT. Implementacne detaily sa mozu lisit, princip zostava.

Pripadne ak mas registre na atomicke operacie na portoch (clear, set, invert), tak pouzijes tie podobnym sposobom.
0

Používateľov profilový obrázok
logan105
Stály člen
Stály člen
Príspevky: 222
Dátum registrácie: 06 Mar 2008, 00:00
Vek: 34
Kontaktovať používateľa:

Re: ARM

Príspevok od používateľa logan105 » 23 Sep 2011, 09:20

Tak je samozrejme veľa možností ako to spraviť.
Logickú hodnotu pinu zistíš:

Kód: Vybrať všetko

GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x)
a trebárs cez if nastavíš príslušný pin:

Kód: Vybrať všetko

GPIO_SetBits(GPIOx,GPIO_Pin_x);
GPIO_ResetBits(GPIOx,GPIO_Pin_x)
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 09:28

Mno k rotacii: ukaz priklad.
Tak neviem, ci ARM ma bitorvy pristup, preto som to bachol sem. Mam dojem, ze nie.
Mno tak ako si uviedol priklady (dakujem za ne) to mam vyriesene teraz. Rotaciou ktoru si pouzil v druhom priklade len pohodlne vytvoris masku. Je zaujimave, ze prekladac vytvori rovnaky klod s pouzitim tvojej zyntaxe aj pouzitim "hotovej" masky.

Zaujimaju ma dalsie riesenia, s dorazom na rychlost.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 09:30

logan105 napísal:Tak je samozrejme veľa možností ako to spraviť.
Logickú hodnotu pinu zistíš:

Kód: Vybrať všetko

GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x)
a trebárs cez if nastavíš príslušný pin:

Kód: Vybrať všetko

GPIO_SetBits(GPIOx,GPIO_Pin_x);
GPIO_ResetBits(GPIOx,GPIO_Pin_x)

mno predpokladam, ze GPIO_ReadInputData() je funkcia. To sa kod zbytocne nabaluje. Hladam najkratsie (najrychlejsie) riesenie.
0

Používateľov profilový obrázok
logan105
Stály člen
Stály člen
Príspevky: 222
Dátum registrácie: 06 Mar 2008, 00:00
Vek: 34
Kontaktovať používateľa:

Re: ARM

Príspevok od používateľa logan105 » 23 Sep 2011, 09:38

Ja som si myslel že používaš knižnice od ST, no a keby si sa do nej pozrel tak tam je to krásne spravené a veľmi jednoduché, nieje čo špekulovať. Aký používaš uC ??

Kód: Vybrať všetko

if ((GPIOx->IDR & GPIO_Pin) != 0
{
... set pin ...
}
else
{
... reset pin ...
}
A pri ARM sa až tak nemusíš báť že zaplníš celú pamäť mne sa to nestalo zatiaľ ani pri AVR čo mali oveľa oveľa menšiu pamäť
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: ARM

Príspevok od používateľa jaromir » 23 Sep 2011, 09:43

xmilos napísal:Tak neviem, ci ARM ma bitorvy pristup, preto som to bachol sem. Mam dojem, ze nie.
Nechce sa mi studovat instrukcnu sadu tvojho ARM-u, ani s nimi nerobim, ale nezda sa mi, ze by boli urobene tak debilne, ze by nemali bitovy pristup... Ja pouzivam PIC32, tak take problemy nemam :wink:
xmilos napísal: Mno tak ako si uviedol priklady (dakujem za ne) to mam vyriesene teraz. Rotaciou ktoru si pouzil v druhom priklade len pohodlne vytvoris masku. Je zaujimave, ze prekladac vytvori rovnaky klod s pouzitim tvojej zyntaxe aj pouzitim "hotovej" masky.
Samozrejme, kompilator nie je taky blby aby nevidel ze ta rotacia je len barlicka pre programatora a netreba ju pocitat pocas behu programu, ale staci vypocitat raz pocas kompilacie a pouzit pri behu programu konstantu. Tomu sa hovori optimalizacia.
xmilos napísal: Zaujimaju ma dalsie riesenia, s dorazom na rychlost.
Ak je bitovy pristup na porty, tak to.
Ak nie, tak maska. Nic rychlejsie nevymyslis.
Btw. ked uz mas ARM-y, davaj si pozor na to, ako rychlo mozes mavat s nejakym pinom - ono pri ARMoch sa moze ukazat, ze rychlost jadra je zbytocna ak chces robit rychle operacie na IO pinoch.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 09:48

logan105 napísal:Ja som si myslel že používaš knižnice od ST, no a keby si sa do nej pozrel tak tam je to krásne spravené a veľmi jednoduché, nieje čo špekulovať. Aký používaš uC ??

Kód: Vybrať všetko

if ((GPIOx->IDR & GPIO_Pin) != 0
{
... set pin ...
}
else
{
... reset pin ...
}
A pri ARM sa až tak nemusíš báť že zaplníš celú pamäť mne sa to nestalo zatiaľ ani pri AVR čo mali oveľa oveľa menšiu pamäť
Tak pouzivam Keil, ST kniznice pouzivam, ale nie vsetky.
Mozna sa nechapeme. Nepotrebujem napisat najkratsi kod v C, potrebujem napisat kod tak, aby vysledny prelozeny kod v ASM bol co najkratsi, resp. najrychlejsi.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 09:51

Nechce sa mi studovat instrukcnu sadu tvojho ARM-u
mno ja tiez nie a toto je otazka na tohho, co uz to ma zmaknute.
Inak jadro ide 72Mhz, piny su nastavemne na 50Mhz, tak uz len ten bleskovy kod.
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: ARM

Príspevok od používateľa jaromir » 23 Sep 2011, 09:59

xmilos napísal:Nepotrebujem napisat najkratsi kod v C, potrebujem napisat kod tak, aby vysledny prelozeny kod v ASM bol co najkratsi, resp. najrychlejsi.
Toto je principialne zly prisutp. Ak chces maly kod v asm, tak si ho napis v asm. Ak chces pisat v C, pis v C ale nepozeraj sa na parcialne vysledky.
Budes si ten kod v asm kontrolovat vzdy pri upgrade kompilatora? Vzdy, ked zmenis nieco v inej casti programu? Ako to zmenia optimalizacie?
Sledovat vysledok v asm je casta chyba zaciatocnikov s C kompilatormi. Je treba naucit sa ako C kompilatory funguju, ako interaguje virtualny stroj C kompilatora s realnych strojom (HW) na ktorom to bezi, na co je volatile, co je pamatova bariera, ake su pravomoci kompilatora na preusporiadanie kodu atd.
Pri lowendovych architekurach, ako su AVR alebo PIC18 toto nie je take evidentne, ale pri vyssich ako je ARM, MIPS alebo x86 je to badatelnejsie a dolezitejsie.

Takze ak chces nieco naozaj rychlo tak si to napis ako kus asm integrovany do C kodu.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 10:15

jaromir napísal:
xmilos napísal:Nepotrebujem napisat najkratsi kod v C, potrebujem napisat kod tak, aby vysledny prelozeny kod v ASM bol co najkratsi, resp. najrychlejsi.
Toto je principialne zly prisutp. Ak chces maly kod v asm, tak si ho napis v asm. Ak chces pisat v C, pis v C ale nepozeraj sa na parcialne vysledky.
Budes si ten kod v asm kontrolovat vzdy pri upgrade kompilatora? Vzdy, ked zmenis nieco v inej casti programu? Ako to zmenia optimalizacie?
Sledovat vysledok v asm je casta chyba zaciatocnikov s C kompilatormi. Je treba naucit sa ako C kompilatory funguju, ako interaguje virtualny stroj C kompilatora s realnych strojom (HW) na ktorom to bezi, na co je volatile, co je pamatova bariera, ake su pravomoci kompilatora na preusporiadanie kodu atd.
Pri lowendovych architekurach, ako su AVR alebo PIC18 toto nie je take evidentne, ale pri vyssich ako je ARM, MIPS alebo x86 je to badatelnejsie a dolezitejsie.

Takze ak chces nieco naozaj rychlo tak si to napis ako kus asm integrovany do C kodu.
Tak s tymto nesuhlasim.
Ked som prechadzal z ASM na C, sledoval som vysledny kod. Prve prekladace mali tak mizernu optimalizaciu, ze som prechod na C odlozil. Az neskor bol ten kod sluslnejsi a aj napriek tomu som volil vhodnu syntax pisania, abych dosiahol lepsi vysledok.
Moderne prekladace su niekde inde.
Nie je problem do C vsadit cast v ASM. Ak by niekto vedel tento problem napisat kratsim ako 0x12 bytovym kodom sem s nim, necham tuto cast v ASM, co moj prekladac umoznuje.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 10:18

Takze ak chces nieco naozaj rychlo tak si to napis ako kus asm integrovany do C kodu.
preto som zalozil toto tema, aby sa nasiel niekto, kto to vie v ASM
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: ARM

Príspevok od používateľa jaromir » 23 Sep 2011, 10:29

xmilos napísal: Tak s tymto nesuhlasim...
...
Ved si potvrdil presne to, co som pisal :wink:

V asm pre 32-bity vela ludi nepise. Snad to suvisi s prirodzenou distribuciou dusevne zdravych ludi medzi programatormi :D
Je pomerne mala pravdepodobnost, ze na svetelektro take nieco/niekoho najdes. Aj ja mam rozne technicke problemy a klucom k uspechu je vyberat si kde sa spytas a co sa spytas.

Skusal si googlit?
http://pygmy.utoh.org/riscy/cortex/led-lpc17xx.html
http://e2e.ti.com/support/microcontroll ... 45978.aspx
http://mbed.org/cookbook/Assembly-Language
http://www.eecs.umich.edu/~prabal/teach ... labs/lab2/
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 11:22

nepozeraj sa na parcialne vysledky.
s tymto nesuhlasim, pisal som preco.

Googlit som este negooglil, zatial mi staci co ste vsetci pisali, vysledok ze nie som mimo misy.
Mam este jedno riesenie, odladim, dam vediet.

A dam dalsi problem:

ako nakonfigurovat onu STM32, aby sli externe prerusenia od pinov.
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: ARM

Príspevok od používateľa jaromir » 23 Sep 2011, 11:25

Netusim ako nastavit prerusenie od externeho pinu, ale ak by som takuto informaciu potreboval, zacnem citat datasheety a reference manuals. Urcite to tam je.
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ARM

Príspevok od používateľa xmilos » 23 Sep 2011, 11:27

jaromir napísal:Netusim ako nastavit prerusenie od externeho pinu, ale ak by som takuto informaciu potreboval, zacnem citat datasheety a reference manuals. Urcite to tam je.
tak tie uz mam za sebou a cakal som prispevok niekoho, kto to rozbehal.
Ono to totiz v Keil simulacii nak nejde mno a chcel som zistit, ci som daco prehliadol, alebo ide o K-bug.
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: ARM

Príspevok od používateľa jaromir » 23 Sep 2011, 11:33

A na skutocnom HW to funguje?
S najvacsou pravdepodobnostou si nieco prehliadol. Nepredpokladam, ze by Keil vypustil do sveta simulator, v ktorom by "zabudli" na tuto zalezitost, zvlast ak stoji tak tazke peniaze.
0

Používateľov profilový obrázok
logan105
Stály člen
Stály člen
Príspevky: 222
Dátum registrácie: 06 Mar 2008, 00:00
Vek: 34
Kontaktovať používateľa:

Re: ARM

Príspevok od používateľa logan105 » 23 Sep 2011, 11:47

odporúčam ti pozrieť stránku www.mcu.cz je tam seriál s STM32 Discovery kitom. Samotný pin síce vyvolá prerušenie ale ty ešte musíš zistiť ktorý pin ho vyvolal, aspoň tak som to pochopil ja. Neostáva ti nič iné ako pozrieť datasheet
0

Napísať odpoveď