我正在使用ARM-GCC編譯器,並在Internet上找到startup_stm32f10x_cl.c文件(啓動代碼)的兩個版本。處理器是:STM32F105RC(ARM Cortex M3)。哪一個是初始堆棧指針的正確值?
公共部分:
#define STACK_SIZE 0x100 /*!< The Stack size */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
然後,第一個版本開始向量表是這樣的:
void (* const g_pfnVectors[])(void) =
{
(void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */
Reset_Handler, /*!< Reset Handler */
...
,而第二個版本是這樣的:
void (* const g_pfnVectors[])(void) =
{
(void *)&pulStack[STACK_SIZE - 1], /*!< The initial stack pointer */
Reset_Handler, /*!< Reset Handler */
...
所以,我的問題是:
哪一個是正確的堆棧點初始化?
只要它們都導致地址與可寫內存正確對齊,那麼除非您試圖從內存中擠出每個RAM的最後一個字節,否則它並不重要。 – Notlikethat
@Notlikethat:所以,你說的是,在第二個版本中有4個字節(未使用)。在這種情況下是否可能(通常)有某種安全防護存儲區? –
我不會說它裏面有太多的安全性(這個例子可能只是一個人不確定一個堆棧推動是後減量還是預減量),但是沒有什麼可以阻止你在上面有一些固定的全局存儲區域堆棧如果你真的想要,或者開始堆棧和堆在RAM中間增長遠離其他Itanium風格,或其他任何;) – Notlikethat