.text variable and optimization issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I'm trying to write a helper functions for arm microcontroller, that
will help to determine if program is run for the first time after
programming. I'm using STM32 chip, with ability to modify it's flash
memory at runtime.
The idea is to put const variable into flash memory (.text)  let's
name it SIGNATURE, and then, during initialization sequence check for
that variable value and eventually change it in flash under it's
address (&SIGNATURE). When program will be launched next time, this
variable will be already changed, letting you know that this is not a
first run.

Here is a simple  code snippet to do that

const uint16_t CFlashSignature::SIGNATURE = 0xFFFF; //initial value in flash.

bool CFlashSignature::isFristRun()
{
	return *(uint16_t*)&SIGNATURE; //it must be written that way,
otherwise program will not always notice change at SIGNATURE's address
}

void CFlashSignature::setSignature()
{
	if(isFristRun())
	{
		FLASH_Unlock();
		FLASH_ProgramHalfWord((uint32)&SIGNATURE,0); //this function writes
0 at signature's address
		FLASH_Lock();
		
	}
}


and those functions are working as intended, but inly with NO
optimization enabled, when i add any optimization (-Ox) isFirstRun()
method always returns true! as if

return *(uint16_t*)&SIGNATURE;

was translated to

return 0xffff;

or something, i'm not exactly sure.

I could disable optimization for this translation unit as a
workaround, but there is no guarantee it stays that way in future
versions of gcc or something.

So in general, I need 2 byte variable that will be always in .text and
it's address should obtainable at any point. Any suggestions how to
achieve it to be 100% it will be there?

Regards
Marcin.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux