Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пн фев 25, 2019 18:52:17

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

При пошаговой отладке все отлично, но как запускаешь программу переменная "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

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

Вт фев 26, 2019 06:27:50

Ну какая такая оптимизация при -О0? Из чего сделано умозаключение, что переменная обнуляется? Копай в сторону измерения частоты вызова прерывания таймера.

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

Вт фев 26, 2019 15:17:30

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

P.s. пробовал настраивать таймер на 1 гц ситуация не меняется.

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

Вт фев 26, 2019 17:58:28

Такое ошущение
Что ещё за ощущение? Мы тут инженеры-разработчики или экстрасенсы? Берём отладчик, осциллограф и логический анализатор и смотрим что там реально происходит. Ощущения бабкам-гадалкам оставь.

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

Вт фев 26, 2019 18:04:09

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

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

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

Вт фев 26, 2019 20:09:33

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

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


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

Добавлено after 1 hour 58 minutes 7 seconds:
Всем спасибо. Решилось заменой проца...

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

Пн мар 04, 2019 18:52:08

А в окно дизасма глянуть не ку?

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

Вт апр 16, 2019 22:43:11

...Такое ошущение...

Каким местом ощущаете...? Тут нет экстрасенсов.
Как выше сказали - берите осцилл или частотомер и смотрите что на портах твориться.

Так же Вы должны понимать, что если начальное состояние
Код:
raz=5
, то после
Код:
HAL_TIM_Base_Start_IT (&htim4);
Вы с большой вероятностью на следующем такте можете попасть в
Код:
void TIM4_IRQHandler(void)
и сами обнулить переменную.
Ответить