реклама на сайте
подробности

 
 
> при компиляции Keil C игнорирует функцию -что делать?
NikP
сообщение Nov 25 2014, 05:32
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944



Для МК 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) и если можно, то как? Просто при изменении уровня оптимизации происходит перекомпиляция всего проекта, ждать долго.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
toweroff
сообщение Nov 25 2014, 05:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



http://infocenter.arm.com/help/index.jsp?t...g/Babdidhg.html
Go to the top of the page
 
+Quote Post
NikP
сообщение Nov 25 2014, 06:30
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944



Цитата(toweroff @ Nov 25 2014, 08:49) *

Спасибо. Это ответ на вторую часть вопроса (насчёт оптимизации), а что по первой?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2014, 07:19
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016