Fwd: STM CUBE - zkusenosti
Jiří Nesvačil
nesvacil na posys.eu
Neděle Říjen 4 21:12:10 CEST 2015
Zdravím,
děkuji. Ten překladač již taky nemám, jen si na to vzpomínám. Nicméně mi tam to volatile v definici těch adres za periferie v STM knihovnách chybí.
On to někdo použije a je z toho chyba.
U maple jsem se díval na obecné metody zápisu čtení z GPIO a zpět. A našel poznámku viz níže.
Nejspíš v té verzi asi chybí taky volatile.(Nevím jak aktuální.) Je si na to dobré dávat pozor.
https://github.com/leaflabs/maple-bootloader/blob/master/hardware.h
/* todo: there must be some major misunderstanding in how we access
regs. The direct access approach (GET_REG) causes the usb init to
fail upon trying to activate RCC_APB1 |= 0x00800000. However, using
the struct approach from ST, it works fine...temporarily switching
to that approach */
typedef struct {
vu32 CR;
vu32 CFGR;
vu32 CIR;
vu32 APB2RSTR;
vu32 APB1RSTR;
vu32 AHBENR;
vu32 APB2ENR;
vu32 APB1ENR;
vu32 BDCR;
vu32 CSR;
} RCC_RegStruct;
#define pRCC ((RCC_RegStruct *) RCC)
Jirka
Dne 4. 10. 2015 v 20:23 Ales Povalac napsal(a):
> Dobrý den,
>
> toto je bug překladače, který mě před pár roky také potrápil. Je
> reportovaný na http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45052 .
> Týká se verze GCC 4.5.1, použité v Sourcery G++ Lite 2010.09-51 a
> Atollic Studiu 2.1.0. Novější verze GCC už potíže nemají.
>
> Zdravím
> A. Povalač
>
>
> Dne 4. října 2015 20:16 Jiří Nesvačil <nesvacil na posys.eu> napsal(a):
>> Zdravim,
>> konkretne kod pro test, zda flash je resetovana (je i v cube) vola interni
>> metodu(viz nize) pro zjisteni stavu banky a zavola se jen jednou. Prekladac,
>> vse co je v jednom *.c souboru optimalizuje. Pomohlo az slovo volatile pred
>> FLASH.
>>
>> gcc version 4.5.1 (Sourcery G++ Lite 2010.09-51)
>>
>> Zkuste si dat slovo volatile pred tyhle zakladni odkazy v *.h souboru a
>> uvidite jestli se Vam zmeni velikost prekladu, atp. . Nebo ten kdo ovlada
>> asm muze i tam zkouknout.
>>
>>
>> FLASH_Status FLASH_GetBank1Status(void)
>> {
>> FLASH_Status flashstatus = FLASH_COMPLETE;
>>
>> if((FLASH->SR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY)
>> {
>> flashstatus = FLASH_BUSY;
>> }
>> else
>> {
>> if((FLASH->SR & FLASH_FLAG_BANK1_PGERR) != 0)
>> {
>> flashstatus = FLASH_ERROR_PG;
>> }
>> else
>> {
>> if((FLASH->SR & FLASH_FLAG_BANK1_WRPRTERR) != 0 )
>> {
>> flashstatus = FLASH_ERROR_WRP;
>> }
>> else
>> {
>> flashstatus = FLASH_COMPLETE;
>> }
>> }
>> }
>> /* Return the Flash Status */
>> return flashstatus;
>> }
>>
>>
>> Dne 4. 10. 2015 v 19:56 Jan Waclawek napsal(a):
>>
>>> No, prisne vzate podla normy, pretypovanie konstanty na pointer je
>>> implementation defined a moze skoncit vselijako, a to najma zle (C99
>>> 6.3.2.3#5). Dalej, co znamena volatile, je tiez implementation defined
>>> (C99 6.7.3#6). A ano, cital som Regehrovo pojednanie na danu temu
>>> https://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf .
>>>
>>> Na druhej strane, oboje - aj pretypovanie konstanty na struct, aj
>>> oznacovanie poloziek structu ako volatile - je dnes zauzivanym standardom,
>>> takze ma dost prekvapuje, ze sa najde nearchaicky prekladac, ktory toto
>>> nezvlada.
>>>
>>> Mozete byt prosim konkretny vo verzii a v okolnostiach, pripadne dat
>>> konkretny co najjednoduchsi priklad, ktory by som dokazal zreprodukovat?
>>>
>>> Dakujem
>>>
>>> wek
>>>
> _______________________________________________
> 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