2016-08-12 68 views
4

我正在使用FreeRTOS開發Cortex M0的代碼,並使用AC6插件進行蝕刻。在我的任務結束時,我使用斷言來確定我的任務的水印是否大於指定的任務大小。我用我的斷言宏是這樣的:Cortex M0不支持的CPSID i彙編指令

#define HMI_DBG_ASSERT(x) if ((x) == 0) {taskDISABLE_INTERRUPTS(); \ 
        HAL_GPIO_WritePin(ASSERT_LED_GPIO_Port, ASSERT_LED_Pin, GPIO_PIN_SET); \ 
        for(;;);} 

我的任務是這樣的:

for(;;) 
{ 
    //some 
    //code 
    uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL); 
    HMI_DBG_ASSERT(uxHighWaterMark >= WDG_STACK_SIZE_WATERMARK_WORD); 
} 

這編譯和完美的作品!我的問題是,我工作的通用代碼與其他開發者,他用一個宏幾乎是相同的地雷:

#define CMN_DBG_ASSERT(x) if ((x) == 0) {taskDISABLE_INTERRUPTS(); \ 
        HAL_GPIO_WritePin(ASSERT_LED_GPIO_Port, ASSERT_LED_Pin, GPIO_PIN_SET); \ 
        for(;;);} 

當我把這個宏,我的編譯器返回以下錯誤:

selected processor does not support `cpsid i' in Thumb mode 

「taskDISABLE_INTERUPTS();」宏由FreeRTOS的定義,並調用下面的彙編指令:

__asm volatile(" cpsid i ") 

我覺得很奇怪,我的編譯器不與我的其他宏觀抱怨,但這個它。另外,我嘗試在我的CMN_DBG_ASSERT被調用的.c文件中使用我的HMI_DBG_ASSERT,並且得到相同的錯誤。我確定我的代碼正確地包含了這個文件,並且指定了我在eclipse中的包含路徑。 Cortex-M wiki說「CPSIE和CPSID也不存在,因爲Cortex-M中缺少ARM指令集,其他CPS指令仍然存在於Cortex-M中。」

ARM的網站上確實有對CPSIE和CPSID其文檔中的規範的Cortex-M0:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/BABHBAAB.html

在任何情況下,宏已被調用之前,它工作得很好,它只是真的奇怪我的編譯器現在只是在抱怨。我的一位同事使用IAR Cortex-M版試用了這個宏,它工作的很好......我開始認爲它是另一個奇怪的日食問題。

任何人都可以解釋我遇到的問題嗎?

+0

您使用宏,而不是功能的任何理由將是很好的做法? – Olaf

+0

這是我最初的同事的想法,我只是用他的代碼。我認爲這個問題不存在,因爲這個宏在過去有效。 –

+0

您使用的是什麼,以及您傳遞給它的是哪些選項? (我不確定「AC6插件」是什麼) – Notlikethat

回答

1

已解決。不知何故,我的文件夾與通用代碼有不同的生成設置比我的項目中的其他文件夾,並且-mcpu標誌不存在。要重置建配置爲默認:

右鍵點擊文件夾 - >資源配置 - >重置爲默認