ARM, gcc, 8bit pristup do 32bit promenne

Jan Waclawek konfera na efton.sk
Pátek Červen 23 02:14:17 CEST 2017


>Pokud ale kompiluji s nastavenim -o0, tak se prelozi takto:

-o0? snad -O0, nie?

S nicim podobnym som sa este nestretol, mozno preto, lebo -O0 by ma v
zivote nenapadlo pouzit, mozno s vynimkou nejakeho takehoto testovania;
nevidim ziadny racionalny dovod ho pouzivat v praxi. Tiez je fakt, ze roky
pouzivam tu istu verziu gcc 4.volakolko, bytostne nenavidim update niecoho
osvedceneho, ak na to nevidim nejaky velmi konkretny a padny dovod.

Skuste ako prve vypustit vsetko co by sa mohlo tykat problemov s
preprocesorom, cestami atd., t.j. prelozte priamo subor s tymto obsahom:

#include <stdint.h>
typedef struct {
  volatile uint32_t ACR;
} FLASH_TypeDef;
volatile uint32_t a;
int main(void) {
  a = ((FLASH_TypeDef *)0x40022000)->ACR;
}


Ake ine prepinace su nastavene? Skuste spustit preklad  s pridanim -v ,
pozrite si s akymi prepinacmi spusta samotny prekladac, popozerajte sa v
dokumentacii, co ten-ktory pouzity prepinac vlastne znamena.

wek


----- Original Message ---------------

Subject: ARM, gcc, 8bit pristup do 32bit promenne
   From: Jan Smrz <jan.smrz at email.cz>
   Date: Thu, 22 Jun 2017 22:55:27 +0200
     To: hw-list at list.hw.cz

>Zdravim,
>
>prosim o pomoc s problemem. Mam pocit, ze jsem dokonce podobny problem 
>uz videl nekde resit, ale nemohu to najit.
>
>Kompiluji kod pro STM32F1, pouzivam arm-none-eabi-gcc 5.4.1, ale zkousel 
>jsem i 6.2 a problem je tam stejny.
>
>V kodu mam uint32_t i = FLASH->ACR, t.j. ctu 32bitovy FLASH registr.
>
>Pokud kompiluji s optimalizaci 1 a vyse, radka se prelozi nasledovne:
>
>08000340    ldr    r2, [r3, #0]
>
>Coz funguje bez problemu.
>
>
>Pokud ale kompiluji s nastavenim -o0, tak se prelozi takto:
>
>08000340    ldrb    r2, [r3, #0]
>
>t.j. jen 8-bitovy pristup, coz pak vyvola bus-fault.
>
>Neresil nekdo neco podobneho? Pro uplnost pridam i definice registru (z 
>core_cm3.h a stm32f103xe.h):
>
>
>#define     __IO    volatile
>
>typedef struct
>{
>   __IO uint32_t ACR;
>   __IO uint32_t KEYR;
>   __IO uint32_t OPTKEYR;
>   __IO uint32_t SR;
>   __IO uint32_t CR;
>   __IO uint32_t AR;
>   __IO uint32_t RESERVED;
>   __IO uint32_t OBR;
>   __IO uint32_t WRPR;
>} FLASH_TypeDef;
>
>#define PERIPH_BASE           ((uint32_t)0x40000000)
>#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
>#define FLASH_R_BASE          (AHBPERIPH_BASE + 0x2000) /*!< Flash 
>registers base address */
>
>#define FLASH               ((FLASH_TypeDef *) FLASH_R_BASE)
>
>
>J.S.
>
>
>---
>Tato zpráva byla zkontrolována na viry programem Avast Antivirus.
>https://www.avast.com/antivirus
>
>_______________________________________________
>HW-list mailing list  -  sponsored by www.HW.cz
>Hw-list at list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list