Я разрабатываю код для Cortex M0 с использованием FreeRTOS и eclipse с плагином AC6. В конце своих задач я использую assert, чтобы определить, превышает ли водяной знак моей задачи указанный размер задачи. Макрос, который я использую для утверждения, выглядит так:
#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 " )
Мне кажется странным, что мой компилятор не жалуется на другой мой макрос, а вот на этот. Кроме того, я попытался использовать свой HMI_DBG_ASSERT в файле .c, где вызывается мой CMN_DBG_ASSERT, и получил ту же ошибку. Я убедился, что мой код правильно включает файл и указан мой путь включения в eclipse.
В вики Cortex-M говорится, что «CPSIE и CPSID также не существуют, потому что набор инструкций ARM отсутствует в Cortex-M. Другие инструкции 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, попытался использовать макрос, и он работал нормально ... Я начинаю думать, что это еще одна странная проблема с затмением.
Может ли кто-нибудь пролить свет на мою проблему?
do{}while()
, чтобы он не взаимодействовал сelse
. - person Peter Cordes   schedule 12.08.2016-march
и / или-mcpu
не передаются ассемблеру. Предположительно, я бы начал с указания пальцем в сторону Eclipse и запутанной разницы между изменением настроек сборки для всего проекта и изменением их для определенных файлов. - person Notlikethat   schedule 12.08.2016