RTV forum PL | NewsGroups PL

Jak używać opóźnień w C++ na platformie GNU ARM z definicjami w ms i us?

Problemy z C++ (GNU ARM)

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak używać opóźnień w C++ na platformie GNU ARM z definicjami w ms i us?

Goto page Previous  1, 2

J.F.
Guest

Fri May 16, 2008 1:03 pm   



On Fri, 16 May 2008 12:27:10 +0200, AK wrote:
Quote:
No i działa Smile... gorzej z mikrosekundami :/... Niestety, jak wpiszę tak:
const float us = 3.025
(...)
for (i=0;i<10*us;i++);

zastanawiałeś się jak mozna wykonać pętlę 30,25 razy ?

zmiennna decydujaca o ilości cykli w instrukcji for musi być całkowita

To jest akurat C i instrukcja jest jak najbardziej poprawna
- warunkek kontynuacji petli dobry jak kazdy inny i petla wykona sie
31 razy :-)

Niestety od dobrej woli kompilatora zalezy jak to skompiluje ..
ale jesli i jest volatile, to nie ma wiekszego wyboru jak zamienic na
float/double i porownac do .. 30.25 ?

Bo na oko to wywoluje konwersje a nie mnozenie.

J.

J.F.
Guest

Fri May 16, 2008 1:08 pm   



On Thu, 15 May 2008 21:28:50 +0200, Konop wrote:
Quote:
No tak, jakbym chciał zdefiniować jedną stałą, to bym nie kombinował z
mnożeniem... ale chodzi o to, ze chciałem mieć możliwość wrzucania
for'ów z róznymi opóźnieniami:
for (i=0;i<1*us;i++);
for (i=0;i<5*us;i++);
for (i=0;i<100*us;i++);

Chyba nie ma sensu definiować stałych _1us, _5us, _100us i wszystkich
innych możliwych Wink...

Uzyj #define cos w rodzaju
#define us(t) ((3025*t)/100)

i miej nadzieje ze kompilator to dobrze obliczy.

bezpieczniej by chyba bylo dalej skrocic i wpisac
((605*t)/25) czy ((121*t)/5)


J.

J.F.
Guest

Fri May 16, 2008 1:25 pm   





J.F.
Guest

Fri May 16, 2008 2:44 pm   



On Fri, 16 May 2008 15:02:15 +0200, AK wrote:
Quote:
jasne - dokona zaokraglenia - ale powinien krzyczeć ze to float
Nie powinien, chyba ze warningiem.

Warunek kontynuacji jest prosty - i<30.25, oczywiscie
((float)i)<30.25, czy nawet ((double) i)) <30.25d

I dokladnie tak ma dzialac jak zapisane :-)

ach to C - w Pascalu musi być całkowity Smile

Bo u Witha petla to petla, a w C to tylko skomasowany sposob zapisu
while .. :-)

J.

Sebastian Bialy
Guest

Fri May 16, 2008 4:16 pm   



Artur M. Piwko wrote:
Quote:
Się było kiedyś koderem na MC68000 Smile
Ja najmilej wspominam 6502.

O też miło wspominam 6502 [Atari rulez :]. Tylko ilośc rejetrów w tym
wynalazku niebezpiecznie zbliżała się do 0. Stąd pewno pomysły "strona
zerowa" itd. Potem po latach podobny potwór koncepcyjny straszył mnie z
x86. Co gorsza straszy do dzisiaj, tylko teraz odpicowany dla niepoznaki.

Zbych
Guest

Fri May 16, 2008 5:34 pm   



Konop przemówił ludzkim głosem:

Quote:
Dzięki za uwagi!! Znalazłem w książce przykład delay'a napisany w asm,
przerobiłem nieco (choć nie rozumiem tych wszytkich znaczków Wink ),
wygląda tak i działa:

static __inline void delay (unsigned long d_time)
{
asm volatile
(
"petla%=:"
"subs %[d_time],%[d_time],#1\t\n"
"bne petla%=\t\n"
: :[d_time]"r"(d_time)
^^^^

Brakuje d_time na liście parametrów wyjściowych - gcc domyślnie uznaje,
że parametry wejściowe wstawek asemblerowych nie są niszczone. Jak
wstawisz po sobie dwa opóźnienia to się możesz zdziwić Smile
Warto także dodać do funkcji __attribute__((always_inline)), inaczej
przy wyłączonej optymalizacji funkcja może nie być inline'owana.

Quote:
kwarcu, no ale to nie problem Smile... gorzej z możliwością generowania
błędu przez kompilator w przypadku, gdy wartości parametru a nie da się
określić w chwili kompilacji - tego, to już nie wiem jak zrobić Sad...

Taka wstawka powinna pomóc:
asm volatile(".error \"Opoznienie nie jest stale\"");

Artur M. Piwko
Guest

Fri May 16, 2008 6:12 pm   



In the darkest hour on Thu, 15 May 2008 21:57:44 +0200,
Sebastian Bialy <heby@poczta.onet.pl> screamed:
Quote:
no ale de-asemblera chyba nie mam ;P...

@arm-elf-objdump -h -S program.elf >program.lst

Dzięki wielkie za sugestię, żeby użyć /

Się było kiedyś koderem na MC68000 Smile

Ja najmilej wspominam 6502.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:232B ]
[ 17:11:47 user up 11709 days, 5:06, 1 user, load average: 0.75, 0.95, 0.04 ]

Cocaine is nature's way of telling you you have too much money.

JS
Guest

Sat May 17, 2008 12:40 am   



W artykule <e1uq24tpq5bgm63bbgceobqadips6trdo3@4ax.com> J.F napisal(a):

Quote:
On Thu, 15 May 2008 21:28:50 +0200, Konop wrote:
No tak, jakbym chciał zdefiniować jedną stałą, to bym nie kombinował z
mnożeniem... ale chodzi o to, ze chciałem mieć możliwość wrzucania
for'ów z róznymi opóźnieniami:
for (i=0;i<1*us;i++);

Uzyj #define cos w rodzaju
#define us(t) ((3025*t)/100)

Można rzutować:

#define us(t) ((int)(30.25*(t)+0.5))
^ zaokrąglenie

AFAIR nawet jeśli w wyrażeniu stałym jest rzutowanie, kompilator
ma prawo (ale nie obowiązek) obliczyć jego wartość i wstawić do
kodu wynikowego pojedyczą stałą.

avr-gcc (20070525) przelicza podczas kompilacji us(10) na stałą 303.

BTW warto dać dodatkowe nawiasy wokół parametru;
przydadzą się, jeśli użyjemy us z wyrażeniem:

us(1+time)

--
Pozdrawiam!
Jarosław Szynal

Goto page Previous  1, 2

elektroda NewsGroups Forum Index - Elektronika Polska - Jak używać opóźnień w C++ na platformie GNU ARM z definicjami w ms i us?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map