He desarrollado inspirado a partir de aquí un metal desnudo código de inicio para arm cortex M3. Sin embargo, me encuentro con el siguiente problema: supongamos que declaro no inicializado la variable global, digamos de tipo unsigned char principal.c
#include ...
unsigned char var;
...
int main()
{
...
}
esto hace que el .bss región en STM32 f103 partir de _BSS_START=0x20000000 y terminando en _BSS_END = 0x20000001. Ahora, la puesta en marcha de código
unsigned int * bss_start_p = &_BSS_START;
unsigned int * bss_end_p = &_BSS_END;
while(bss_start_p != bss_end_p)
{
*bss_start_p = 0;
bss_start_p++;
}
intenta inicializar a cero todo .bss región. Sin embargo, dentro de ese bucle while el puntero se incrementa con 4 bytes, por lo tanto, después de un paso bss_start_p = 0x20000004 por lo tanto siempre será diferente de bss_end_p que lleva a un bucle infinito etc.
¿Hay alguna solución estándar a esto? Soy supongo que a la "fuerza" de alguna manera la dimensión de la .bss región para ser un múltiplo de 4? O debo usar un puntero a unsigned char a caminar a través .bss región? Quizás algo como:
unsigned char * bss_start_p = (unsigned char *)(&_BSS_START);
unsigned char * bss_end_p = (unsigned char *)(&_BSS_END);
while(bss_start_p != bss_end_p)
{
*bss_start_p = 0;
bss_start_p++;
}