عملية جراحية لزيادة المخزن المؤقت للمنفذ التسلسلي لـ Arduino IDE





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



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



أولاً ، ربما تسأل لماذا أستخدم IDE. باختصار ، أنا لا أستخدمه. ومع ذلك ، إذا فعلت شيئًا سيستخدمه الآخرون ، فمن المستحيل تقريبًا تجاهله. ومع ذلك ، قمت بإعداد IDE الخاص بك ، فبمجرد وصول الرمز الخاص بك إلى الإنترنت ، سيحاول شخص ما استخدامه مع IDE. كتبت ذات مرة عن جهاز كمبيوتر يستند إلى 4 دولارات Z80 . نادرًا ما يكون لدي الوقت لبناء ما أكتب عنه ، لكنني أردت حقًا تجربة بناء هذا الكمبيوتر الصغير. لفترة من الوقت ، كان كل شيء في حالة نصف مفككة ، ثم أرسلوا لي مبلغًا مقابله. لقد تلقيتها ، وكما قد تكون خمنت ، ما زالت موجودة نصف مفككة قليلاً. لكنني وجدت أخيرًا الوقت لإنهاء المشروع وقمت بتنزيل CP / M.







كانت المشكلة الوحيدة في المشروع هي عدم وجود خيارات جيدة لنقل البيانات منه إلى الكمبيوتر الشخصي والعكس صحيح. يبدو أن أفضل شيء يمكن فعله هو إنشاء ملفات سداسية عشرية من Intel ونسخها / لصقها عبر الجهاز. أردت شيئًا أفضل وانتهى بي الأمر في حفرة أرنب صباح السبت. نتيجة لذلك ، توصلت إلى طريقة لإضافة عناصر القائمة الخاصة بي إلى Arduino IDE من أجل تحرير إعدادات المترجم اعتمادًا على الأجهزة المستخدمة في المشروع. هذه الحيلة تستحق التعلم لأنها يمكن أن تكون مفيدة خارج هذه المهمة بالذات.



المشكلة: الحد من حجم المخزن المؤقت لمنفذ Arduino التسلسلي



لن أزعجك بالتفاصيل حول كيفية جعل اللوحة تعمل ، حيث لن تكون مهتمًا إلا إذا كان لديك واحدة. جميع التفاصيل في المناقشة على Hackaday.io إذا كنت في حاجة إليها حقًا. نتيجة لذلك ، لم يكن المخزن المؤقت للمنفذ التسلسلي Arduino كبيرًا بما يكفي للإرسال عبر XModem ليتم اعتباره موثوقًا به. يبدو أن كل شيء يعمل مع المخزن المؤقت الافتراضي 64 بايت ، لكن XModem يرسل المزيد من البيانات ومن السهل تخيل فائض المخزن المؤقت.



ما مدى صعوبة تحديث المخزن المؤقت؟ من ناحية أخرى ، هذه مهمة تافهة. من ناحية أخرى ، الأمر صعب للغاية ، لأن أدواتك تحاول جاهدة مساعدتك.



مجموعة من الأدوات



يستخدم مشروع الكمبيوتر الصغير شريحة Z80 حقيقية و ATMega32A لجميع الوظائف الإضافية تقريبًا. يوفر سرعة الساعة ، المنفذ التسلسلي ، التخزين ، إلخ. ومع ذلك ، فإن Arduino IDE لا يدعم بشكل مباشر ATMega32A ، لذلك عليك تثبيت صندوق أدوات للقيام بذلك. يتطلب الوضع MightyCore ، لذلك استخدمته.



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



#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_TX_BUFFER_SIZE 16
#else
#define SERIAL_TX_BUFFER_SIZE 64
#endif
#endif
#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif


إجراء التغييرات



إنه بسيط ، أليس كذلك؟ حدد الرموز قبل تحميل HardwareSerial.h. شيت - يتم تحميل هذا الملف في Arduino.h. يريد SP إضافته إلى برنامجك وجعله يبدأ أولاً. يبدو أن بعض إصدارات IDE تم فحصها لمعرفة ما إذا كنت قد قمت بتمكينها بالفعل حتى لا تعيد تمكينها ، لكن الإصدار 1.8.5 لا يفعل ذلك. ربما يمكنني تمرير بعض الإعدادات إلى المترجم؟ لا. على الأقل ليس من خلال IDE.



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



التحقق من الافتراضات مع



استطعت أن أرى أن ما كنت أفعله لم يكن يعمل لأنني كنت أدخل مؤقتًا عبارات #if و # خطأ في HardwareSerial.cpp. على سبيل المثال:



#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif


الآن إذا تعطل الخطأ 256 أثناء التجميع ، فأنا أعلم أن الحجم قد تم تعيينه. إذا لم يكن الأمر كذلك ، فسيقاوم النظام تغييراتي.



المفاضلة: إضافة الإعدادات إلى القوائم على مستوى اللوحة



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







من الواضح أن هذا سيكون لأنني قمت بإنشاء قائمة لـ IDE ، والتي تظهر فقط عند استخدام ATMega32 لـ Mighty Core. يمكن تحديد أحد أحجام المخزن المؤقت المحددة مسبقًا من القائمة.



