سؤال

لديّ مشروع مضمن أعمل عليه ، وأنا أقوم حاليًا بترميز برنامج تشغيل حرف LCD.

في الوقت الحالي ، يدعم برنامج تشغيل LCD الكتابة "الغبية" فقط. على سبيل المثال ، لنفترض أن السطر 1 يحتوي على بعض النص عليه ، وأقوم بإجراء مكالمة إلى الوظيفة التي تكتب إلى الخط. ستسعى الوظيفة ببساطة إلى بداية الخط وكتابة النص (بالإضافة إلى مساحة بيضاء كافية لمحو كل ما كان مكتوبًا آخر).

هذا جيد وجيد ، لكنني أشعر أنه غير فعال بشكل فظيع في بعض الأحيان ، لأن بعض الخطوط ببساطة: "بعض القراءة: بعض القيمة"

بدلاً من "القوة الغاشمة" التي تحل محل الخط بأكمله ، أردت تطوير بعض الكود الذي من شأنه أن يكتشف أفضل طريقة تحديث المعلومات على شاشة LCD.

(تمامًا مثل الخلفية ، يستغرق الأمر 2 بايت للبحث عن أي موضع char. يمكنني بعد ذلك البدء في كتابة السلسلة)

كانت فكرتي هي أن أحصل أولاً على حلقة. هذه الحلقة تقارن المدخلات بالكتابة الأخيرة ، وبذلك ، ستغطي شيئين:

ج: جمع كل الاختلافات بين الكتابة الأخيرة والمدخلات. لكل قطعة متجاورة (سواء كان ذلك أو مختلفًا) أضف بايتين إلى عدد البايت. تتم الإشارة إلى هذا في B لتحديد ما إذا كنا نضيع النطاق الترددي التسلسلي.

ب: ستحدد الحلقة ما إذا كان هذا أمرًا ذكيًا حقًا. إذا انتهى الأمر باستخدام المزيد من البايتات لتحديث الخط أكثر من "القوة الغاشمة" في الخط ، فعلينا أن نعود فقط وندع طريقة القوة الغاشمة تتولى. يجب أن نخرج من وظيفة الكتابة الذكية بمجرد استيفاء هذا الشرط لتجنب إضاعة الوقت.

سيتخذ الجزء التالي من الوظيفة جميع الاختلافات ، ويسعى إلى char المطلوب على شاشة LCD ، واكتبها.

وبالتالي ، إذا كان لدينا سلسلة مثل هذه بالفعل على شاشة LCD: "Temp: 80f" ونريد تحديثها إلى "Temp: 79F"

ستمر الوظيفة وترى أن الأمر سيستغرق عرضًا أقل للاستمتاع ببساطة إلى "8" والكتابة "79". سيغطي "7" "8" و "9" سيغطي "0". بهذه الطريقة ، لا نضيع الوقت في كتابة السلسلة بأكملها.

هل يبدو هذا وكأنه فكرة عملية؟

هل كانت مفيدة؟

المحلول

ليس من المنطقي تحسين هذا. نقل 20 بايت في 9600 Baud يأخذ الأجهزة 21 ميلي ثانية. ويأخذ البرنامج بضعة microseconds. سريعًا بما يكفي لتكون قادرًا على تحديث العرض بشكل أسرع مما يمكن أن تتصوره العين البشرية من خلال عامل 2. وليس الأمر كما لو كنت بحاجة إلى "عرض النطاق الترددي" ، لا يوجد أي بيانات إضافية يمكنني التفكير في ذلك "D تريد تعدد الإرسال على القناة التسلسلية.

نصائح أخرى

على افتراض أن الإزاحة في عمليات الشاشة التلقائية وهي عبارة عن كتابة واحدة لإخراج كل حرف متتالي ، فسوف أميل إلى كتابة خط العرض بالكامل في كل مرة ما لم تكن هناك مشكلة في أداء محددة تحاول إصلاحها. أي: التحسينات غير الضرورية هي صداع صيانة محتمل في المستقبل وسيتم إنفاق وقتك "تحسين" بشكل أفضل على شيء يؤثر فعليًا على أداء التطبيق العام.

