Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Сдвиг битов в WinAvr


Автор: kiLLProg 26.2.2011, 07:18
Здравствуйте. При написании программы столкнулся с незапланированной проблемой. В языке Си есть операция сдвига битов (>>, <<).

Вот код:
Код

  unsigned int tmp1=0, tmp2=0; // int занимает 2 байта
  
  tmp1 = 0x0075;     
  tmp1 =  tmp1 << 8;

Отладчик показывает tmp1 = 0x0000 (после tmp1 =  tmp1 << 8)  smile   smile
а когда  tmp1 =  tmp1 << 4; //   tmp1 = 0x0050
Я в шоке, мне нужен сдвиг на один байт влево. Я уже перерыл форумы, книги, справочники. Писал этот кусок на "Большом" компиляторе C++BuilderXE, в нем работает как надо.

Подскажите пожалуйста как решить проблему. Может у вас есть свой способ сдвига битов в переменной?  

Автор: xvr 26.2.2011, 10:48
Код правильный. Возможно и значение tmp1 правильное, проблема может быть в том, что отладчик показывает не то, что есть на самом деле из за оптимизаций в WinAVR.

Не далее как вчера собственноручно (точнее собственноножно) наступил на подобные грабли в gcc на x86-64. Была включена какая то оптимизация и генерация отладочной информации. В отладчике смотрел код:
Код

char* p=some_func();
some_other_func(p);
смотрю p после вызова some_func, gdb говорит что оно NULL. Перекопал весь вызов, вплоть до возвращаемого результата - ну явно не NULL! Захожу в some_other_func - параметр опять не NULL! Смотрю код - gcc вызвал some_func, результат переместил с одного регистра в другой (туда, где some_other_func ожидала найти параметр) и позвал some_other_func. gdb он при этом в известие о том, где в этой строке исходника лежит p не поставил  smile 

PS. Попробуйте обновить WinAvr и отладчик на последние версии, может заработать

Автор: kiLLProg 26.2.2011, 14:07
Оптимизацию я сразу отрубил, при оптимизации у меня программа ведёт себя просто дьявольски. Я уже скачал новый WinAvr. Хотя сейчас у меня самый новый. Но на офф. сайте вроде чуток обновлённый выложили компилятор, и я его скачал. Скоро попробую, отпишусь.

П.С. Компилятор WinAvr, он какой-то подлючий.....        

Автор: kiLLProg 26.2.2011, 15:33
Как об стенку горох.  smile  smile 
Проверьте этот код в вашем WinAvr пожалуйста. Что он пишет?

Автор: UniBomb 26.2.2011, 19:45
kiLLProg, попробуйте в объявление добавить volatile.

Автор: kiLLProg 27.2.2011, 06:08
Спасибо за советы,  volatile добавлял не помогло. 
Потом решил с нуля новый прект создать. Писал я сначала прогу по ATXmega32, решил создать новый проект под простую мегу32. И Вуа ля! Всё заработало как надо!  smile  smile  smile. Походу, AvrStudio (у меня v4.18) не может првильно отлаживать ATXmega32 или компилятор не может компилировать правильный код под этот контроллер. Сейчас прям у меня как камень с души упал, буду продолжать дописывать прогу. А руководителю проекта расскажу всё как было, и вместе подумаем...    

Думаю вопрос решен, сбегаю в атмел.ком за новой студией.
C компилятором WinAvr нужно держать ухо в острог. У меня при включенной оптимизации, программа делает всё что она хочет. Только это чего стоит. А тут еще этот глюк.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)