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

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

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

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

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

 Отправила два сообщения – прочитала сначала нуль, а потом первое сообщение. А второе застряло в очереди. И чтобы получить его, надо послать ещё одно…
 Если поток сообщений непрерывный, то этого незаметно…
 - Ну, подумаешь, - сказала я.
 - Плохо, - сказал СВ, - думать надо…

 И стала я думать. И вместо того, чтобы писать в конец очереди, я стала писать в начало.
 Отправила одно сообщение – получила его.
 Отправила два – и тоже получила.
 Запустила поток – заработало без потерь.
 И никаких нулей вначале.
 - Ну, как? – спросила я.
 - Плохо, - сказал СВ, - при большой нагрузке первые сообщения могут застрять в очереди навсегда…
 - А что ты предлагаешь? – спросила я раздражённо.
 - Не знаю, - сказал СВ. – Думать надо…

 И пошла я «думать».
 И запустила всё в отладчике, и прошлась по шагам по всем этапам. И нашла ошибку. После сброса неправильно формируется указатель по чтению.
 Я подправила одну строчку кода, и всё заработало как надо.
 - Ну, как? – спросила я.
 - Пусть работает, - улыбнулся СВ.


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

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

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

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


Рецензии
какие загадочные строчки в конце текста.

Амиля Тарасёнская   17.12.2014 14:33     Заявить о нарушении