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