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

 
 
> Функциия не хочет возвращать значение в Keil 4.60, компилятор пишет variable never used
NaughtyFreak
сообщение Dec 28 2012, 07:44
Сообщение #1


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

Группа: Участник
Сообщений: 90
Регистрация: 7-10-11
Из: Москва
Пользователь №: 67 593




Разобравшись с одной проблемой столкнулся с другой. Странный какой-то этот Кейл wacko.gif
В мейне пишу:
Код
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:)

Есть кто сталкивался с такой проблемой?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
esaulenka
сообщение Dec 28 2012, 08:56
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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

Варианты решения:
1) правильный: дописать код, который будет использовать это значение. Хотя бы на экранчик выводить.
2) тоже правильный: посмотреть по дизассемблеру (!) MPU6050_read_reg(), что "return не выполняется!!" - это неправда, и возвращается верное значение.
3) неправильный: прочитать про volatile и/или отключить оптимизацию.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
NaughtyFreak
сообщение Dec 28 2012, 10:22
Сообщение #3


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

Группа: Участник
Сообщений: 90
Регистрация: 7-10-11
Из: Москва
Пользователь №: 67 593



Цитата(esaulenka @ Dec 28 2012, 12:56) *
Предлагаю заглянуть в словарь.

Спасибо за совет, не 1й год программированием занимаюсь... Раньше подобного ни в АВР студио ни в BCB не встречалось.
Ок, про дальнейшее использование подумаю, м.б. в юарт выплюнуть.
Дизассемблер глядел, но я с ним дружу на элементарном уровне, а то что кажет кейл мягко говоря не очень понятно. Если Вы не против, я могу тут выложить для общественного анализа sm.gif

Сообщение отредактировал NaughtyFreak - Dec 28 2012, 10:23
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 28 2012, 15:17
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(NaughtyFreak @ Dec 28 2012, 14:22) *
Спасибо за совет, не 1й год программированием занимаюсь...
Дизассемблер глядел,

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

Цитата(NaughtyFreak @ Dec 28 2012, 14:22) *
Раньше подобного ни в АВР студио ни в BCB не встречалось.

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


Цитата(NaughtyFreak @ Dec 28 2012, 14:22) *
Если Вы не против, я могу тут выложить для общественного анализа sm.gif

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
NaughtyFreak
сообщение Dec 29 2012, 06:56
Сообщение #5


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

Группа: Участник
Сообщений: 90
Регистрация: 7-10-11
Из: Москва
Пользователь №: 67 593



Цитата(esaulenka @ Dec 28 2012, 19:17) *
Это взаимоисключающие понятия, на мой взгляд. Человек, который считает себя продвинутым программером, ДОЛЖЕН хотя бы читать ассемблер.

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

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

Сколько компиляторов - столько мнений sm.gif
Go to the top of the page
 
+Quote Post

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

 


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


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