Бурбалки паветра у струмени пикироушчыка
Не перастаю захапляцца аперацыйнай сістэмай FREE RTOS. Маленькая, але ўдаленькая, гэтулькі ўсяго можа.
Напісала праект пад яе з трох струменяў.
Адзін струмень прымае паведамленні, а два другіх адпраўляюць. І запусціла. Напачатку штосьці глюкнула адзін раз, а потым запрацавала без адзінай страты.
- Ну, падумаеш, напачатку штосьці страцілася. Нічога страшнага, - сказала я.
- Разабрацца трэба, - сказаў СВ.
І пайшла я, незадаволеная, разбірацца…
І стала паведамленні па адным адпраўляць.
Адправіла адно паведамленне - прачытала нуль.
Адправіла два паведамленні - прачытала спачатку нуль, а потым першае паведамленне. А другое затрымалася ў чарзе. І каб атрымаць яго, трэба паслаць яшчэ адно…
Калі струмень паведамленняў бесперапынны, то гэта неўзаметку…
- Ну, падумаеш, - сказала я.
- Дрэнна, - сказаў СВ, - думаць трэба…
І стала я думаць. І замест таго, каб пісаць у канец чаргі, я стала пісаць у пачатак.
Адправіла адно паведамленне - атрымала яго.
Адправіла два - і таксама атрымала.
Запусціла струмень - запрацавала без страт.
І ніякіх нулёў спачатку.
- Ну, як? - спытала я.
- Дрэнна, - сказаў СВ, - пры вялікай нагрузцы першыя паведамленні могуць затрымацца ў чэргі назаўжды…
- А што ты прапануеш? - спытала я раздражнёна.
- Не ведаю, - сказаў СВ. - Думаць трэба…
І пайшла я "думаць".
І запусціла ўсё ў адладчыку, і прайшлася па кроках па ўсіх этапах. І знайшла памылку. Пасля скіду няправільна фармуецца паказальнік па чытанні.
Я падправіла адзін радок кода, і ўсё запрацавала як трэба.
- Ну, як? - спытала я.
- Хай працуе, - усміхнуўся СВ.
Для тых, каму цікава, у файле queue.c радок:
pxQueue->pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( unsigned portBASE_TYPE ) 1U ) * pxQueue->uxItemSize );
я замяніла на:
pxQueue->pcReadFrom = pxQueue->pcTail - pxQueue->uxItemSize;
Свидетельство о публикации №214072900426