|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
|
Портятся данные в очереди26.07.2017, 16:25. Показов 5346. Ответов 15
Метки нет (Все метки)
Всем привет.
Программа работает с UART на прерываниях. Возникла проблема. Через не определённый промежуток времени, в очереди не передачу меняются данные на мусор. При этом, из очереди в прерывании только чтение происходит. Проводил эксперимент. В прерывании, перед тем как прочитать из очереди, считываю все данные в буфер, а потом обратно заливаю. И действительно, при чтении 1 символа, в очереди AT\r, при чтении 2 символа T<мусор> причём длина его разная. По приёму такого безобразия нет. Там всё ОК. Прямо и не знаю куда копать. Может у кого есть какие мысли? Буду рад любой.
0
|
|
| 26.07.2017, 16:25 | |
|
Ответы с готовыми решениями:
15
Портятся данные обработке прерывания TIMER1_OVF (atmega8) atmega48pa + adm483 портятся данные при передаче Данные в сессии портятся |
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
|
| 26.07.2017, 16:51 | |
|
Ваапервых, для работы в прерываниях есть "прерывательные" спец.фу-ции типа xQueueReceiveFromISR, надеюсь, вы именно ее используете или таки нет?
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
||
| 26.07.2017, 18:36 | ||
xQueueReceiveFromISR(Tx, &UART1TxBuf, &xHigherPriorityTaskWoken); Вот что смущает. Может такое быть, что созданную очередь надо ещё где-то объявить? Ну что это область памяти и всё такое. Потому как сильно похоже на то, что на место размещения очереди (на адреса где находятся данные) кто-то пишет.
0
|
||
|
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
|
|
| 26.07.2017, 20:22 | |
|
Проверь все указатели, корректно ли обрабатываются. у меня такое было. не уследил за одним их указателей и случайно перетирал семафор. так что смотреть надо комплексно
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
|
| 26.07.2017, 20:52 | |
|
При создании очереди, функция возвращает ее дескриптор. Он должен быть глобально объявлен и видим в вашей функции обработки прерывания.
Если у вас в эту очередь пишут несколько задач, защищайте доступ к записи очереди мьютексом, чтобы не получить данные внавалку. При создании очереди, равно как и задачи, выделенная ей память защищена на уровне самой операционки от перезаписи. В ОЗУ выделяется блок адресов, состоящий из заголовка, блока контроля и управления и собственно стека с полезными данными. Сведения о занятом пространстве хранятся в блоке контроля и управления у каждой созданной задачи или очереди. Поэтому на уровне операционки эти данные защищены от взаимного влияния. Незащищенными остаются дескрипторы - определяемые пользователем переменные.
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
|
| 26.07.2017, 21:49 | |
|
Заметил, что когда создаёшь очередь длиной 32 байта - всё работает
Но если 64 - уже нет.
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
||
| 26.07.2017, 21:55 | ||
А тут может отработать час, а может только один цикл. Семафоров я тут не использую, т.к. они там не нужны. Посему и перетирать то там нечего. Что и обидно. Задача наипростейшая. А бодаюсь уже 3 недели. А может очередь иметь ограничения на длину? Ибо при организации очереди на 32 байта - всё работает. А вот если на 64 - уже нет. При этом думал что настройки фриртоса по памяти не корректны. Увеличил и кучу и стек в 10 раз. Эффекта не дало. Значит дело не в настройках.
0
|
||
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
|
| 26.07.2017, 22:39 | |
|
Ещё дополнение.
Исследую очередь. Пишу в таске: for(i=0; i<BUF_SIZE*9 ; i++) { TMP = i & 0xff; xQueueSend(UART1DataTx, &TMP, 0); } Если делать BUF_SIZE*8 - всё работает. А вот BUF_SIZE*9 - уже нет. Просто виснет и всё.
0
|
|
|
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
|
||
| 26.07.2017, 22:43 | ||
|
Про семафоры я для примера сказал, ситуация правда похожая. в определенный момент происходила порча. Решилась нахождение ошибки при работе с соседним указателем
0
|
||
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
||
| 27.07.2017, 00:28 | ||
Так я там посмотрел в первую очередь. Увеличил памяти в куче и в стеке в 10 раз. Проблема не ушла.
0
|
||
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
|
| 27.07.2017, 01:04 | |
|
Я использую QUBEMX, а там какой-то старый freertos. Может там были какие траблы?
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
|
| 27.07.2017, 09:34 | |
|
Аа, ну так бы и сказали сразу. У вас очередь переполняется. При записи в очередь, вы должны проверять возвращаемое функцией значение. Если оно успешно (pdPASS), то всё норм, а если возвращает errQUEUE_FULL, то ждите, пока она освободится, то есть, пока на приемной стороне очереди по прерываниям произойдет чтение и хоть один элемент освободится.
Таким образом, при записи в очередь, проверяйте возвращаемое значение, и если оно errQUEUE, не пытайтесь писать в очередь следующие элементы, дождитесь освобождения и вновь запишите этот же элемент. Либо банально увеличте размер очереди, когда ее создаете. Еще один неплохой вариант для передачи через очередь больших объемов данных. В очередь передаем ссылку (адрес) на массив данных и размер массива. Всё. На приёмной стороне, приняв адрес массива и его размер, работаем с ним, например, отправляем вкудато. Обратная связь - по семафорам. Семафор поднят - "туалэт занят, идет процесс". Если бы у вас не хватало памяти в куче, то при создании очереди вам бы вернулось состояние ошибки. Кстати, хорошая практика - при создании чего-либо, проверять возвращаемый результат. Кстати, в отправке в очередь вы написали что-то такое страшное, чего я не в силах с первого раза понять... Наверно это надо под каким-то другим углом смотреть. http://www.freertos.org/a00117.html http://www.google.ru/url?sa=t&rct=j&q=& ... lxNx9vObOA
0
|
|
|
0 / 0 / 0
Регистрация: 08.10.2016
Сообщений: 25
|
|
| 27.07.2017, 12:29 | |
|
При создании очереди всё проверяю. Создалась очередь или нет - отслеживаю.
Статус отсылки, также проверяется. Т.е. если очередь переполнена, то реакция на это есть. Собственно что я и хотел показать тем примером, какой под углом надо смотреть )), это я в цикле заполняю очередь. Но она просто подвисает, хотя очередь не полная. Правда в данном примере не проверяется статус отправки. А может быть такое, что где-то во фриртосе настраивается максимальная длина очереди? Ибо это бы всё объяснило.
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
|
| 27.07.2017, 21:21 | |
|
Да нет, очередь явных ограничений на длину не имеет. Ее длина ограничена только доступным пространством в куче. Если она создалась и вернулось pdPASS, значит она на всю запрошенную длину.
Вот вам наглядно, состояние буфера очереди, когда она полностью заполнена. Очередь на 129 байт. Вначале идет 72-байтный блок заголовка, затем сам буфер очереди. Первые два 4-х байтных значения в блоке загловка показывают первый и последний адреса буфера очереди. Разность между этими двумя значениями даст общую длину очереди. <Изображение удалено> Аналогичным образом вы можете сами проверить свою очередь. В режиме отладки посмотрите адрес, на который указывает дескриптор очереди, когда она будет создана, откройте промотрщик памяти и найдите этот адрес. После заполнения очереди посмотрите, что лежит в ней.
0
|
|
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
| 28.07.2017, 13:38 | |
|
2kr1047
Выложи все исходники, ну или хотя бы файлы, где отправка в очередь и прерывание описаны.
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
||||||
| 28.07.2017, 21:34 | ||||||
|
Да, действительно, для общего дела было бы полезнее увидеть реализацию отправляющей в очередь задачки. Потому как непонятно, сколько это - BUF, да еще умноженный на 9. То ли это один элемент, толи там их десяток, и что такое TMP = i & 0xFF. Я честно несколько раз пытался постичь суть этих преобразований, и пришел к выводу, что вроде как пытаются отправлять в очередь последовательность цифр от 0 до 255, либо до BUF_SIZE*9.
Потому я и предложил топикстартеру способ самостоятельно увидеть, что уходит в очередь в его случае. И я там сцылочки кинул на два основополагающих документа. Один - мануал от производителя, другой - широкоизвестные статии от Курница. Хоть они и давнишние, но зато по-русски и практически не потеряли актуальности. Например, банально для примера: отправка текстового сообщения из буфера побайтно в очередь:
Как говорится, после понимания сути, допилить руками до нужной кондиции.
0
|
||||||
| 28.07.2017, 21:34 | |
|
Помогаю со студенческими работами здесь
16
При выполнении оператора портятся данные
Портятся данные при большой частоте прихода сообщений Взял у провайдера белый адрес - компьютер периодически поражается вирусами-шифраторами - портятся все данные ПК
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|