Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: при компиляции Keil C игнорирует функцию -что делать?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
NikP
Для МК STM32F207(на отладочной плате) в микровижене4 на базе примера STM322xG-EVAL написал небольшую программку - формирование импульсов разной длительности с переменным интервалом на соседних выводах. Формируются импульсы в модуле usbd_cdc_vcp.c:
Код
......
    {                
     GPIOD->BSRRH =GPIO_Pin_10;  //
     Delay (t1);
     GPIOD->BSRRL =GPIO_Pin_10;  //
     }

     Delay (t2);

    {                
     GPIOD->BSRRH =GPIO_Pin_15;  //
     Delay (t1);
     GPIOD->BSRRL =GPIO_Pin_15;  //
     }    
.....


Функция Delay ( ) определена в модуле арр.с
Код
void Delay(int Del)
{
  while(Del)
  {
   Del--;    
  }
}

t1 и t2 - параметры задающие длительность импульсов и паузы между ними, передаются в МК через vcp .

Когда откомпилировал программу и запустил её, по осциллографу увидел, что импульсы РАЗНОЙ длительности, т.е компилятор что-то добавил в формирование импульса на Pin_10. Попытался изменить уровень оптимизации с О3 на О0 - не помогло. Решил попробовать задать длительность первого импульса по другому:
Код
{                
GPIOD->BSRRH =GPIO_Pin_10;  //
__NOP();    
__NOP();
GPIOD->BSRRL =GPIO_Pin_10;  //
}


при этом компилятор вообще стал игнорировать функцию Delay . В чём засада?
И дополнительно вопрос - можно ли выбирать степень оптимизации для отдельного модуля ( например, у всего проекта О3, а у конкретного модуля - О0) и если можно, то как? Просто при изменении уровня оптимизации происходит перекомпиляция всего проекта, ждать долго.
NikP
Цитата(toweroff @ Nov 25 2014, 08:49) *

Спасибо. Это ответ на вторую часть вопроса (насчёт оптимизации), а что по первой?
Сергей Борщ
Цитата(NikP @ Nov 25 2014, 08:30) *
а что по первой?
Вы хотите чтобы ваши программы были большими и тормознутыми? Наверняка нет. Компилятор помог вам в этом, выкинув функцию Delay, единственная функция которой, по его мнению - делать маленькую быструю программу большой и тормозной. Объявите счетчик цикла как volatile или вставьте _NOP() внутрь цикла.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.