لتحقيق هذه النتيجة ، عليك اتخاذ ثلاث خطوات:



  1. أخبر IDE أن لديك عنصر قائمة جديدًا وقم بوصف الشكل الذي يبدو عليه.
  2. يجب أن يغير العنصر الجديد إعدادات المحول البرمجي.
  3. نظرًا لأن النظام الحالي يغير أيضًا إعدادات المترجم ، فأنت بحاجة إلى التأكد من عدم تلفها.


الخطوة الأولى سهلة. كان ملف board.txt الخاص بي في ~ / .arduino15 /packs / MightyCore / Hardware / avr / 2.0.5 /boards.txt. توجد في الجزء العلوي تقريبًا قائمة بعناصر القائمة ، وفي النهاية أضفت قائمة بعناصر القائمة:



# Menu options
menu.clock=Clock
menu.BOD=BOD
menu.LTO=Compiler LTO
menu.variant=Variant
menu.pinout=Pinout
menu.bootloader=Bootloader
menu.SerialBuf=Serial Port Buffers (RX/TX)


ثم قمت بنقل الخطوط لأسفل وأضفت القائمة الخاصة بي أمام إعداد LTO الحالي لـ ATMega32:



32.menu.SerialBuf.disabled=Default
32.menu.SerialBuf.disabled.compilerSB.c.extra_flags=
32.menu.SerialBuf.disabled.compilerSB.cpp.extra_flags=
 
32.menu.SerialBuf.SB64=64/64
32.menu.SerialBuf.SB64.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB64.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB128=128/128
32.menu.SerialBuf.SB128.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
32.menu.SerialBuf.SB128.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
 
32.menu.SerialBuf.SB12864=128/64
32.menu.SerialBuf.SB12864.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB12864.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB256=256/256
32.menu.SerialBuf.SB256.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
32.menu.SerialBuf.SB256.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
 
32.menu.SerialBuf.SB25664=256/64
32.menu.SerialBuf.SB25664.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB25664.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB25632=256/32
32.menu.SerialBuf.SB25632.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32
32.menu.SerialBuf.SB25632.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32


هيكل القائمة



يمكنك أن ترى أن كائن القائمة 32. يجمع كل العناصر معًا لمعالج معين. بعد ذلك يأتي مفتاح القائمة لدينا (SerialBuf). ويلي ذلك مفاتيح فريدة لكل عنصر من عناصر القائمة. من المهم عدم إعادة استخدامها. إذا كان لديك ، على سبيل المثال ، مفتاحان SB64 ، فسيعمل أحدهما فقط.



إذا قمت بتعيين علامة يساوي لهذا المفتاح ، يمكنك تعيين نص لعنصر القائمة هذا. على سبيل المثال ، "افتراضي" أو "64/64". يمكنك أيضًا إضافة خاصية إلى المفتاح وسيتم تعيينها عند تنشيط العنصر.



إذا ، على سبيل المثال ، حدد 256/256 ، ثم يقوم المترجم بتعيين الخاصية compilerSB.c.extra_flags. لماذا توصلت إلى مثل هذا الاسم للممتلكات ، ستفهم بعد ذلك بقليل.



التعايش السلمي



الخاصية compilerSB.c.extra_flags غير موجودة. بشكل صحيح يطلق عليه compiler.c.extra_flags. ومع ذلك ، فإن إعداد Mighty Core LTO يستخدم نفس المفتاح. لذلك ، كان من المهم أن تظهر القائمة الجديدة أولاً وأن تحدد أيضًا خاصية وهمية. فأنت بحاجة إلى تصحيح رمز LTO:



# Compiler link time optimization
32.menu.LTO.Os=LTO disabled
32.menu.LTO.Os.compiler.c.extra_flags={compilerSB.c.extra_flags}
32.menu.LTO.Os.compiler.c.elf.extra_flags=
32.menu.LTO.Os.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags}
32.menu.LTO.Os.ltoarcmd=avr-ar
 
32.menu.LTO.Os_flto=LTO enabled
32.menu.LTO.Os_flto.compiler.c.extra_flags={compilerSB.c.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.compiler.c.elf.extra_flags=-w -flto -g
32.menu.LTO.Os_flto.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.ltoarcmd=avr-gcc-ar


التغيير الرئيسي هو إضافة كل مجموعة من العلامات إلى قائمة الإعداد المسبق. هذا يضيف جميع العلامات إلى الخاصية الصحيحة ، compiler.c.extra_flags.



لقد قمت بتكوين ملاءمة الخطأ لجميع الحالات لضمان تعيين كل شيء بشكل صحيح.



التخصيص لنفسك



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



قد يكون من الأفضل إنشاء ملف board.txt منفصل خاص بي بنفس المعلومات ، ولكن بعد ذلك سأضطر إلى أخذ بقية Mighty Core معي. بدلاً من ذلك ، قمت للتو بحفظ نسخة من هذا الملف كـ board.txt.custom ، وإذا اختفت القائمة الخاصة بي ، فسأقارن محتوياتها بـ board.txt لمعرفة ما تغير.



بطبيعة الحال ، إذا لم تكن بحاجة إلى التعامل مع الأشخاص الداعمين الذين يستخدمون IDE ، فيمكنك نسيان ذلك. من الأفضل استخدام Pro IDE ، حتى مع بعض عيوبه. حسنًا ، يمكنك دائمًا الرجوع إلى Platform.io.



أنظر أيضا:






All Articles