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

... 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

...
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
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
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

),
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ć
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

... 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ć

...
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
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