 Problem with stack variables in functions relocated to RAM at runtime? Christopher Hicks Dear All, I have the following function relocated to RAM and running from RAM:
u32 ReadOTPData(u8 FMI_OTPAddress) {
u32 OTP_Data = 0x0;
*(vu16 *)(FMI_BANK_1) = 0x98; // issue "read OTP" command
OTP_Data = (*(vu32*)(FMI_BANK_1 + FMI_OTPAddress)); // read OTP data
*(vu16 *)(FMI_BANK_1) = 0xFF; // issue "read FLASH" command
return OTP_Data;
}
This function is called from the following code, which runs from FLASH bank 1:
void GetMACfromOTP(void) {
u32 x[2];
u8 *p = (u8 *)x;
tsk_lock();
x[0] = ReadOTPData(OTP_MAC0_LOCATION);
x[1] = ReadOTPData(OTP_MAC1_LOCATION);
tsk_unlock();
memcpy(own_hw_adr, p, 6);
return;
}
When I run my program it fails somewhere close to the end of the ReadOTPData() function (the first time it is called) and lands at the PAbtHandler stub. If I change the declaration of OTP_Data to be static (or global), then the program runs as I expect. One really weird effect, that worries me a lot, is that if I put a breakpoint on the closing brace of ReadOTPData(), then the program runs correctly in all cases, even when OTP_Data is on the stack. So I am not sure whether this is a silicon issue, a compiler problem, or something else altogether. Anyone seen anything like this before? In case it is relevant, I am using the Realview C++ compiler, and I am runnning this code in an RTL task. Regards, Christopher Hicks == |