ملاحظة: إذا كان تحديث العرض هو في الواقع تطبيق يؤثر على مشكلة الأداء ، فمن المحتمل أن يكون لديك شعور بمقدار ما يجب أن تكون أسرع .... ثم (وليس نحن) يمكن أن تكون دليلك الخاص إلى مقدار التحسين بما يكفي.

يبدو أن التنفيذ الذي تخطط له معقد للغاية بالنسبة للمشكلة. كل المقارنة المطلوبة قد تبطئ العملية بالفعل ، إذا لم يكن المعالج سريعًا.

إذا كنت بحاجة فقط إلى التحديث على سبيل المثال قيمة درجة الحرارة ، فيجب عليك فقط تحديث قيمة درجة الحرارة وتجاهل النصوص الثابتة. يجب أن يكون لديك إحداثيات في الذاكرة لكل حقل يحتاج إلى تحديث. ثم فقط انقل موضع الكتابة إلى هذا الموقع واكتب القيمة. هكذا أفعل ذلك عادة.

إذا كان تحديث الشاشة لا يزال بطيئًا جدًا ، فقد تفكر في استخدام لغة التجميع. على سبيل المثال ، قبل بضع سنوات قمت بإنشاء برنامج لجهاز من نوع Wristwatch مع عرض DOT Matrix LCD. كان تحديث العرض بطيئًا جدًا (ما يقرب من ثانية لتحديث الشاشة بأكملها على سبيل المثال عند التمرير) ، لذلك كتبت أقل مستوى روتين في التجميع (لتحل محل حوالي 20 سطرًا من C مع 30 سطرًا من التجميع). كانت الوظيفة الناتجة نصف الحجم وأسرع 3 مرات من وظيفة C المحسّنة ، والآن كانت سرعة تحديث العرض كافية.

بهذه الطريقة ، لا نضيع الوقت في كتابة السلسلة بأكملها.

يجب ألا تضيع الكثير من الوقت على الإطلاق ، وبالتأكيد أقل من الوقت الذي يستغرقه القيام بكل هذا التحقق.

ما هو اتصال LCD؟ SPI/I2C/Parellel؟

مهما كان ، إذا تم دعم DMA من قبل SOC على الواجهة ، استخدمه.

إذا لم يكن الأمر كذلك ، فلا يجب أن تنتظر بين بايت TX ، خاصةً إذا كانت ساعة التعليمات الخاصة بالمعالج أعلى بكثير من ساعة رابط البيانات. من المحتمل أن يكون هذا صحيحًا لأن معظم عرض الشخصيات التي عملت معها لديها مواصفات على مدار الساعة منخفضة.

استخدم إما روتين المقاطعة للتعامل مع إرسال كل بايت أو استخدام نهج "هجين" إذا كان يمكنك التحكم في توجيه المقاطعة (هل تقوم بذلك من أجل توفير الطاقة). هناك كتابة مثيرة للاهتمام هنا

لعرض الأحرف ، هذا النوع من التحديث التحديث هو ما curses كانت المكتبة كل شيء. مرة أخرى في اليوم ، عندما تحدثنا إلى أجهزة كمبيوتر كبيرة مع أطراف غبية وخطوط الهاتف في 1200 باود أو أقل ، كان من الصعب في كثير من الأحيان تحديث الشاشة بسرعة كافية لجعل البرامج تشعر بالتفاعل حول رابط المودم البطيء. جعلت مكتبة Curses من خلال الحفاظ على ذاكرة التخزين المؤقت لما ينبغي أن يكون على شاشة المستخدم وإرسال عدد قريب من العدد الأمثل من أوامر التحرك ومموّقت الأحرف العادية للعرض. لقد تطلب الأمر أن يدعم المحطة نوعًا من أشكال تحديد موقع المؤشر.

تعيش مكتبة لعنات في اثنين من الأشكال ، و ncurses, ، على سبيل المثال ، معروف جيدًا ومفتوح المصدر ومرخص له بموجب GPL.

