Помогите разобраться с оптимизацией(обнуляет переменную)

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Cerber1366
Родился
Сообщения: 7
Зарегистрирован: Чт дек 22, 2011 20:32:35

Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение Cerber1366 »

Всем привет, уже два дня убил ни как не могу понять...

При пошаговой отладке все отлично, но как запускаешь программу переменная "raz" сбрасывается в 0. Я так понял это из-за оптимизации.
Помогите пожалуйста исправить.

main.c:

Код: Выделить всё

#include "main.h"
#include "stm32f1xx_hal.h"

I2C_HandleTypeDef hi2c1;

TIM_HandleTypeDef htim4;


/* Private variables ---------------------------------------------------------*/
uint8_t temp;
uint8_t buf[6];
	uint8_t des,sek=4;
 volatile uint8_t raz=5;
  volatile uint8_t update=0;

void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_TIM4_Init(void);

  HAL_Init();

  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_TIM4_Init();

	buf[0]=1;	
	buf[1]=2;	
	buf[2]=3;	
	buf[3]=4;	
	buf[4]=5;	
	buf[5]=6;	
	
HAL_TIM_Base_Start	(&htim4);
HAL_TIM_Base_Start_IT (&htim4);	

  while (1)
  {
//RTC_Read(hi2c1,0,&temp);	
if (update==1){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
	
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);		
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);	
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);	
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
	
	
switch (buf[raz]) {
case 1:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
  break;
case 2:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
  break;
case 3:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);		
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
  break;
case 4:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);	
  break;
case 5:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);		
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);	
  break;
case 6:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);	
  break;
case 7:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);		
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);	
  break;
case 8:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
  break;
case 9:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);		
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
  break;
}

switch (raz) {
case 0:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
  break;
case 1:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
  break;
case 2:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
  break;
case 3:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
  break;
 case 4:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
  break;
case 5:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
  break;
}

update=0;
}
}
}
stm32f1xx_it.c

Код: Выделить всё

#include "stm32f1xx_hal.h"
#include "stm32f1xx.h"
#include "stm32f1xx_it.h"


extern volatile uint8_t raz;
 extern volatile uint8_t update;


void TIM4_IRQHandler(void)
{
raz++;
if (raz==6){raz=0;}
update=1;

  HAL_TIM_IRQHandler(&htim4);
}
P.s. оптимизация -O0
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение VladislavS »

Ну какая такая оптимизация при -О0? Из чего сделано умозаключение, что переменная обнуляется? Копай в сторону измерения частоты вызова прерывания таймера.
Реклама
Cerber1366
Родился
Сообщения: 7
Зарегистрирован: Чт дек 22, 2011 20:32:35

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение Cerber1366 »

Даже при написании этого кода в майне, и использовании задержек вместо таймера, он все равно обнуляет. Такое ошущение, что он просто пропускает часть программы, и вместо инкримента до нужного значения, он делает инкримент один раз, и начинает заново. При пошаговом выполнении все отлично.

P.s. пробовал настраивать таймер на 1 гц ситуация не меняется.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение VladislavS »

[uquote="Cerber1366",url="/forum/viewtopic.php?p=3578443#p3578443"]Такое ошущение[/uquote]Что ещё за ощущение? Мы тут инженеры-разработчики или экстрасенсы? Берём отладчик, осциллограф и логический анализатор и смотрим что там реально происходит. Ощущения бабкам-гадалкам оставь.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение AlanDrakes »

-O0 может очень весело себя вести с кодом. Да, я такое поведение встречал. Поймать сложно, выяснить точную причину - ещё сложнее. У меня решилось после -O1 и выше.
Верните оптимизацию и проверьте ещё раз с ней.

И никак не могу понять логику работы кода. Сначала в зависимости от значения массива по индексу 'raz' меняются биты порта, затем по самому значению биты порта меняются ещё раз.... Это отладка, или готовый вариант?
Реклама
Cerber1366
Родился
Сообщения: 7
Зарегистрирован: Чт дек 22, 2011 20:32:35

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение Cerber1366 »

[uquote="AlanDrakes",url="/forum/viewtopic.php?p=3578527#p3578527"]-O0 может очень весело себя вести с кодом. Да, я такое поведение встречал. Поймать сложно, выяснить точную причину - ещё сложнее. У меня решилось после -O1 и выше.
Верните оптимизацию и проверьте ещё раз с ней.

И никак не могу понять логику работы кода. Сначала в зависимости от значения массива по индексу 'raz' меняются биты порта, затем по самому значению биты порта меняются ещё раз.... Это отладка, или готовый вариант?[/uquote]

Попробовал, разницы нет. Сегодня попробую проц сменить, может он глючит...
Ноги разные в разных условиях...

Добавлено after 1 hour 58 minutes 7 seconds:
Всем спасибо. Решилось заменой проца...
Реклама
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение afz »

А в окно дизасма глянуть не ку?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Аватара пользователя
qbit
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт апр 02, 2013 10:03:29
Откуда: Санкт-Петербург
Контактная информация:

Re: Помогите разобраться с оптимизацией(обнуляет переменную)

Сообщение qbit »

[uquote="Cerber1366",url="/forum/viewtopic.php?p=3578443#p3578443"]...Такое ошущение...[/uquote]
Каким местом ощущаете...? Тут нет экстрасенсов.
Как выше сказали - берите осцилл или частотомер и смотрите что на портах твориться.

Так же Вы должны понимать, что если начальное состояние , то после

Код: Выделить всё

HAL_TIM_Base_Start_IT (&htim4);
Вы с большой вероятностью на следующем такте можете попасть в

Код: Выделить всё

void TIM4_IRQHandler(void)
и сами обнулить переменную.
Для связи email: info собака qbit.su
Ответить

Вернуться в «ARM»