Перейти к содержанию
    

Функциия не хочет возвращать значение в Keil 4.60

 

Разобравшись с одной проблемой столкнулся с другой. Странный какой-то этот Кейл :wacko:

В мейне пишу:

int main (void)
{
    BYTE result, reg_value; //BYTE это опред-ие типа unsigned char
      SystemInit();
       SysTick_Configure_us();
        Init_GPIOB();
         Init_I2C1();
          Init_GPIOE();
         Config_LCD_port();
          Config_LCD();
       result=MPU6050_Detected(); // это читается нормально
       if (result==0x01)
         {     
         LCD_16ch_string(2, " MPU detected"); // ЖКИ выводит что всё ОК, девайс опознан
             LCD_16ch_string(1, " Test OK!");
         }
         
         else 
         {
             LCD_16ch_string(1, " Test failed!");
         }
         
         reg_value=MPU6050_read_reg(PWR_MGMT_1_REG); // НЕ ЧИТАЕТ!!! :(
             
     while (1){};     
    }

 

Функция MPU6050_read_reg(PWR_MGMT_1_REG) всего лишь считывает значение регистра из устройства и возвращает его ввиде байта.

Вот её код:

 

BYTE MPU6050_read_reg (BYTE reg_addr)
{
BYTE temp_reg_value; // временная переменная, знач-ие которой возвращаем    
  Enable_I2C1(); // стандартная процедура чтения по I2C, ничего интересного
         Set_Acknowledge();
          I2C1_Start();
           Handle_EV5();
            I2C1_write_data(MPU_6050_address_write);
             Handle_EV6();
                  I2C1_write_data(reg_addr);
               Check_BTF_flag();
                            
      I2C1_Start();
       Handle_EV5();                            
              I2C1_write_data(MPU_6050_address_read);
                 Handle_EV6();
              Reset_Acknowledge();
               Check_RXNE_flag();
            temp_reg_value=I2C1_read_data(); //Здесь присваивание значения происходит нормально!    
             I2C1_Stop();
                            Disable_I2C1();
    return temp_reg_value; // return не выполняется!!
}

 

Какие у меня соображения:

ф-ия, возвращающая result принимает ID-код устройства и возвращает "1" если всё верно.

ф-ия MPU6050_read_reg(PWR_MGMT_1_REG) возвращает значение регистра, которое в свою очередь в эту ф-ию возвращает макрофункция temp_reg_value=I2C1_read_data();

Компилятор при компиляции пишет "main.c(31): warning: #550-D: variable "reg_value" was set but never used" хотя я явно присваиваю этой переменной значение, возвращаемой ф-ией..

То ли двойной возврат одного и того же значения не прокатывает, то ли у меня руки кривые где-то. Проц STM32F417, стандартную библу периферии не использую, люблю свой HAL:)

 

Есть кто сталкивался с такой проблемой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предлагаю заглянуть в словарь.

 

"variable was set but never used" означает, что в переменную записывается значение, которое потом никто никогда не считывает (это очевидно из кода main() ).

У компилятора логика простая: раз эту переменную никто не считывает, её можно безболезненно выкинуть.

 

Варианты решения:

1) правильный: дописать код, который будет использовать это значение. Хотя бы на экранчик выводить.

2) тоже правильный: посмотреть по дизассемблеру (!) MPU6050_read_reg(), что "return не выполняется!!" - это неправда, и возвращается верное значение.

3) неправильный: прочитать про volatile и/или отключить оптимизацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предлагаю заглянуть в словарь.

Спасибо за совет, не 1й год программированием занимаюсь... Раньше подобного ни в АВР студио ни в BCB не встречалось.

Ок, про дальнейшее использование подумаю, м.б. в юарт выплюнуть.

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

Изменено пользователем NaughtyFreak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за совет, не 1й год программированием занимаюсь...

Дизассемблер глядел,

Это взаимоисключающие понятия, на мой взгляд. Человек, который считает себя продвинутым программером, ДОЛЖЕН хотя бы читать ассемблер.

 

Раньше подобного ни в АВР студио ни в BCB не встречалось.

Странные дела творятся... Я кроме кейла и не знаю ничего (мои поделки на вижуал си дальше соседнего кабинета не уходят, AVR в конторе не в почёте уже года три (когда их купить нельзя было)), но выкинуть неиспользуемую переменную - это довольно простая оптимизация, было б очень странно, что другие компиляторы ей не пользуются.

 

 

Если Вы не против, я могу тут выложить для общественного анализа :)

Да ради бога. НО:

а) с вероятностью 99.99% там будет именно то, о чём я уже написал - функция MPU6050_read_reg() что-то там считывает и возвращает, а main() это игнорирует

б) лично я буду это анализировать недельки через две. Интернет в отпуске - зло :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это взаимоисключающие понятия, на мой взгляд. Человек, который считает себя продвинутым программером, ДОЛЖЕН хотя бы читать ассемблер.

Не считаю себя продвинутым программером, дизассемблер не весь понимаю :)

 

Да и не надо, я подразобрался. В принципе мне нужно это было чтобы разнюхать в принципе девай отвечает или да, исессна потом все значения идут в обработку и т.д.

 

Сколько компиляторов - столько мнений :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...