មេរៀនរងទី 1បច្ចេកទេសកំណត់សមត្ថភាព compile-time៖ macros, enum, និងការពិនិត្យ static_assert បែប C99ផ្នែកនេះពិពណ៌នាពីបច្ចេកទេស compile-time សម្រាប់កំណត់សមត្ថភាពប៊ណ្ឌា។ អ្នកនឹងប្រើ macros, enums, និង static assertions បែប C99 ដើម្បីបង្ខំកំហិត ការពារការប្រើប្រាស់ខុស និងរក្សាការកំណត់ប៊ណ្ឌាស៊ីរ៉ូឡា ឱ្យស៊ីសង្វាក់គ្នាកាត់ពាណិក្យ។
កំណត់សមត្ថភាពដោយ macros ឬ enumsការពារការកំណត់ទំហំសូន្យ ឬតូចពេកការពិនិត្យទំហំបែប static-assert ក្នុង C99ចែករំលែកសមត្ថភាពក្នុង headers ដោយសុវត្ថិភាពការពារការលេចហួតក្នុងការគណនា indeksមេរៀនរងទី 2ការរៀបចំអង្គភាព និងការផ្គូផ្គង៖ struct packing, static allocation, និងការកាត់បន្ថយទំហំផ្នែកនេះគ្របដណ្តប់ពីការរៀបចំអង្គភាពសម្រាប់ប៊ណ្ឌា និងតារាង SensorReading។ អ្នកនឹងរៀនអំពី struct packing, alignment, static allocation, និងរបៀបកាត់បន្ថយទំហំ RAM និង flash ខណៈពេលដែលរក្សាការចូលប្រើប្រាស់ប្រកបដោយប្រសិទ្ធភាពលើគោលដៅ embedded។
កំណត់កន្លែងផ្ទុក SensorReading arrayផលប៉ះប្រយ័ត្ននៃ struct padding និង alignmentប្រើ static និង global allocation ដោយសុវត្ថិភាពកាត់បន្ថយការប្រើប្រាស់ RAM និង flashCache friendliness និង access patternsមេរៀនរងទី 3is_empty និង is_full៖ ការពិនិត្យ O(1) និងការជៀសវាងកំហុស off-by-oneផ្នែកនេះពន្យល់ពីរបៀបអនុវត្ត is_empty និង is_full ជាការពិនិត្យ O(1)។ វាគ្របដណ្តប់យុទ្ធសាស្ត្រ count-based និង index-based, ជៀសវាងកំហុស off-by-one, និងរក្សាតក្កវិជ្ជាឱ្យស៊ីសង្វាក់គ្នាជាមួយការបញ្ចូល និងការយកចេញក្នុង firmware C។
ស្ថានភាព empty និង full ដោយផ្អែកលើ countយុទ្ធសាស្ត្រเปรียប head និង tailការពារកំហុសតក្កវិជ្ជា off-by-oneរក្សាការពិនិត្យឱ្យស៊ីសង្វាក់គ្នាជាមួយ push/popInline functions និង macro alternativesមេរៀនរងទី 4ការរៀបចំ struct SensorReading៖ uint8_t id, uint32_t timestamp, int16_t value, និងការពិចារណា paddingផ្នែកនេះពិនិត្យមើលការរៀបចំ struct SensorReading យ៉ាងលម្អិត។ វាគ្របដណ្តប់ uint8_t id, uint32_t timestamp, int16_t value, padding, alignment, និងរបៀបដែលការតម្រៀបវាលអាចកាត់បន្ថយទំហំ និងធ្វើឱ្យការចូលប្រើប្រាស់ប្រសើរឡើងលើស្ថាបត្យកម្ម embedded ធម្មតា។
ជ្រើសរើសប្រភេទ integer សម្រាប់វាលតម្រៀបវាលដើម្បីកាត់បន្ថយ paddingពិនិត្យ sizeof និង alignmentប្រើ static assertions លើទំហំ structកង្វល់ portability កាត់ពាណិក្យមេរៀនរងទី 5ការអនុវត្ត push_reading៖ គោលនយោបាយ overwrite-oldest, ការពិចារណា atomicity ក្នុង firmware embedded single-threadedផ្នែកនេះលម្អិតពីការអនុវត្ត push_reading ដ៏រឹងមាំសម្រាប់ប៊ណ្ឌាស៊ីរ៉ូឡា ដែលមានទំហំកំណត់។ អ្នកនឹងរៀនពី semantics overwrite-oldest, ការធ្វើបច្ចុប្បន្នភាព indeks, ឥរិយាបទ atomic ក្នុង firmware single-threaded, និងការផ្ទៀងផ្ទាត់ប៉ារ៉ាម៉ែត្រ defensive ក្នុង C។
Function prototype និងការរចនាប៉ារ៉ាម៉ែត្ររកឱ្យឃើញប៊ណ្ឌាពេញមុនពេលបញ្ចូលOverwrite ធាតុចាស់បំផុតដោយត្រឹមត្រូវធ្វើបច្ចុប្បន្នភាព head, tail, និង count លើ pushគ្រប់គ្រង NULL pointers និង capacity មិនល្អមេរៀនរងទី 6យុទ្ធសាស្ត្រ testing លើ host៖ unit test scaffolding, ឈុត deterministic, និងការសាកល្បង compile-time ដោយ macrosផ្នែកនេះបង្ហាញពីរបៀបសាកល្បងប៊ណ្ឌាស៊ីរ៉ូឡាលើម៉ាស៊ីន host។ វាគ្របដណ្តប់ unit test scaffolding ក្នុង C, ឈុតបញ្ចូល deterministic, លទ្ធផល golden, និងការសាកល្បង compile-time សាមញ្ញដោយ macros ដើម្បីផ្ទៀងផ្ទាត់ការសន្មត់ និងសមត្ថភាព។
រចនា C test harness តូចបំផុតPush និង pop sequences deterministicពិនិត្យ wrap-around និង overwrite casesប្រើ macros សម្រាប់ការពិនិត្យ compile-timeស្វ័យប្រវត្តិការសាកល្បងជាមួយ Makefile targetsមេរៀនរងទី 7Indeks ខាងក្នុងប៊ណ្ឌាស៊ីរ៉ូឡា៖ head, tail, count បើកុំមែនជាយុទ្ធសាស្ត្រ sentinel empty/fullផ្នែកនេះស្វែងយល់ពីយុទ្ធសាស្ត្រ indeks ខាងក្នុងសម្រាប់ប៊ណ្ឌាស៊ីរ៉ូឡា។ អ្នកនឹងប្រៀបធៀបការតាមដាន head, tail, និង count ជាមួយវិធីសាស្ត្រ sentinel empty ឬ full ហើយរៀនពីរបៀបដែលជម្រើសនីមួយៗប៉ះប្រយ័ត្នលើភាពស្មុគស្មាញ ភាពច្បាស់លាស់ និងការប្រើប្រាស់អង្គភាព។
Semantics indeks head និង tailវាល count បើកុំមែនជា sentinel slotការគណនា modulo និង wrap-aroundរកឱ្យឃើញស្ថានភាព full និង emptyការផ្លាស់ប្តូរ ក្នុងភាពច្បាស់លាស់ និងទំហំកូដមេរៀនរងទី 8ការចាប់ផ្តើម និង invariants៖ init_buffer, ការកំណត់ indeks ឡើងវិញ, ការផ្ទៀងផ្ទាត់ស្ថានភាពផ្នែកនេះគ្របដណ្តប់ការចាប់ផ្តើម និង invariants សម្រាប់ប៊ណ្ឌា។ អ្នកនឹងអនុវត្ត init_buffer, កំណត់ indeks ឡើងវិញ, សម្អាត count, និងកំណត់ invariants ដែលត្រូវរក្សាជានិច្ច ដែលអនុញ្ញាតឱ្យការគិតគូកាន់តែមានសុវត្ថិភាព និងការស្វែងរកកំហុសកាន់តែងាយស្រួលក្នុង embedded C។
រចនា init_buffer API និងការប្រើប្រាស់កំណត់ head, tail, និង count ទៅកាន់លំនាំដើមការសម្អាតអង្គភាពជាជម្រើសឯកសារកំណត់ invariants ដែលត្រូវការក្នុង Cការចាប់ផ្តើមឡើងវិញបន្ទាប់ពីរកឃើញការខូចខាតមេរៀនរងទី 9ភាពស្មុគស្មាញពេលវេលា និងការពន្យល់៖ ឯកសារកំណត់ការធានា O(1) និងការផ្លាស់ប្តូរផ្នែកនេះផ្តោតលើការឯកសារកំណត់ភាពស្មុគស្មាញពេលវេលា និងឥរិយាបទ។ អ្នកនឹងរៀនពីរបៀបហេតុផលការធានា O(1), ពិពណ៌នាការផ្លាស់ប្តូរ, និងសរសេរការពន្យល់ខ្លីៗដែលជួយអ្នករក្សាបង់នាពេលអនាគតយល់ពីការអនុវត្តប៊ណ្ឌាស៊ីរ៉ូឡា។
វិភាគភាពស្មុគស្មាញ push និង popពន្យល់ការផ្លាស់ប្តូរ គោលនយោបាយ overwriteការពន្យល់ indeks និងការធ្វើបច្ចុប្បន្នភាព countឯកសារកំណត់ការគ្រប់គ្រងកំហុសប្រើការពន្យល់បែប Doxygen ក្នុង Cមេរៀនរងទី 10ការអនុវត្ត pop_oldest៖ រាយការណ៍កំហុសដោយគ្មាន dynamic memory, sentinel return values និង status codesផ្នែកនេះពន្យល់ពីការអនុវត្ត pop_oldest ដោយគ្មាន dynamic memory។ អ្នកនឹងរៀនពីរបៀបត្រឡប់ទិន្នន័យដោយសុវត្ថិភាព, ប្រើ sentinel values ឬ status codes, គ្រប់គ្រង underflow, និងរក្សា API ឱ្យច្បាស់សម្រាប់អ្នកហៅ embedded ក្នុង C។
Function signature និង output parametersរកឃើញ និងបញ្ជូនសញ្ញាប៊ណ្ឌាទទេប្រើ status codes និង enum resultsជៀសវាង dynamic allocation ក្នុងការត្រឡប់ធ្វើបច្ចុប្បន្នភាព indeks និង count លើ pop