Как заставить IAR использовать нужные инструкции Cortex-M0+ (оптимизация будет отключена для этой функции.)

Мне нужно заставить IAR tp использовать определенную инструкцию Cortex-M0+ в некоторой части моего кода при кодировании с C.

Пожалуйста, не предлагайте чисто ассемблерные функции или встроенные ассемблеры и т. Д.

Я сумел сделать это за 51 инструкцию, но не смог; Инструкции ADR, BLX, RSBS, SBCS, SXTH.

Оптимизация для этой функции отключена (#pragma оптимизация = нет)

Я пробовал много вещей, учитывая поведение инструкции. Но IAR предпочитает одну и ту же функцию с разными инструкциями.

Кто-нибудь боролся с такой ненужной вещью раньше или у кого-нибудь есть идея?

2 ответа

Пожалуйста, не предлагайте чисто ассемблерные функции или встроенные ассемблеры и т. Д.

Но это единственное решение вашей проблемы, которое не зависит от версии компилятора.

Ты можешь иметь

удалось сделать это за 51 инструкцию

... но следующая (основная) версия компилятора может иметь совершенно другое представление о том, как генерировать инструкции для вашего кода C, даже когда оптимизатор выключен. BTDT для GCC.

Кодирование на ассемблере полностью исключает эту зависимость версии компилятора. У вас даже должен быть пример кода, так как большая часть кода запуска C (обработчик сброса) поставляется в виде файла на языке ассемблера.

Помимо BLX, который недоступен в Cortex-M, этот код может помочь вам. Может быть, вам нужно включить некоторые оптимизации.

char const * getstr(void)
{
    return "ADR";
}

long long llfunc(long long v1, long long v2)
{
    return v1 - v2;
}

int neg(int i)
{
    return -i;
}


void efunc(short);

void func(short s)
{
    efunc(s + 5);
}
Другие вопросы по тегам