I am porting FreeRTOS 8.0.0 to other ARMv7 platforms based on the …/portable/GCC/ARM_CA9. I found the system generates data abort when accessing portICCPMR_PRIORITY_MASK_REGISTER.
portICCPMR_PRIORITY_MASK_REGISTER is defined as ( *( ( volatile uint8_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) in portmacro.h. According to ARM IHI0048B GIC Architecture Specification, section 4.1.4, all registers support 32-bit access. Some registers support 8-bit access. All other accesses are implementation dependent.
I changed portICCPMR_PRIORITY_MASK_REGISTER to 32-bit wide register, the data abort goes away.
Does the register width change make sense?
Is there any side effect of the width change?
The ICCPMR register is a 32-bit register, but only the least significant byte is implemented. The other three bytes are “Reserved”, and should be read as zero with writes ignored. Therefore I would not have thought it made any difference, but evidently it does. I think you would have to look at the assembly code generated to work out what the problem is.
The assembly code was 8-bit load ‘ldrb’ when it is declared as (uint8_t *). The ldrb instruction causes data abort. After changing the definition to (uint32_t *), the assembly code becomes ‘ldr’. No more data abort.