من حيث المبدأ ، يمكنك تكييف ncurses للتحدث إلى وحدة تحكم العرض الخاصة بك والسماح لها بالقيام بكل العمل الشاق.

السؤال المفتوح هو ما إذا كان الأمر يستحق الجهد. في 9600 باود ، يمكنك إرسال 960 حرفًا في الثانية. هذا سريع بما فيه الكفاية لإعادة رسم خط 4 خط في 20 عمود LCD 12 مرة في الثانية. لذا ، ما لم تكن تعمل في صورة أو ATTINY حيث قد تضطر إلى تنفيذ هذا UART في البرامج وتحتاج إلى دورات للقيام بشيء مفيد فعليًا ، فمن المحتمل أن تكون هناك ميزة ضئيلة لأن تكون ذكيًا للغاية.

ومع ذلك ، لا يزال من المنطقي عادة رسم النص الثابت الخاص بك مرة واحدة ، فقط قم بتحديث القيم المعروضة عند تغييرها.

وضع النص LCD

وأنا أتفق مع الآخرين ، إذا كنت تكتب في وضع النص ، فلا توجد أي نقطة في فعل ذلك على مستوى الشخصية. من المحتمل أن يستغرق وقت المعالجة المطلوب لإجراء الحسابات طالما الوقت لكتابة الأشياء فعليًا.

علاوة على ذلك ، سوف يمضغ مستوى لكل حرف من الذاكرة ، حيث ستحتاج إلى تخزين ما يتم عرضه حاليًا (أي ما تم كتابته آخر مرة).

يمكنك تبسيط العملية عن طريق تقسيم الشاشة إلى أقسام (تميل الخطوط إلى أن تكون الأكثر ملاءمة) ثم العلامات عندما يتغير هذا الخط. يعد هذا مفيدًا بشكل خاص إذا كنت ترغب في الكتابة إلى مخزن مؤقت للذاكرة لشاشتك ، ومزامنتها لاحقًا (في مقاطعة موقوتة على سبيل المثال).

الحد من التصميم

بدلاً من ترك هذا الأمر إلى السائق لتحقيقه ، يمكنك تقليل وقت الكتابة على مستوى التطبيق من خلال ضمان كتابة الأشياء التي تتغير فقط. يمكن تحقيق ذلك من خلال تعيين خلايا قيمة محددة ، والقيام بما يلي بشكل أساسي:

char text[50];
int val;
...
lcd_print("The count is ", 0, 0); // Print static text at the coords (0,0)
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)
...
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)

و لا:

char text[50];
int val;
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)

وضع الرسومات LCD

من ناحية أخرى ، إذا كانت عملية الكتابة الخاصة بك باهظة الثمن ، مثل لي (حوالي 20 بايت ، رسم حرف في وضع الرسومات) ، فإن توفير الوقت على أساس الحرف سيكون مفيدًا. هناك مخططان يمكنك استخدامهما. الأول هو كما تصف ، ولكن قد ترغب أيضًا في التفكير في (إذا كنت تستخدم الوضع الرسومي) مفهوم تخزين خط بكسل أفقي من خلال خط النص.

تتطلب كتابة كل حرف على أساس لكل حرف نقل مؤشر الكتابة يدويًا إلى خط البيكسل ، مع افتراض الرسم الخاص بك أفقياً ، ثم من أعلى إلى أسفل. يمكن إزالة هذه الخطوة عن طريق كتابة جميع الأسطر العليا لجميع الأحرف الموجودة على خط نص ، أو حتى مجموعة فرعية متغيرة (أي "ABC" ثم بشكل منفصل "أنا" في "XXXDEFGHX" -> "ABCDEFGHI").

بالطبع ، يعتمد الادخار الدقيق باستخدام الطريقة الأخيرة على عدد خطوط البكسل التي تتكون من ارتفاع الحرف. كلما زاد عدد الخطوط ، كلما زاد الادخار (لأنك مطالب بنقل المؤشر مرات أكثر).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top