fbpx

Сүүлийн арван хэдэн жилийн хугацаанд маш олон төрлийн ухаалаг төхөөрөмжүүд шинээр бидний хэрэглээнд нэвтэрч байна. Эдгээр төхөөрөмжүүд нь ихэвчлэн, цаг хугацааны хувьд хоцрогдолгүй найдвартай ажиллах шаардлагатай, чухал хэрэгцээг хангахад зориулагдсан байдаг тул энгийн уламжлалт аргаар програмчлах нь утгагүй хэрэг болно. Харин энэхүү комплекс системд зориулагдсан үйлдлийн системийг RTOS буюу Real Time Operating System гэдэг.

Өөрөөр хэлбэл бид энгийн програмчлалыг халж, эмбэддэд систем программчлах дараагийн түвшин буюу үйлдлийн системтэй ажиллана гэсэн үг. RTOS (Real-time operating system) гэдэг нь өгөгдлийг нарийн хуваасан хугацааны агшинд боловсруулах зориулалттай бодит хугацааны тооцоолол хийдэг үйлдлийн систем юм.

Харин FreeRTOS нь 20 гаруй жилийн турш дэлхийн тэргүүлэгч чип үйлдвэрлэлийн компаниудтай хамтарч, жижиг микропроцессор, микроконтроллерт зориулсан үйлдлийн системийг зах зээлд нийлүүлж буй тэргүүлэгч компани юм. Судалгаагаар дэлхий даяар 170 секунд тутамд нэг хүн энэхүү үйлдлийн системийг татаж ашигладаг байна. Одоо Amazon Web Service нь энэхүү үйлдлийн системийг хөгжүүлдэг ба хамгийн анх 2002 онд MIT сургуулиас Open Source байдлаар гарч байжээ.

Тэгвэл FreeRTOS нь хэрхэн ажилладаг вэ?

FreeRTOS-ийг тайлбарлахын тулд хэдүүлээ нэгэн төхөөрөмж төсөөлөх хэрэгтэй. Тухайн төхөөрөмж нь температур мэдэрч, ADC-ээр хөрвүүлээд хэрэглэгчид дэлгэцэн дээр дүрсэлж харуулдаг байг. Энэхүү жижиг төхөөрөмж маань 3-н чухал үйлдэлтэй ба тэр нь:

  1. Температур мэдэрнэ.
  2. Мэдрүүрээс орж ирсэн утгыг тооцоолно.
  3. Тухайн тооцооллын үр дүнг дэлгэцэд дүрсэлж харуулна.

Тэгвэл төхөөрөмжийн маань программ яг л дээрх дарааллын дагуу 3-н үйлдэл нь, loop дотроо дараалж ажилдаг байхаар бичигдэх болно. Энэхүү программчлалын аргыг Super Loop гэдэг ба уншигч та энэхүү аргаар аль хэдийн өөрийн төхөөрөмжийн программчилж үзсэн байх.

Гэвч энэхүү төхөөрөмжийн хувьд 2-р үйлдэл буюу мэдрүүрээс орж ирсэн утгыг тооцоолох хэсэг нь удаан ажиллаж, хэрэглэгчид харагдаж буй дэлгэц нь гацаж болох юм.

Тэгвэл тухайн тохиолдлоос сэргийлж FreeRTOS ашигласнаар хэдүүлээ гурван үйлдлийг 3-н task болгон хувааж программчилна. Харин тухайн task бүр нь тус тусдаа зэрэг loop байдлаар ажиллах ба хэрэглэгчид харагдах дэлгэц нь мэдрүүр болон тооцооллын хэсгээс тусдаа ажиллаж гацахаа болино. Ингэснээр бидний төхөөрөмж маань энгийн super loop программчлалаас 3 дахин хугацааны хоцрогдол багатай, найдвартай ажиллах нь байна. Иймэрхүү олон task-уудаас бүрдсэн программыг multitask систем гэдэг.

