Hi,
In order to introduce my issue, my goal is to get 2 similar projects, one compiled by Arm Compiler for Embedded 6 and the other by GCC, both on a FVP Cortex R-52 target.
I chose to build the project on the example available when installing Arm Development Studio named startup_Cortex-R52.
Concerning the Arm Compiler part I have no issues, project works fine as I did not change anything. So I tried to build my second project, compiled by GCC based on the startup_Cortex-R52 example.
I added the GCC 10.3.1 toolchain to Arm Developement Studio and choosed this toolchain in the Tool Chain Editor of my project. I have also set up my project by giving these options in project properties for both GCC Compiler and Assembler : -mcpu=cortex-r52 -mfpu=neon-fp-armv8 -mfloat-abi=hard
Errors occur when I try to build the project and specially in the startup.s file are related to Assembler messages :
I am wondering why I faced this issues as the target is the same and Assembler language too.
If someone can help me to resolve this issue I would be grateful.
Regards, Enzo
Hi Stephen thanks for your answer,
Thanks to the Trace windows that you helped me to set up, I can see what is going wrong.
So, when I reach the printf function in my main.c and see associated instruction execution I can see that the exception occurs in the puts function and it seems to be a HANDLE_DATA_ABORT (16) Exception (by the way I do not know what 16 mean there).
As you suggested I made my stack bigger :
Unless I'm wrong, It seems that the stack is not the issue as the SP value is included in my stack range when the Exception occurs :
And thanks to your tips on breakpoints I noticed that it's redirect to EL1_Abort_Addr which is consistent with the Exception : HANDLE_DATA_ABORT.
I thought it was a heap issue as printf uses heap but I tried to delete the starting address parameter (0x12000) and also to extend heap size independently but the exception occurs as well.
Maybe I am missing something as I am a beginner on Arm DS.
Thanks again for your help Stephen, it really helps me to go through my project configuration.
Enzo
Hi again EnzoA data abort will occur if an attempt is made to read/write a memory location, but there is no memory at that address, or the MPU has blocked access to that address.The trace view shows the data abort is caused by the "LDR r0,[r3,#0]" instruction at 0xCF6, which is trying to load a 32-bit word from the address held in r3. Set a breakpoint on that instruction and run to it. Check the value of r3 in the Registers view. Is it a sensible address? If so, perhaps the MPU is not being programmed correctly, and access to that memory is accidentally being blocked. Try temporarily disabling the MPU (either comment out the call to enable_mpu(), or use the Registers view to clear the M bit in the System Control register before executing the LDR).I suspect the problem might be related to the placement of __data_end in your gcc.ld. In startup.S, the MPU config for "Region 1 - Data" should cover both the RW (.data) _and_ ZI (.bss) regions. I suggest you check that the memory regions programmed in the MPU config code and the corresponding base/limit symbols in your gcc.ld are as expected.Hope this helpsStephen
Hi Stephen,
As you suggested I moved my __data_end to the last line of .bss in the linker script gcc.ld.
I had another DATA_ABORT issue because the address was already used.
As we can see in the map file :
So I shifted all my symbols after that line by 0x04 :
My map file finally looks like this :
And this works,both printf function and my configuration are working well. I am just wondering if there is a cleaner way to do the shifting ?
Thanks for everything Stephen, I am so glad my configuration with GCC is finally working. I hope it will be useful for other users.
Hi EnzoGlad to hear that your project is now working :)Stephen
EnzoL I am trying to create this exact project using GCC! Would you be able to provide it as a .zip file here for me?
I would greatly appreciate it!
Chris