2016-08-12 41 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标志不存在。要重置建配置为默认:

右键点击文件夹 - >资源配置 - >重置为默认