.text variable and optimization issue
Marcin S
msporysz06@gmail.com
Wed Jul 4 21:45:00 GMT 2012
2012/7/4 Ángel González <keisial@gmail.com>:
> On 04/07/12 22:30, Marcin S wrote:
>> 2012/7/4 Václav Zeman:
>>> The compiler probably sees through your games. The language defines that
>>> constants are really, constant, AFAIK. Try changing the 'const uint16_t
>>> CFlashSignature::SIGNATURE' to 'const volatile uint16_t
>>> CFlashSignature::SIGNATURE' or just drop the const entirely (and add
>>> volatile).
>> Hi,
>> Yes, i did tried this before, unfortunately with this modifier
>> (volatile or omitting const at all) makes variable not to land in
>> .text (flash) but in RAM, so, this won't do me any good if flag will
>> reset after power down - i need it to be persistent, thats the whole
>> point.
> Have you tried adding an explicit section attribute?
>
> __attribute__ ((section (".text")));
>
> http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bsection_007d-function-attribute-2598
Yes, when tried to put non-const var into .text, the attribute is
ignored and it lands in ram anyway :(
But i came up with new implementation, so far its working with any
level of optimization and it leaves little or no room for it.
const uint16_t CFlashSignature::SIGNATURE = 0xFFFF;
uint32_t CFlashSignature::addr = (uint32_t)&CFlashSignature::SIGNATURE;
bool CFlashSignature::isFristRun()
{
return *(uint16_t*)addr;
}
CFlashSignature::TFlashUpdResult CFlashSignature::setSignature()
{
if(isFristRun())
{
FLASH_Unlock();
FLASH_ProgramHalfWord(addr,0);
FLASH_Lock();
}
}
I've introduced new RW variable "uint32_t addr" located in ram, which
holds an address to SIGNATURE and its used for reading and writing
operations. It's in global scope and its loaded at run time, ATM i
don't see how this could be optimized.
Any thoughts on that solution?
More information about the Gcc-help
mailing list