Харин төхөөрөмжийн маань хэрэглэж буй процессор нь ESP32-той адил 2 (dual-core) буюу түүнээс дээш цөмтэй бол бидний бичсэн программаас хамаарч task-ууд нь яг зэрэг ажиллах боломжтой. Arduino, ATmega гэх мэт нэг цөмтэй (single-core) микроконтроллер ашиглаж байгаа бол яг тухайн хугацааны агшинд зөвхөн ганц л task процессор дээр идэвхтэй горимд ажиллана. Бусад task нь өөрсдийн ажиллах ээлжээ хүлээж байдаг. Тухайн идэвхтэй ажиллаж байгаа task-уудын төлөв нь гурван дэд төлөвт хуваагдана:

Энэхүү гурван төлөв мөн task schedule, task prioritize гэх мэт функц командуудыг ашигласнаар task-уудад хуваагдсан программыг, өндөр нарийвчлалтай хугацааны агшнуудад хуваарилан ямар ч илүү болон дутуу үйлдэлгүйгээр ажиллуулах боломжтой юм.

Анх авсан жишээний хувьд хэдүүлээ мэдрүүрээс 4ms бүрд утга авдаг утга авахдаа 1ms-ийн хугацаа зарцуулдаг, тухайн утгын тооцооллыг 20ms-ийн турш хийдэг, харин дэлгэц нь 5ms тутамд шинэчлэгдэх ёстой, шинэчлэгдэхэд зарцуулах хугацаа нь мөн 5ms байдаг гэж тооцъё. Super loop аргын хувьд программын нийт ажиллах хугацаа нь:

(мэдрүүрээс утга орж ирэх хугацаа) + (тооцоолол) + (дэлгэц шинэчлэх хугацаа) = 25ms

  • Энэ 25ms-ийн хугацаанд мэдрүүрээс 5-н удаа шинэ утга орж ирэх ба ямарваа нэгэн хувьсагч, массивт хадгалж амжаагүй байхад өмнөх утга нь устана. Эсвэл input buffer нь дүүрч алдаа заах нь байна.
  • Харин дэлгэц нь 5ms тутамд шинэчлэгдэх ёстой байтал ганц шинэчлэгдэхийн тулд 20ms хүлээж хэрэглэгчид гацаж харагдана.

Иймд тухайн программыг FreeRTOS ашиглаж 3-н task болгож ажиллуулах үед эхний task нь өгөгдөл тооцоолох, дэлгэц шинэчлэхийг хүлээлгүй зөвхөн өөрийнхөө даалгаврыг биелүүлж мэдрүүрээс цаг алдалгүй утга бүрийг уншиж авч чадна. Үүнтэй адил дэлгэц нь мэдрүүрээс утга уншиж авах, түүнийг тооцоолох үйл явцыг хүлээлгүй дэлгэцээ шинэчилж ямар ч гацалтгүй цэвэрхэн ажиллах нь байна. Мөн 2-р task болох өгөгдөл боловсруулах 20ms-ийн хугацаанд бид эхний task-ийн кодыг сайжруулж 20ms-ийн хугацаанд орж ирсэн 4-н өгөгдлийг уншиж дунджийг олох гэх мэт дижитал шүүлтүүрийн код бичиж болно.

FreeRTOS нь хамгийн хялбар, элбэг RTOS бөгөөд комплекс үйлдэлтэй эмбэддэд төхөөрөмжид ашиглаж, хугацааны хоцрогдол болон өөр бусад логик асуудлуудыг шийдэхэд ашиглаж болох юм. Энэхүү нийтлэлээр та бүхнийг FreeRTOS-ийн ерөнхий ажиллагааны бүтцийг дажгүй ойлгож авсан болов уу гэж найдаж байна. Мөн тус нийтлэлийг цуврал болгож FreeRTOS-ийн илүү гүнзгий ойлголт, практикийн мэдлэгийг дараа дараагийн нийтлэлүүдээс оруулах болно.

Өөр эх сурвалжийн мэдээлэл сонирхож судлах бол доорх бичлэгийг үзээрэй😉.

Боловсролыг инженерчлэв.

Leave a Reply