arm-gcc release

Josef Štengl ok1ced na nagano.cz
Sobota Říjen 5 09:28:53 CEST 2013


Dát si pozor na out-of-order optimalizace zápisy např. GIO pinů. Zejména při komunikaci s perifériemi se často stává, že 
autor zapomene na volatile a myšlená čekací smyčka a změna pinu pin 1-0-1 se vyoptimalizuje do ztracena (z hlediska 
překladače to je zbytečný kód, nic nedělá).

Důležité je nic nepředpokládat. C je jazyk s jednou velmi nepříjemnou vlastností. Má úzkou vazbu na daný HW (zejména 
celočíselné typy) a zároveň se snaží o platformovou nezávislost a nese si (historicky) vlastnosti překladačů dob dávno 
minulých.

Další možný problém je spoléhat na přetečení  a šířky proměnných u cyklů.

spoléhat se na přetečení případě

int8_t i = 44;

while (i > 0)
{
   i++;
}

je dost ošemetné, protože kompilátor může použít registr (i nebude 8 bit ale 16 (32) bit) a pokud bude dost agresivní, tak 
i vyhodit podmínku. a usoudit, že je to vlastně nekonečná smyčka.

Nevím jestli je to nejvhodnější příklad, mám to zafixováno pod „nikdy nedělat” a zapomínám už proč. Lenost se 
zapomnětlivostí je dost depresivní kombinace :-(.

ced



Dne 4.10.2013 16:12, Michal Grunt napsal(a):
> Popeláře nastavím. Použití -Os si asi zatím rozmyslím. Občas mám problém napsat program tak, aby to pochopil i procesor :-) a s -Os bych si asi zadělal na další problémy... Nebo je nějaké doporučení (mimo ty co jste popsal) jak program napsat tak, aby se "nezoptimalizovala" i jeho funkčnost?
>
> Michal Grunt
>
> ________________________________________
> Odesílate: hw-list-bounces na list.hw.cz [hw-list-bounces na list.hw.cz] za uživatele Miroslav Mraz [mraz na seznam.cz]
> Odesláno: 4. října 2013 14:49
> To: HW-news
> Předmět: Re: arm-gcc release
>
> Ještě bych přidal pro kompilaci -ffunction-sections -fdata-sections a
> pro linkování -Wl,--gc-sections. Protože pokud používáte
> -DUSE_STDPERIPH_DRIVER, pak ve výsledném .hex zbude i kód (data), který
> procesor vůbec nepoužívá. Takhle to ten popelář linkeru odstraní.
> Na to -Os trochu pozor - globální proměnné, které sdílí např. main() a
> přerušení musí být deklarovány jako volatile. Ale stejně tak třeba jen
> řídící proměnná nějakého zpožďovacího cyklu - ty optimalizace jsou
> poměrně zrádné. Jinak se můžete dočkat nepříjemného překvapení.
>
> Mrazík
>
> On 10/04/2013 01:14 PM, Ladislav Vaiz wrote:
>> Misto -O0 dejte -Os
>> L.
>>
>> On Fri, 4 Oct 2013, Michal Grunt wrote:
>>
>>> Může mi někdo poradit, co nepatří za přepínače do "release" makefile?
>>> Aby měl výsledný hex co nejmenší velikost...
>>>
>>> -IC:\xxxxx - představuje několik adresářů, zkráceno pro přehlednost
>>> na jeden
>>>
>>> arm-none-eabi-gcc -DUSE_STDPERIPH_DRIVER -DSTM32F0XX
>>> -DRUN_FROM_FLASH=1 -IC:\xxxxx -O0 -Wall
>>> -Wa,-adhlns="system_stm32f0xx.o.lst" -c -fomit-frame-pointer
>>> -fverbose-asm -MMD -MP -MF"system_stm32f0xx.d"
>>> -MT"system_stm32f0xx.d" -mcpu=cortex-m0 -mthumb -o
>>> "system_stm32f0xx.o" "../system_stm32f0xx.c"
>>>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> 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