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

Не перестаю восхищаться  операционной системой 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!

Комментарии

Страницы

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

"пикировщик" - от корня названия семейства микроконтроллеров "PIC".

А их программировать я думаю - не мне одной приходится.

Не все же такие, как mike, которым ничего не нужно, кроме, как высказавать своё недовольство жизнью по каждой из публикаций.

 

 

 

 

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

Не все же такие, как mike, которым ничего не нужно, кроме, как высказавать своё недовольство жизнью по каждой из публикаций.

Так и знал: не сможет удержаться и перейдёт на личности. :))

>Не все же такие, как mike, которым ничего не нужно, кроме, как высказавать своё недовольство жизнью по каждой из публикаций.

Пока не все такие как mike.

Имхо.

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

Пока не все такие как mike.

Верно. На С и для пиков писал, и для атмелов, и для далласов. И даже внедрял в серию. И каждый раз казалось, что делаю что-то значительное... Плюсую за искренность автора.

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

Из моей эпопеи, которая никому и нахрен не нужна, очень запомнилось, что при программном  создании БД логин/пароль указываются без =, но в '', а при 1-ом коннекте и создании таблиц без '', но с =. Тоже долго думал. :)

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

"пикировщик" - от корня названия семейства микроконтроллеров "PIC"

ОК, с остальным понятно.

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

Минусую за явный бред и бессмыслицу.

Ах, al, как я рассторилась из-за вашего минуса. Сейсас вот сижу и рыдаю, просто остановиться не могу. И мышка из рук вырывается и пищит.

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

...Мышка из рук вырывается и пищит.

Так отпустите её на волю. И клаву тоже. Зачем насиловать?

>Так отпустите её на волю. И клаву тоже.

На воле они погибают. имхо

Страницы