Старый 21.07.2013, 22:01   #1   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,724
Регистрация: 02.04.2005
Возраст: 43

-=Женек=- вне форума Не в сети
Глючит структура.

Господа, есть программа для STM32F103 под KEIL, использует USB.
По USB передаются байты, которые заливаются в массив структур.
Код:
 struct tPoint
 {
	unsigned char room;
   unsigned int number;
   unsigned int time;
   char LQI;
   unsigned char passed;
   unsigned char caption[40];
 } POINTS_LIST[];
Вот цикл, в котором происходит чтение из USB и заполнение структуры:
Код:
while(1)
{
if (POINTS_LIST[1].room==111) LED3_ON;else LED3_OFF; // СТРОКА - "МАЯЧОК", пояснение ниже.
						
if ( USB_ReceiveFlg == TRUE) // Если есть данные, то...
		{
		  if (Receive_Buffer[0]==48) // проверка сигнатуры пакета
		   {
		    packet_number=Receive_Buffer[2]; // номер элемента массива, для которого пришли данные
		    POINTS_LIST[packet_number].room=Receive_Buffer[3]; // запись в элемент массива данных
						 
		   UserToPMABufferCopy(Transi_Buffer, ENDP2_TXADDR, nReportCnt); // Подготовка ответа
		   SetEPTxValid(ENDP2); 
		   TimeCount = 0x00;
		   USB_ReceiveFlg=FALSE;
					
		 }	  
		 }
}
Обнаружилось, что элемент №1 массива битый. Поставил строку-"маячок", прицепил на нее светодиод - он моргает, то есть в POINTS_LIST[i] данные сначала записываются, а потом затираются. Грешил на глюки USB, думал, что в один и тот же приемный массив пишутся данные от двух посылок, оказалось что нет - если сразу передавать обратно в компьютер пришедшие данные, то все ОК.
Отладка, расстановка различных флажков показали, что данные портятся позже - ровно через двадцать холостых (если USB_ReceiveFlg=FALSE) циклов while(1) . Хотя я их не трогаю.

Дальнейший метод тыка (убил целый день) показал, что глюк исчезает, если убрать из структуры tPoint все элементы unsigned int. Если есть хотя бы один int - глюк имеет место быть.

В чем тут может быть дело?
  Ответить с цитированием
Старый 21.07.2013, 22:57   #2   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Код:
 
if ( USB_ReceiveFlg == TRUE) // Если есть данные, то...
}
Кхм...достаточно просто написать if (USB_ReceiveFlg) ...

Код:
 
 packet_number=Receive_Buffer[2]; // номер элемента массива, для которого пришли данные
Может ли иметь место ситуация когда, вышли за пределы массива?
Если судить по приведённому примеру, то структура не используется. Однако я вижу функции, и не измвестно что они могут вызывать в своём коде.
Код:
UserToPMABufferCopy(Transi_Buffer, ENDP2_TXADDR, nReportCnt); 
SetEPTxValid(ENDP2);
Код:
 Дальнейший метод тыка (убил целый день) показал, что глюк исчезает, если убрать из структуры tPoint все элементы unsigned int. Если есть хотя бы один int - глюк имеет место быть.
Тип изменил, или просто элементы убрал?
Если просто убрал элементы, то соответственно убрал код, который к ним обращается. Может дело в нём?
  Ответить с цитированием
Старый 21.07.2013, 23:04   #3   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,724
Регистрация: 02.04.2005
Возраст: 43

-=Женек=- вне форума Не в сети
Цитата:
Может ли иметь место ситуация когда, вышли за пределы массива?
Возможна лишь теоретически. На практике я использую всего 5 элементов, каждый раз результат один.

Цитата:
Если судить по приведённому примеру, то структура не используется. Однако я вижу функции, и не измвестно что они могут вызывать в своём коде.
Вот это не понял...

Цитата:
Тип изменил, или просто элементы убрал?
Если просто убрал элементы, то соответственно убрал код, который к ним обращается. Может дело в нём?
Как видите из кода, я к переменным типа unsigned int не обращаюсь. ДОстаточно лишь объявить их в структуре, чтобы появился глюк.
ЧТобы он исчез, необязательно убирать переменные, достаточно изменить их тип.

Хм... наверное конфликт и с USB тоже - убрал USB, сделал принудительное заполнение массива по таймеру - все ОК. Как будто бы эта структура и элементы библиотеки USB где-то друг с другом конфликтуют.
  Ответить с цитированием
