Fwd: STM CUBE - zkusenosti

Jiří Nesvačil nesvacil na posys.eu
Neděle Říjen 4 20:16:14 CEST 2015


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
>
>
>
> ----- Original Message ---------------
>> To mozna jo, ale moc jim to nepomuze, kdyz to nepouziji viz Cube z includu vytazene:
>>
>> #define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
>> #define APB1PERIPH_BASE       PERIPH_BASE
>> #define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
>> #define FLASH_R_BASE          (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */
>> #define FLASH_R_BASE          (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */
>> #define FLASH               ((FLASH_TypeDef *) FLASH_R_BASE)
>>
>>
>> Nebo, kdyz to precastuji bez volatile, jak je ta ktera verze compileru chytra ?
>>
>>
>> Jirka
>>
>>
>> Dne 4. 10. 2015 v 19:19 Jan Waclawek napsal(a):
>>> Nemate pravdu, pan kolega.
>>>
>>> Aby som bol konkretny, tak napr. pre STM32F4xx je v stm32f4xx.h
>>>
>>> typedef struct
>>> {
>>>     __IO uint32_t ACR;      /*!< FLASH access control register,   Address
>>> offset: 0x00 */
>>>     __IO uint32_t KEYR;     /*!< FLASH key register,              Address
>>> offset: 0x04 */
>>>     __IO uint32_t OPTKEYR;  /*!< FLASH option key register,       Address
>>> offset: 0x08 */
>>>     __IO uint32_t SR;       /*!< FLASH status register,           Address
>>> offset: 0x0C */
>>>     __IO uint32_t CR;       /*!< FLASH control register,          Address
>>> offset: 0x10 */
>>>     __IO uint32_t OPTCR;    /*!< FLASH option control register ,  Address
>>> offset: 0x14 */
>>>     __IO uint32_t OPTCR1;   /*!< FLASH option control register 1, Address
>>> offset: 0x18 */
>>> } FLASH_TypeDef;
>>>
>>> __IO je predpisane priamo ARMom, nachadza sa (pre tento pripad) v
>>> core_cm4.h ktory je do stm32f4xx.h includnuty, a je definovany ako
>>>
>>> #define     __IO    volatile             /*!< Defines 'read / write'
>>> permissions              */
>>>
>>> wek
>>>
>>>
>>>
>>>> Aby to bylo konkretni, tak napr toto je ve vsech knihovnach STM
>>>>
>>>> // BUG
>>>> //#define FLASH               ((FLASH_TypeDef *) FLASH_R_BASE)
>>>> #define FLASH               ((FLASH_TypeDef volatile *) FLASH_R_BASE)
>>>>
>>>> Pokud se na tu periferii odkazete v kodu, budete cekat v cyklu, tak se nedockate (nema volatile). Je to odkaz do pameti a ten compiler precte jen jednou. Podobne na to narazi i jini, ale nevi proc jim to nejde.
>>>>
>>>> Jirka
>>>>
>>>>
>>>> Dne 4. 10. 2015 v 10:16 Jiøí Nesvaèil napsal(a):
>>>>> Kdyz vyvojari STM se nenaucili klicove slovo volatile. Pote ty knihovny s ruznou optimalizaci prekladu, ci ruznou verzi GCC chodi za roh. Je to bohuzel ve vsech knihovnach. Pokud Vam neco nejde, tak musite napsat sami.
>>>>> Napriklad zapis do FLASH, sice je v include precastovani, ale to nema priznak volatile. Protoze odkazy na porty jsou jako odkazy do pameti, tak to optimalizator vezme a i pres funkce v jednom *.c souboru zoptimalizuje na jedno cteni a cekani
>>>>> nechodi. Bohuzel to je vsude. V CUBE se to snazili predelat definici _IO, ale to moc nepomohlo, staci volatile.
>>>>>
>>>>> Jirka
>>>>>
>>>>>
>>>>> Dne 3. 10. 2015 v 1:03 Jan Waclawek napsal(a):
>>>>>>> Jdu spat a zitra nevim jestli to spis zahodim a vratim se k SPL nebo
>>>>>>> jeste neco zkusim...
>>>>>> Cesta spat je nemozna, musite prejst na LL :-)
>>>>>> http://www.mikrozone.sk/news.php?extend.1042.4
>>> _______________________________________________
>>> 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