我正在使用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版试用了这个宏,它工作的很好......我开始认为它是另一个奇怪的日食问题。
任何人都可以解释我遇到的问题吗?
您使用宏,而不是功能的任何理由将是很好的做法? – Olaf
这是我最初的同事的想法,我只是用他的代码。我认为这个问题不存在,因为这个宏在过去有效。 –
您使用的是什么,以及您传递给它的是哪些选项? (我不确定“AC6插件”是什么) – Notlikethat