در قسمت چهارم از آموزش LVGL به بررسی شروع کار با LVGL، دانلود و اضافهکردن کتابخانه LVGL و انجام تنظیمات اولیه lv_conf.h پرداختیم. در این قسمت قصد داریم که درباره انجام تنظیمات فریم بافر LVGL صحبت کنیم. پس تا پایان این بخش همراه سیسوگ باشید.
فریم بافر یک حافظه موقت مانند GRAM و LCD RAM است. در نمایشگرهای دارای درایور، GRAM یک فریم بافر درون درایور است و در نمایشگرهای بدون درایور، فریم بافر موجود در LCD RAM میباشد.
اکنون میریم سراغ بحث تنظیمات فریم بافر. البته ابتدا بررسی میکنیم که فریم بافر چیست.
تعریف فریم بافر (Framebuffer)
بهطورکلی، فریم بافر یک حافظهی موقت میباشد که حاوی تصویر خروجی است و این حافظه توسط پردازنده در زمانهای مشخص به صفحهنمایش انتقال داده میشود.
وظیفه فریم بافر
سیستمهای گرافیکی برای نمایش اطلاعات به کاربر باید آنها را به صفحهنمایش انتقال دهد. وظیفه فریم بافرها این است که این اطلاعات را بهصورت موقت نگهداری کنند تا توسط CPU یا بخش GPU به نمایشگر منتقل شوند.
دراینخصوص، سیستم گرافیکی به کمک فریم بافرها اطلاعات تصویر را جابهجا میکند که تعداد این فریم بافرها قابلتغییر است. اندازه این فریم بافرها میتواند بخشی از تصویر یا اندازه کل تصویر باشد. سیستم گرافیکی این فریم بافرها را کنترل و بهروزرسانی میکند و سپس پردازنده آنها را به صفحهنمایش انتقال میدهد.
مثال:
در شکل زیر فریم بافری که نمایش داده شده، به صورت Full است؛ یعنی فریم بافر شما چه در حافظه داخلی و چه در حافظه خارجی، به اندازه کل تصویر است و تصویر ابتدا داخل فریم بافر تشکیل میشود و سپس این فریم بافر توسط سختافزار به صفحهنمایش انتقال پیدا میکند.
انواع فریم بافر در LVGL
انواع فریم بافر در LVGL از نظر تعداد عبارتاند از:
- One buffer
- Two buffers
بهطورکلی، در سیستم گرافیکی LVGL، فریم بافرها از نظر تعداد بهصورت تک بافر یا دو بافر هستند. تک بافر یعنی یک بافر کامل یا یک بافر کوچک. دو بافر یعنی دو تا بافر کامل یا دو تا بافر کوچک.
انواع روشهای انتقال فریم به تصویر در LVGL
در سیستم گرافیکی LVGL، فریم بافرها از نظر روش انتقال به تصویر به سه بخش زیر تقسیم میشوند:
- Partial mode
- Full refresh mode
- Direct mode
در ادامه به بررسی هر یک از این موارد میپردازیم.
حالت تک بافر (One buffer)
حالت تک بافر به این صورت هست که سیستم گرافیکی، تصویر را بهصورت بخشبخش یا کامل از طریق فریم بافری که در اختیارش قرار دادیم، به صفحهنمایش منتقل میکند.
پس یک بافر فقط در اینجا وجود دارد.
حالت دو بافر (Two buffer)
در این حالت دو بافر در اختیار CPU هست که سیستم گرافیتان با توجه به این دو تا فریم بافری که در اختیارش میدهید، تصویر را پر میکند.
در صورتی که سیستم گرافیکی شما این قابلیت را داشته باشد که بافرها را به صورت جداگانه با یک ویژگی سختافزاری پر کند، این قابلیت Two buffer کمک میکند که شما Refresh Rate بالاتری داشته باشید. اندازه این فریم بافرها کاملاً به اندازه حافظهای که در اختیار میکروکنترلر هست، بستگی دارد.
در این حالت، سیستم گرافیکی ابتدا فریم بافر ۱ را پر میکند، سپس فریم ۱ توسط یک واحد سختافزاری به صفحهنمایش (Display) منتقل میشود؛ در حین این انتقال، سیستم گرافیکی، فریم بافر ۲ را پر میکند و فریم ۲ بعد از اتمام انتقال فریم ۱، به صفحهنمایش منتقل میشود. به شکل زیر توجه کنید:
حالت انتقال تصویر Partial
این حالت به صورت تکهتکه، تصویرتان را میبرد و سپس به داخل Display میریزد. به عبارت دیگر، در این حالت تصاویر به صورت فریمهای کوچک به صفحهنمایش انتقال داده میشوند.
از مهمترین ویژگیهای Partial mode میتوان به موارد زیر اشاره کرد:
- بهینهسازی حافظه موقت برای انتقال تصویر
- امکان انجام عملیات pipeline برای انتقال تصویر
- قابل پیاده سازی در بیشتر میکروکنترلرها
- افزایش سرعت انتقال تصویر و کاهش سربار دستوری
به تصویر زیر توجه کنید:
حالت انتقال تصویر Full refresh
در این حالت که برای میکروکنترلرهای قویتر میباشد، تصاویر به صورت کامل روی فریم بافر تشکیل و پس از آن به Display منتقل میشوند.
زمانی که شما از حالتFull refresh استفاده میکنید، نیاز به حافظه موقت بزرگ دارید. یعنی در این حالت، وجود حافظه موقت حداقل به اندازهی کل تصویر در سیستم گرافیکی، الزامی است. در اینجا فریم بافر میتواند داخل یک حافظه موقت داخلی یا حافظه موقت خارجی باشد که هیچ فرقی ندارد.
به شکل زیر توجه کنید:
نکته✅
* در حالت Full refresh شما میتوانید دو بافر هم داشته باشید.
* اگر سختافزار شما قوی باشد، Full refresh mode به افزایش نرخ تصویرتان کمک میکند و اگر سختافزار شما قوی نباشد، نمیتوانید از این ویژگی بهره کامل را ببرید و در صورت استفاده از آن، تازه سیستمتان کند میشود.
حالت انتقال تصویر Direct mode
در این حالت شما به صورت Direct mode کار میکنید. Direct mode ترکیبی از مدهای Full refresh و Partial mode هست.
در Direct mode تغییرات در فریم بافر به صورت مستقیم از مکانهای مختلف به تصویر انتقال پیدا میکند.
- افزایش نرخ بالاتر فریم تصویر
- بهینهسازی عملکرد CPU برای انتقال تصویر
- امکان انجام عملیات pipeline برای انتقال تصویر
- نیاز به حافظه خارجی کمتر نسبت به حالت قبل
به شکل زیر توجه کنید:
نکته✅
*Direct mode حالت دابل بافر (Double Buffer) هم دارد؛ اما یک سری اطلاعاتی نیاز هست که شما داشته باشید و یک سری هماهنگ سازیهایی هست که شما باید همزمان با کپی کردن بافر، انجام دهید.
* تنظیمات همه بافرهایی که توضیح داده شد در قسمت Creat a display buffer انجام میشود که درباره آن به طور مفصل در قسمتهای بعدی توضیح خواهیم داد.
خب…
این قسمت از آموزش سیستم گرافیکی LVGL هم به پایان رسید. حتماً در ادامه این آموزش، با سیسوگ همراه باشید.