NaughtyFreak 0 28 декабря, 2012 Опубликовано 28 декабря, 2012 · Жалоба Разобравшись с одной проблемой столкнулся с другой. Странный какой-то этот Кейл В мейне пишу: 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:) Есть кто сталкивался с такой проблемой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 28 декабря, 2012 Опубликовано 28 декабря, 2012 · Жалоба Предлагаю заглянуть в словарь. "variable was set but never used" означает, что в переменную записывается значение, которое потом никто никогда не считывает (это очевидно из кода main() ). У компилятора логика простая: раз эту переменную никто не считывает, её можно безболезненно выкинуть. Варианты решения: 1) правильный: дописать код, который будет использовать это значение. Хотя бы на экранчик выводить. 2) тоже правильный: посмотреть по дизассемблеру (!) MPU6050_read_reg(), что "return не выполняется!!" - это неправда, и возвращается верное значение. 3) неправильный: прочитать про volatile и/или отключить оптимизацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NaughtyFreak 0 28 декабря, 2012 Опубликовано 28 декабря, 2012 (изменено) · Жалоба Предлагаю заглянуть в словарь. Спасибо за совет, не 1й год программированием занимаюсь... Раньше подобного ни в АВР студио ни в BCB не встречалось. Ок, про дальнейшее использование подумаю, м.б. в юарт выплюнуть. Дизассемблер глядел, но я с ним дружу на элементарном уровне, а то что кажет кейл мягко говоря не очень понятно. Если Вы не против, я могу тут выложить для общественного анализа :) Изменено 28 декабря, 2012 пользователем NaughtyFreak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 28 декабря, 2012 Опубликовано 28 декабря, 2012 · Жалоба Спасибо за совет, не 1й год программированием занимаюсь... Дизассемблер глядел, Это взаимоисключающие понятия, на мой взгляд. Человек, который считает себя продвинутым программером, ДОЛЖЕН хотя бы читать ассемблер. Раньше подобного ни в АВР студио ни в BCB не встречалось. Странные дела творятся... Я кроме кейла и не знаю ничего (мои поделки на вижуал си дальше соседнего кабинета не уходят, AVR в конторе не в почёте уже года три (когда их купить нельзя было)), но выкинуть неиспользуемую переменную - это довольно простая оптимизация, было б очень странно, что другие компиляторы ей не пользуются. Если Вы не против, я могу тут выложить для общественного анализа :) Да ради бога. НО: а) с вероятностью 99.99% там будет именно то, о чём я уже написал - функция MPU6050_read_reg() что-то там считывает и возвращает, а main() это игнорирует б) лично я буду это анализировать недельки через две. Интернет в отпуске - зло :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NaughtyFreak 0 29 декабря, 2012 Опубликовано 29 декабря, 2012 · Жалоба Это взаимоисключающие понятия, на мой взгляд. Человек, который считает себя продвинутым программером, ДОЛЖЕН хотя бы читать ассемблер. Не считаю себя продвинутым программером, дизассемблер не весь понимаю :) Да и не надо, я подразобрался. В принципе мне нужно это было чтобы разнюхать в принципе девай отвечает или да, исессна потом все значения идут в обработку и т.д. Сколько компиляторов - столько мнений :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться