I'm developing an embedded application on stm8s microcontroller using STVD IDE and COSMIC compiler.
I'm trying to define a static bool variable to use it to execute a snippet of code only once. Unexpectedly, the variable once is not initialized to FALSE or 0. Although I explicitly initialized it. Here is the snippet of my code:
uint32_t crc32_buffer(void)
{
static bool once = FALSE;
uint32_t crc = 0;
if(!once)
{
calcTable();
crc = 10;
once = TRUE;
}
return crc;
}
When I tried to check the physical memory location, I found that every time after entering a new debugging session (even after hardware restarting the controller) and before running the application itself, the memory address 0x80 has the same value 0x14.
If I modified the code to assign FALSE to once after the variable's initialization:
once = FALSE;
The memory location is changed to contain 0x00. Then if I exit this debugging session and then re-modified the code to delete this line of code and start a new debugging session, I find the memory location 0x80 has again 0x14 before running the application.
I don't understand what can prevent the compiler to initialize the variable to 0. I don't understand what can write 0x14 to the memory location even before running the application.
I tried setting a breakpoint if the memory location 0x80 was accessed (read/write) but the application didn't stop until it reached the if statement in the code snippet.
UPDATE-2
As many pointed out the startup procedure, I don’t use the default startup code. However, I'm using a custom one.
When I used the standard startup code instead of the custom one I was using, the memory locations were set to 0 before main() function start execution. This is not the case with the custom startup code.
So, when I define a new static variable and explicitly initialize it to FALSE, this initialization will only take place in the startup code before main(), right?
mainand check then. It should be initialized by the startup code before main is entered. stackoverflow.com/questions/17783210/…UPDATE-2