2012-03-26 84 views
0

我在SCB論壇上問過這個問題,但沒有回答 我試圖從uVision ide將一些項目移植到SCB。 問題始於向量表的實現。對於examle,我有簡單的C++代碼Sourcery CodeBench ARM Cortex-M矢量表實現

#define STACK_TOP 0x20000800 
typedef void (*handler_ptr)(); 

void ResetHandler() { while (1); } 
void NMIHandler() { while (1); } 
void HardFaultHandler() { while (1); } 

__attribute__ ((section("vectors"))) handler_ptr const vector_table[] = { 
    (handler_ptr) STACK_TOP, 
    ResetHandler, 
    NMIHandler, 
    HardFaultHandler, 
}; 

此代碼不能編譯,因爲SCB圖書館尋找「INT主要(無效)」的宣言。 好的,我可以添加這個函數,但是然後SCB忽略我的向量表實現並使用它自己的(如果我調用函數VT中的哪個地址,我會看到SCB僞處理程序)。

我該如何重寫我的SCB VT實現? 請不要使用特殊的SC3函數名稱(用2個IDE支持不好)或將矢量表移動到另一個內存位置。

__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) 

從Luminary Micro的 「startup_gcc.c - 使用的啓動代碼與GNU工具」 也沒有效果

謝謝。

回答

1

當涉及到嵌入式支持的低級C擴展時,您不可能爲兩種編譯器都採用單一方法。即使ARM的官方CMSIS發行版仍針對每個受支持的編譯器單獨啓動。

但是,什麼可能比顯式表聲明更好地工作不包括它。只需聲明你想要實現的處理程序; CMSIS初創公司通常將自己的存根標記爲WEAK函數,因此您的優先權將優先。但是,您需要確保您按照鏈接器的預期使用處理程序的標準名稱(例如Reset_Handler,NMI_Handler,WWDG_IRQHandler等)。有關更多信息,請參閱CMSIS docs和源文件。

注意:需要注意的一件事是確保在編譯爲C++時添加extern "C"標記 - 否則鏈接器將看不到您的處理程序。

+0

伊戈爾,謝謝。你是對的。最好的解決方案是爲每個編譯器分別創建一個頭文件。我在鏈接器文件 - 「.cs3.interrupt_vector」中找到正確的節名稱,但鏈接器在SCB生成後放置我的矢量聲明。 – 2012-03-27 07:27:29

+0

我設法得到一個C++項目,與Keil ARM 6.6和Cortex M7的GCC 6相同的「vectors.c/h」文件。由於Keil編譯器(通過uVision調用 - 需要專用的rant)具有預定義的部分(例如RESET),因此我更改了GCC鏈接器腳本以匹配。更難的部分是設置堆棧是一樣的。沒有完全排除。 – Flip 2017-01-19 08:06:04