Tenho um dispositivo Cortex M0+ para o qual desenvolvi um bootloader e um aplicativo, parcialmente baseado em algum código de exemplo do fabricante do CI. No bootloader, logo antes de pular para o aplicativo, o bootloader recupera um endereço para o ponteiro de pilha e o vetor de redefinição do aplicativo. Verifiquei usando o arquivo de mapa do aplicativo que o endereço está correto. No entanto, o endereço do ponteiro de pilha que ele obtém é o endereço mais alto na RAM (0x20008000 neste caso). Meu entendimento é que a pilha Cortex (pelo menos para os dispositivos "inferiores" como o M0) cresce para baixo. Eu só queria confirmar que este é o endereço que se deve esperar que seja usado para o ponteiro de pilha neste cenário.
Este não é um recurso da CPU Cortex em particular. Todas as CPUs ARM (incluindo Cortex) suportam pilhas ascendentes e descendentes, bem como pilhas "cheias" e "vazias".
Uma pilha "ascendente" cresce de endereços de memória baixa para endereços de memória mais altos. Por outro lado, uma pilha "descendente" cresce de endereços de memória alta para endereços mais baixos.
Uma pilha "completa" é aquela em que o ponteiro da pilha aponta para um local de memória que contém dados, e o ponteiro da pilha precisa ser modificado (incrementado ou decrementado) antes de armazenar o próximo valor.
Uma pilha "vazia" é onde o ponteiro da pilha já está apontando para o próximo espaço livre. Para empurrar dados, você os armazena no ponteiro da pilha atual e, então, modifica o ponteiro da pilha.
Tudo isso está descrito aqui e inclui isto:
Portanto, ter o ponteiro de pilha inicial apontando para o final da RAM é o que você esperaria, pois a pilha deve crescer para baixo.