Cortex M0 不支持 CPSID i 汇编指令
CPSID i assembly instruction not supported by Cortex M0
我正在使用 FreeRTOS 和带有 AC6 插件的 eclipse 为 Cortex M0 开发代码。在我的任务结束时,我使用断言来确定我的任务的水印是否大于指定的任务大小。我用于断言的宏如下所示:
#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( ;; );}
当我调用这个宏时,我的编译器returns出现以下错误:
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 and CPSID also don't exist because ARM instruction set is missing from Cortex-M. Other CPS instructions still exists in the Cortex-M."
ARM 的网站在其 Cortex-M0 文档中确实有 CPSIE 和 CPSID 的规范:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/BABHBAAB.html
无论如何,该宏之前已被调用并且运行良好,我的编译器现在只是抱怨真的很奇怪。我的一位使用 IAR Cortex-M 版本的同事尝试使用宏并且它工作正常......我开始认为它是另一个奇怪的日食问题。
任何人都可以阐明我遇到的问题吗?
已解决。不知何故,我的带有公共代码的文件夹与我项目中的其他文件夹具有不同的构建设置,并且 -mcpu 标志不存在。要将构建配置重置为默认值:
右键单击文件夹 -> 资源配置 -> 重置为默认值
我正在使用 FreeRTOS 和带有 AC6 插件的 eclipse 为 Cortex M0 开发代码。在我的任务结束时,我使用断言来确定我的任务的水印是否大于指定的任务大小。我用于断言的宏如下所示:
#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( ;; );}
当我调用这个宏时,我的编译器returns出现以下错误:
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 and CPSID also don't exist because ARM instruction set is missing from Cortex-M. Other CPS instructions still exists in the Cortex-M."
ARM 的网站在其 Cortex-M0 文档中确实有 CPSIE 和 CPSID 的规范:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/BABHBAAB.html
无论如何,该宏之前已被调用并且运行良好,我的编译器现在只是抱怨真的很奇怪。我的一位使用 IAR Cortex-M 版本的同事尝试使用宏并且它工作正常......我开始认为它是另一个奇怪的日食问题。
任何人都可以阐明我遇到的问题吗?
已解决。不知何故,我的带有公共代码的文件夹与我项目中的其他文件夹具有不同的构建设置,并且 -mcpu 标志不存在。要将构建配置重置为默认值:
右键单击文件夹 -> 资源配置 -> 重置为默认值