Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Глючит структура. |
Философия, технологии, алгоритмы! |
|
Опции темы |
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[]; Код:
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; } } } Отладка, расстановка различных флажков показали, что данные портятся позже - ровно через двадцать холостых (если USB_ReceiveFlg=FALSE) циклов while(1) . Хотя я их не трогаю. Дальнейший метод тыка (убил целый день) показал, что глюк исчезает, если убрать из структуры tPoint все элементы unsigned int. Если есть хотя бы один int - глюк имеет место быть. В чем тут может быть дело? |
21.07.2013, 22:57 | #2 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Код:
if ( USB_ReceiveFlg == TRUE) // Если есть данные, то... } Код:
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
Не в сети |
Цитата:
Цитата:
Цитата:
ЧТобы он исчез, необязательно убирать переменные, достаточно изменить их тип. Хм... наверное конфликт и с USB тоже - убрал USB, сделал принудительное заполнение массива по таймеру - все ОК. Как будто бы эта структура и элементы библиотеки USB где-то друг с другом конфликтуют. |
|||
21.07.2013, 23:48 | #4 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Форум заглючил, не успел попровить. Смысл в том, что у меня была мысль что эта структура использовалась в коде, которого нету в примере.
Цитата:
Минуточку, а что за библиотека доступа к USB? |
|
22.07.2013, 05:34 | #6 | |||
///
Сообщений: 9,724
Регистрация: 02.04.2005
Возраст: 43
Не в сети |
Spectator,
Программа выполняется на контроллере (ядро Cortex M3). Hopkroft, Цитата:
Проблема временно решилась после того, как я указал размерность POINTS_LIST явно. Цитата:
Цитата:
Вот только как и рыбку съесть (сделать POINTS_LIST безразмерным) и при этом данные не испортить - не знаю. Все-таки программа для микроконтроллера, а его ресурсы более ограничены, нежели ресурсы ПК и на компилятор это накладывает отпечаток. С компилятором C на ПК таких проблем не возникало. Последний раз редактировалось -=Женек=-; 22.07.2013 в 07:46. |
|||
22.07.2013, 08:00 | #8 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Цитата:
Получаем обращение за границы массива. Код:
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 |
Форумец
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
я вообще не очень понимаю как компилятор у тебя это обрабатывает, вставил для эксперимента в 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
Не в сети |
Цитата:
Поэтому приходится, ставить вещи по типу EurekaLog, и устанавливать компилятор в "параноидальный режим". Версия студии какая(неужели 2007)? Хотелось бы эту вещь на заметку взять. |
|
22.07.2013, 11:37 | #11 |
Форумец
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
|