Инструкция по сборке CPSID i не поддерживается Cortex M0

Я разрабатываю код для 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, попытался использовать макрос, и он работал нормально ... Я начинаю думать, что это еще одна странная проблема с затмением.

Может ли кто-нибудь пролить свет на мою проблему?


person Roberto Viglione    schedule 12.08.2016    source источник
comment
По какой причине вы используете макрос, а не функцию, что было бы хорошей практикой?   -  person too honest for this site    schedule 12.08.2016
comment
Сначала это была идея моего коллеги, и я просто использовал его код. Я думаю, что это не относится к проблеме этой проблемы, потому что макрос действительно работал в прошлом.   -  person Roberto Viglione    schedule 12.08.2016
comment
Какой toochain вы используете, и какие параметры вы ему передаете? (Я не уверен, что это за плагин AC6)   -  person Notlikethat    schedule 12.08.2016
comment
GCC. -mcpu = cortex-m0 -mthumb -mfloat-abi = soft -D__weak = attribute __ ((weak)) -DALIZETI_USE_HMI_DB -DALIZETI_IS_HMI -D__packed = _attribute __ (( _packed)) -DUSE_HAL_DRIVER -DSTM32F072xB -DALIZETI_USE_BMS_DB -I ../../../ Inc -I ../../../ Драйверы / STM32F0xx_HAL_Driver / Inc -I ../../../ Драйверы / STM32F0xx_ IncHAL_Driver / / Legacy -I ../../../ Middlewares / Third_Party / FreeRTOS / Source / portable / GCC / ARM_CM0 -I ../../../ Middlewares / Third_Party / FreeRTOS / Source / include -I .. /../../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -   -  person Roberto Viglione    schedule 12.08.2016
comment
ах, набор инструментов, OpenSTM32   -  person Roberto Viglione    schedule 12.08.2016
comment
это действительно сработало - стандартное оправдание плохого стиля программирования ...   -  person too honest for this site    schedule 12.08.2016
comment
cplusplus.com/reference/cassert/assert   -  person Roberto Viglione    schedule 12.08.2016
comment
Похоже на проблему конфигурации. Отвечает ли AC6 за создание файлов для конкретной платформы? Думаю, это так. Дважды проверьте настройки, которые вы использовали, чтобы они соответствовали вашему целевому процессору. Если они верны, вероятно, это просто ошибка, и о ней следует сообщить разработчику.   -  person Eugene Sh.    schedule 12.08.2016
comment
Если вы действительно хотите использовать макрос, по крайней мере, заключите его в do{}while(), чтобы он не взаимодействовал с else.   -  person Peter Cordes    schedule 12.08.2016
comment
Что ж, похоже, что соответствующие параметры -march и / или -mcpu не передаются ассемблеру. Предположительно, я бы начал с указания пальцем в сторону Eclipse и запутанной разницы между изменением настроек сборки для всего проекта и изменением их для определенных файлов.   -  person Notlikethat    schedule 12.08.2016
comment
@ Notlik, что я думаю, что нашел свою проблему, моя папка с общим кодом не имеет опции -mpcu, я попытаюсь понять, чем это вызвано.   -  person Roberto Viglione    schedule 12.08.2016


Ответы (1)


Решено. Каким-то образом моя папка с общим кодом имела другие настройки сборки, чем другие папки в моем проекте, и флаг -mcpu отсутствовал. Чтобы восстановить конфигурацию сборки по умолчанию:

Щелкните правой кнопкой мыши папку -> Конфигурации ресурсов -> Восстановить значения по умолчанию

person Roberto Viglione    schedule 12.08.2016