ARM, gcc, 8bit pristup do 32bit promenne

Jan Smrz jan.smrz na email.cz
Čtvrtek Červen 22 22:55:27 CEST 2017


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



Další informace o konferenci Hw-list