Бурбалки паветра у струмени пикироушчыка

Бурбалкі паветра ў струмені пікіроўшчыка

 Не перастаю захапляцца  аперацыйнай сістэмай FREE RTOS. Маленькая, але ўдаленькая, гэтулькі ўсяго можа.

 Напісала праект пад яе з трох струменяў.
 Адзін струмень прымае паведамленні, а два другіх адпраўляюць. І запусціла. Напачатку штосьці глюкнула адзін раз, а потым запрацавала без адзінай страты.
 - Ну, падумаеш, напачатку штосьці страцілася. Нічога страшнага, - сказала я.
 - Разабрацца трэба, - сказаў СВ.
 І пайшла я, незадаволеная, разбірацца…

 І стала паведамленні па адным адпраўляць.
 Адправіла адно паведамленне - прачытала нуль.

 Адправіла два паведамленні - прачытала спачатку нуль, а потым першае паведамленне. А другое затрымалася ў чарзе. І каб атрымаць яго, трэба паслаць яшчэ адно…
 Калі струмень паведамленняў бесперапынны, то гэта неўзаметку…
 - Ну, падумаеш, - сказала я.
 - Дрэнна, - сказаў СВ, - думаць трэба…

 І стала я думаць. І замест таго, каб пісаць у канец чаргі, я стала пісаць у пачатак.
 Адправіла адно паведамленне - атрымала яго.
 Адправіла два - і таксама атрымала.
 Запусціла струмень - запрацавала без страт.
 І ніякіх нулёў спачатку.
 - Ну, як? - спытала я.
 - Дрэнна, - сказаў СВ, - пры вялікай нагрузцы першыя паведамленні могуць затрымацца ў чэргі назаўжды…
 - А што ты прапануеш? - спытала я раздражнёна.
 - Не ведаю, - сказаў СВ. - Думаць трэба…

 І пайшла я "думаць".
 І запусціла ўсё ў адладчыку, і прайшлася па кроках па ўсіх этапах. І знайшла памылку. Пасля скіду няправільна фармуецца паказальнік па чытанні.
 Я падправіла адзін радок кода, і ўсё запрацавала як трэба.
 - Ну, як? - спытала я.
 - Хай працуе, - усміхнуўся СВ.

 Для тых, каму цікава, у файле    queue.c   радок:

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

 я замяніла на:

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


Рецензии