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