Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сдвиг битов в WinAvr, То ли это я не еду, то ли лыжи не едут? 
V
    Опции темы
kiLLProg
Дата 26.2.2011, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



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

Вот код:
Код

  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, в нем работает как надо.

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

Это сообщение отредактировал(а) kiLLProg - 26.2.2011, 10:26
PM MAIL   Вверх
xvr
Дата 26.2.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Код правильный. Возможно и значение 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 и отладчик на последние версии, может заработать

PM MAIL   Вверх
kiLLProg
Дата 26.2.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



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

П.С. Компилятор WinAvr, он какой-то подлючий.....        
PM MAIL   Вверх
kiLLProg
Дата 26.2.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Как об стенку горох.  smile  smile 
Проверьте этот код в вашем WinAvr пожалуйста. Что он пишет?
PM MAIL   Вверх
UniBomb
Дата 26.2.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



kiLLProg, попробуйте в объявление добавить volatile.
PM MAIL ICQ Skype   Вверх
kiLLProg
Дата 27.2.2011, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) kiLLProg - 27.2.2011, 15:48
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.