Старый 21.07.2013, 23:48   #4   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Вот это не понял...
Форум заглючил, не успел попровить. Смысл в том, что у меня была мысль что эта структура использовалась в коде, которого нету в примере.

Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Хм... наверное конфликт и с USB тоже - убрал USB, сделал принудительное заполнение массива по таймеру - все ОК. Как будто бы эта структура и элементы библиотеки USB где-то друг с другом конфликтуют.
Я так понял, это идея, о том что имена пересекаются. Но в данном случае, компилятор бы заругался.

Минуточку, а что за библиотека доступа к USB?
  Ответить с цитированием
Старый 21.07.2013, 23:49   #5   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
программа выполняется на ПК?
если да, то надо не раздумывая ставить breakpoint на адресе переменной, которая изменяется, и смотреть что к этому приводит.
  Ответить с цитированием
Старый 22.07.2013, 05:34   #6   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,724
Регистрация: 02.04.2005
Возраст: 43

-=Женек=- вне форума Не в сети
Spectator,
Программа выполняется на контроллере (ядро Cortex M3).

Hopkroft,
Цитата:
Я так понял, это идея, о том что имена пересекаются. Но в данном случае, компилятор бы заругался.
Как оказалось, действительно, разные переменные не могут что-то поделить в памяти - добавил еще одну переменную в структуру, так после этого левые данные появились еще в одном массиве, в который я временно вообще ничего не пишу.

Проблема временно решилась после того, как я указал размерность POINTS_LIST явно.

Цитата:
Минуточку, а что за библиотека доступа к USB?
Со стороны ПК - JvHIDController из пакета JEDI. В контроллере - USB аппаратный с библиотекой от производителя.

Цитата:
то надо не раздумывая ставить breakpoint на адресе переменной
Так я после этого и понял, что что-то не то с дележкой памяти. И убедился, что в самом протоколе обмена ошибок нет, то есть мои кривые руки сами эту структуру не трут.
Вот только как и рыбку съесть (сделать POINTS_LIST безразмерным) и при этом данные не испортить - не знаю. Все-таки программа для микроконтроллера, а его ресурсы более ограничены, нежели ресурсы ПК и на компилятор это накладывает отпечаток. С компилятором C на ПК таких проблем не возникало.

Последний раз редактировалось -=Женек=-; 22.07.2013 в 07:46.
  Ответить с цитированием
Старый 22.07.2013, 05:48   #7   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,724
Регистрация: 02.04.2005
Возраст: 43

-=Женек=- вне форума Не в сети
Хотя... в принципе черт с ней с безразмерностью - при установке 500 элементов программа все еще компилируется, а мне столько не надо. Так что поставлю 50 и успокоюсь.
  Ответить с цитированием
Старый 22.07.2013, 08:00   #8   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Хотя... в принципе черт с ней с безразмерностью - при установке 500 элементов программа все еще компилируется, а мне столько не надо. Так что поставлю 50 и успокоюсь.
Блин, я тоже упустил из виду этот момент...нужно срочно в отпуск
Получаем обращение за границы массива.

Код:
 struct tPoint
 {
	unsigned char room;
   unsigned int number;
   unsigned int time;
   char LQI;
   unsigned char passed;
   unsigned char caption[40];
 } POINTS_LIST[];
  Ответить с цитированием
Старый 22.07.2013, 11:01   #9   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
я вообще не очень понимаю как компилятор у тебя это обрабатывает, вставил для эксперимента в C++ Builder

Код:
 struct tPoint
 {
	unsigned char room;
   unsigned int number;
   unsigned int time;
   char LQI;
   unsigned char passed;
   unsigned char caption[40];
 } POINTS_LIST[];
он мне совершенно честно и справедливо сказал что

[C++ Error] UnitLink.cpp(128): E2449 Size of 'POINTS_LIST' is unknown or zero
  Ответить с цитированием
Старый 22.07.2013, 11:18   #10   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
я вообще не очень понимаю как компилятор у тебя это обрабатывает, вставил для эксперимента в C++ Builder
Там есть такая багафича. В зависимости от настроек компилятора он может такие "форты" выполнять.
Поэтому приходится, ставить вещи по типу EurekaLog, и устанавливать компилятор в "параноидальный режим".

Версия студии какая(неужели 2007)? Хотелось бы эту вещь на заметку взять.
  Ответить с цитированием
Старый 22.07.2013, 11:37   #11   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
Версия студии какая(неужели 2007)? Хотелось бы эту вещь на заметку взять.
неужели 6
да, 2002 года выпуска.

самая православная на мой взгляд. Codegear'ом я так и не проникся.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind