Jak vynutit sekvencni provadeni prikazu u GCC ?
Josef Štengl
ok1ced na nagano.cz
Pondělí Únor 24 14:32:38 CET 2014
Ještě napadlo, jestli by nepomohlo dát výpočet ampcorrr hodnoty do funkce. Podle mě je to schůdnější a méně náročnější na
zdroje než ty šílenosti s __attribute__ (a je to přenositelné), ale dost často se pletu.
Volání funkcí snad mimo pořadí při optimlizaci neprovádí, zejména v případě, že volání funkce dá přímo do kódu
(autoinline). Říkám si, že to prozkoumám, snad se toho někdy dožiji :-/. Nezkoumal to někdo?
ced
Dne 24.2.2014 14:11, Jan Waclawek napsal(a):
> Toto je znamy problem.
>
> https://www.mikrocontroller.net/topic/65923
>
> Pokial viem, na toto neexistuje definitivne riesenie.
>
> Vdaka memory clobberu v cli()/sei() to volatile amp sice symptomaticky
> pomohlo (tak ako pomaha v tom atomic_block), pretoze tym imituje volatile
> pristup instrukcii cli/sei aj ked v skutocnosti tie instrukcie nic s
> pamatou nerobia, ale ucel memory je iny a nie je zarucene, ze aj v
> buducich verziach gcc to bude ako takato "bariera" fungovat.
>
> http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=94571
>
> Pomohlo to pochopitelne preto, lebo aj je amp volatile, to =/ vyzaduje aj
> citanie aj zapis, takze sa samotne delenie nemoze preusporiadat cez ine
> volatile pristupy. Na druhej strane je kazde neodovodnene pouzitie
> volatile plytvanie a je vhodne prepisat tu aritmetiku tak, aby tych
> pristupov bolo co najmenej.
>
> Lepsie riesenie nepoznam. V gcc ako takom sa sice objavili rozne zaujimave
> zabudovane funkcie ako aj v horeuvedenom vlakne spominane __sync_xxx() ,
> ale ich implementacia v avr-gcc() je otazna. Bohuzial, Atmel vykradol
> pracu nadsencov na GNU tooloch bez toho, aby nieco relevantne (featury,
> dokumentaciu) do neho vratil.
>
> wek
>
>
>
>
> ----- Original Message ---------------
>
>> a nepomoze atomic_block?
>>
>> http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html
>>
>> m.
>>
>>
>> -----Original Message-----
>>
>> Pro avr jsem napsal tuto fci:
>>
>> void UpdateAmp()
>> {
>>
>> cli();
>> uint32_t amp = adc_chvals[3];
>> sei();
>>
>>
>> amp *= 20000;
>> amp /= 1023;
>> uint32_t ampcorrr = 45000UL + amp;
>>
>> cli();
>> pwmAmplitude = (uint16_t)ampcorrr;
>> sei();
>>
>>
>> }
>>
>> A problem je, ze deleni 1023 se zaradi pri zapnute optimalizaci az za
>> cli() coz je samozrejme velmi spatne protoze trva dost dlouho.
>> Pomuze vypnout optimalizaci pro tuto funkci
>> (__attribute__((optimize("-O0"))); ) a pomuze i pokud obe lokalni
>> promenne definuju jako volatile - to ale nevim, jestli je spolehlive.
>> Existuje nejaka elegantnejsi metoda?
>>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list