Пузырьки воздуха в потоке пикировщика

Не перестаю восхищаться  операционной системой FreeRTOS. Маленькая, но удаленькая, столько всего может.

Написала проект под неё из трёх потоков.

Один поток принимает сообщения, а два других отправляют. И запустила. В начале что-то глюкнуло один раз, а потом заработало без единой потери.

- Ну, подумаешь, в начале что-то потерялось. Ничего страшного, - сказала я.

- Разобраться надо, - сказал СВ.

И пошла я, недовольная, разбираться…

И стала сообщения по одному отправлять.

Отправила одно сообщение – прочитала нуль.

Отправила два сообщения – прочитала сначала нуль, а потом первое сообщение. А второе застряло в очереди. И чтобы получить его, надо послать ещё одно…

Если поток сообщений непрерывный, то этого незаметно…

- Ну, подумаешь, - сказала я.

- Плохо, - сказал СВ, - думать надо…

И стала я думать. И вместо того, чтобы писать в конец очереди, я стала писать в начало.

Отправила одно сообщение – получила его.

Отправила два – и тоже получила.

Запустила поток – заработало без потерь.

И никаких нулей вначале.

- Ну, как? – спросила я.

- Плохо, - сказал СВ, - при большой нагрузке первые сообщения могут застрять в очереди навсегда…

- А что ты предлагаешь? – спросила я раздражённо.

- Не знаю, - сказал СВ. – Думать надо…

И пошла я «думать».

И запустила всё в отладчике, и прошлась по шагам по всем этапам. И нашла ошибку. После сброса неправильно формируется указатель по чтению.

Я подправила одну строчку кода, и всё заработало как надо.

- Ну, как? – спросила я.

- Пусть работает, - улыбнулся СВ.

Для тех, кому интересно, в файле    queue.c   строку:

pxQueue->pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( unsigned portBASE_TYPE ) 1U ) * pxQueue->uxItemSize );

я заменила на:

pxQueue->pcReadFrom = pxQueue->pcTail - pxQueue->uxItemSize; 

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

таперича жду, когда мине нобелевскую премию пришлют прям на дом за энту коректировку.

Аватар пользователя Al

Ага, в Кащенко уже машину готовят, выезжают... Что за бред?

Аватар пользователя mike

CB=Citizens Band

Hehe.

СВ - это наш очень ценный программист. Он не хочет, чтобы оглашали его имя.

Аватар пользователя Dmitry

Название "загогулистое"...

Аватар пользователя leo3

Варкалось. Хливкие шорьки
Пырялись по наве,
И хрюкотали зелюки,
Как мюмзики в мове.

:) оказывается она еще и ОСРВ :) при этом буквосочетании повеяло такой ностальгией и молодостью:) когда диски были большие, мониторы зеленые, а мы с Майком молодые:)

Аватар пользователя mike

Для тех, кому интересно, в файле...

Интересно, а кому-нибудь интересно?

Аватар пользователя Al

Фрейду?

Аватар пользователя savely

А я плюсик поставлю :)) Хорошая история, учит правильному, что такое хорошо и что такое плохо. 

> Ну, подумаешь, в начале что-то потерялось. Ничего страшного, - сказала я.

 Плохо

> Разобраться надо 

Хорошо. 

Ну, и хеппи-энд :))

 

Страницы