لمسألة القسمة و TI

"لا تباهي ، ماريا إيفانوفنا ، واستمع إلى أغنيتك المفضلة" فالينكي "



على الرغم من العنوان الرئيسي ، فإن ترتيب العرض سيكون عكس ذلك - أولاً حول شركة Texas Instruments (بالطبع ليس عن الشركة نفسها ، ما زلت مهندسًا ، لست مدربًا ، محللًا تجاريًا ، لذلك ، حول المنتجات المصنعة من قبل الشركة) ، وعندها فقط حول التقسيم.

الجزء الأول من باليه مارليزون.

سيكون موضوع المناقشة هو عائلة SS13xx الجديدة نسبيًا (SS1310 / SS1350 / SS1352) ، لكنها ليست سوى نقطة بداية لمناقشة الوضع في مجال البرمجة للأنظمة المدمجة. تم تصميم MK هذا للاستخدام في تصميم الأجهزة ذات الواجهات اللاسلكية بمختلف أنواعها (لا أحب حقًا كلمة IoT ذات الكلمات الجديدة ، خاصة لأنها لا تستنفد إمكانية استخدام هذه العائلة).

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

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

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

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

بادئ ذي بدء - النواة الأساسية ، كل شيء قياسي هنا - كل من نواة M3 نفسها معروفة جيدًا وسلسلة الأدوات هي gcc ، توصي الشركة نفسها باستخدام IDEs - ccs و iar. لقد عملت كثيرًا مع آخرهم ، لذلك قررت أن أجرب أي نوع من المنتجات التي أنتجتها العبقرية التوتونية القاتمة للعقل الجماعي TI. يعد Code Composer Studio تطويرًا للشركة وهو مجاني تمامًا بدون أي قيود ، استنادًا إلى (من كان يظن) Eclipse ولديه جميع المزايا والعيوب الكامنة في هذه البيئة.

الشيء الوحيد الذي أود أن أعبر عن حيرتي دفعة واحدة هو أن الشركة تفضل تقديم أدوات إضافية للعمل مع هذا MK (لإنشاء صورة البرامج الثابتة القابلة للتشغيل عبر الأثير ونقلها إلى MK) ، لكنها مكتوبة لسبب ما ، ليس في Java ، وهو أساس بيئة البرمجة ونظام التشغيل الذي يعد جزءًا من حزمة التثبيت ، وعلى Phyton. ليس الأمر أنني لم أحب بشدة هذا الأخير (على الرغم من وجود واحد ، فأنا لا أقبل تعيين هيكل البرنامج مع مسافة بادئة ، ولكن في النهاية "الألوان والألوان مختلفة") ، ولكن ليس من الواضح سبب جذب الكيانات الزائدة بشكل واضح. علاوة على ذلك ، فإن الأدوات نفسها ليست معقدة ، فهي لا تستخدم مكتبات محددة وتم نقلها من قبل المؤلف إلى Java لفترة محدودة جدًا دون أدنى صعوبة في زيادة طول البرنامج بنسبة 20٪ ، وهو أمر غريب بعض الشيء ، دون تغيير ملحوظ في الأداء (نظرًا لأن يرتبط وقت التشغيل بقراءة الملفات ، وهذا ليس مفاجئًا جدًا - ملاحظة متأخرة كتبها Funtik F ...).

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

علاوة على ذلك ، تتم برمجة وحدة تحكم المستشعر (الاسم ليس ناجحًا جدًا ، ولكنها عبارة عن ورقة تتبع مباشرة) باستخدام منتج Sensor Composer Studio. على الفور سؤال آخر - لماذا من الضروري أن يكون لديك منتج منفصل ، ليس لأنه كان من الصعب جدًا تبديل النافذة ، ولكن لا يزال ... ، خاصة وأن الرمز الذي تم إنشاؤه يصبح في نهاية المطاف جزءًا من التعليمات البرمجية لـ MK الرئيسي (بالطبع ، هناك لم يتم تنفيذها ، ولكن تم تضمينها في مساحة العنوان العامة لذاكرة البرنامج).

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

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

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

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

أعتقد أنه أصبح واضحًا للقارئ أن كتابة برنامج كامل لهذا عضو الكنيست ليست مهمة بسيطة ، فهي متاحة تمامًا لمحترف متقدم ، ولكن ما الذي يجب أن يفعله المطور "العادي" (كما كتب أوليغ أرتامونوف مؤخرًا ، "لقد أدركت بالفعل أنك ارتكبت خطأ كبيرًا باختيار المهن؟ "). اهتمت الشركة بهذه الحالة ، إلى جانب بيئة التطوير ، توفر مجموعة كبيرة (مجموعة من الأمثلة) من البرامج لجميع المناسبات ، والتي تسمى SimpleLink. علاوة على ذلك ، يتم تقديم الحلول في نسختين - كلاهما يستخدم نظام التشغيل في الوقت الحقيقي TI-RTOS (في رأيي ، هذه طريقة أكثر ملاءمة) ، وفي دورة فائقة (في حالة كرهك لنظام التشغيل المدمج كثيرًا بحيث لا يمكنك تناول الطعام "). أنا هادئ بشأن RTOS على MK ، لذلك أستخدم الخيار الأول وننصحك بفعل الشيء نفسه ، خاصة إذا كنت تفهم تكوين عملية بناء نظام التشغيل وقمت بتكييفه مع فئة المهام الخاصة بك ، وتم حفظ قابلية الاستخدام ، وتم تخفيض تكلفة الحفاظ على هذه الراحة بشكل كبير.

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

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

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

  1. مصممة بعناية
  2. مبرمجة بدقة
  3. موثقة بشكل شامل
  4. عالمي
  5. فعال.

وإذا كانت النقطتان الأخيرتان مرغوب فيهما فقط (مرغوبان للغاية ، ولكن مع ذلك ...) ، فإن النقاط الثلاث الأولى ضرورية.

ماذا عن متطلبات حزمة SimpleLink التي تقدمها الشركة؟ فيما يلي تقييمات على مقياس مكون من خمس نقاط ، تم الحصول عليها بترتيب التعارف السطحي مع الحزمة.

1 أ) يجب التفكير في الروابط بين الوحدات ، ويجب تحديد حدود الكفاءة لكل وحدة بشكل واضح ، والقضاء على ازدواجية الوظائف ، وعمل الواجهات - أربعة قوية ، تم إنجاز العمل ككل.

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

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

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

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

5. من الصعب القول ، عادة ما أنظر إلى تنفيذ SPI - فهو من ناحية ، بسيط بما يكفي لتقدير عدم وجود أشعل النار القياسية ، من ناحية أخرى ، إنه معقد بما يكفي ليكون مكانه. لذلك ، في هذه الحزمة هناك إجراءات غير فعالة بشكل قياسي لكتابة / قراءة وحدات البايت ، ولكن إذا غطست في الأعماق ، يمكنك العثور على خيارات مستخدمة حقًا باستخدام MPD ، لا يمكنني قول أي شيء عنها حتى الآن.

ملاحظة حول الأعماق - فهي عميقة حقًا (من خلال 4-5 وظائف متداخلة) ولا يسعني إلا أن أذكر ميزة واحدة في الحزمة - مكتوبة في C. لم أكن قد نسيت أن أضيف زائدتين بعد الحرف ، في الحقيقة ليست هناك. بالنسبة لأولئك الذين هم في الموضوع ، يصبح الأمر واضحًا للغاية ، أوصي الجميع بالقيام بمهمة مثيرة من أجل تحديد مجموعة الوظائف التي يتم تنفيذها على مستوى الأجهزة عند تنفيذ كائن غير تافه. بالطبع ، عند استخدام الفصول الدراسية ، تصبح هذه المهمة تافهة ، ولكن هذه ليست طريقة Jedi من TI. أفهم أن هذا مصدر قلق ضروري لأولئك المستخدمين الذين يهملون الإيجابيات ، ولكن لماذا يتوقفون عند هذا الحد ، ولكن ماذا عن المستخدمين المجمعين المؤسفين ، الذين أساءوا إليهم.

وفي الختام - أريد أن أؤكد ، "حتى أكون مفهوما بشكل صحيح في الأعلى" ، أنا لا أنبب عائلة MK على الإطلاق ، ولا بيئة التطوير ، ولا حزمة البرامج ، أريد فقط أن يصبحوا أفضل وأكثر راحة وجاذبية للمستخدم . لدي حساباتي الخاصة مع TI ولن أغفر لهم أبدًا استحواذهم على National أو حتى الاستحواذ المبكر على Luminary مع القتل اللاحق لخط MK مثير للاهتمام (على الرغم من أنهم في الحالة الأخيرة يعاقبون أنفسهم) ، وكذلك ما عادوا إلي في عام 2014 المال للبلورات المطلوبة (على الرغم من أنني لم ألمس القرم بالتأكيد) ، لكن هذا الشعور العميق لا يمنعني من أن أكون موضوعية - لقد قاموا بعمل جيد. المفهوم الذي اقترحته الشركة ، والذي تم تقديمه في الكتابة ، ليس قريبًا جدًا مني ، ولكن ربما يكونون على حق ، ولا توجد طريقة أخرى للبلورات المعقدة. هذا اتجاه ولا معنى لمحاربته.

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

الجزء الثاني من باليه مارليزون.

حسنًا ، الآن حول القسم ، الذي تم اكتشاف استخدامه في إحدى مكتبات TI ، لكنه لا ينطبق مباشرة على هذه الشركة ، ولكنه ميزة لمجمع gcc. لذلك ، نقوم بصياغة المشكلة من مجال حساب العنوان - نحتاج إلى حساب الفرق في المؤشرات (أي المؤشرات ، وليس البايت) بين عنصرين من الصفيف (أو ببساطة البيانات المتسلسلة من نفس النوع) المحددة بواسطة مؤشرات لهم. , — , .

C ,

(pointer1pointer0)/sizeof(type)

. — , . , , , .

(a+b)(c+d)=ac+ad+bc+bd

( , , ) ( , ). , , .

, ( , ) ,

a/c=a(1/c)=a(N/(Nc))=a(N/c)/N

, N — . — , , , . N, , , , 8, - , . N/c , , — .

10, , , =256, 256/10 = 25.6 25(-2.3%) 26(+1.6%). , , 100*26=2600=256*10+40 10, 100/10=10. , , ,

[n/10]=[nk/N]+1

( ), , n.

(26/2+1)/256

( 256, 8- - ), — , , , ( , ) , . , , .

, ( , godbolt ) ( ) ( ). , . , , . , , , , . , … ( , „...“, ) .

143 77*143=11011, 011=1=77/7. , 784*143=112112, 112=784/7 , 999*7=6993. , , 7143, 9999*7=69993. , .

— , , , 7. , , 7 001, , =001 1001/7=143. , 143*7=1001, =*7 (*7)*143=*(7*143)=*1001, , .

— , ( ) . , , . , , „ — , , “.

, 7, , . , , . , 21=3*7 =381 (, , ) 667*143=95381 , , 381=381.

, . , 5, ...1 . , , () , 1024+1=1025=0401 5 205=0CD , 130*205=082*0CD=0FAFA=>FA=26=130/5. , ( ), , ( ). - , .

ملاحظة. ( , ) – , « ». , , .

CC1350 CC1352 ( , ), XMSSJE3G0PA ( , , muRata ). , – 2.7, – 0.28 , – 33 , – 20 . – 1,5*1,5 – 0.9$, „Silicon On Insulator“ „gallium arsenide».

– , — –

Source: https://habr.com/ru/post/ar430732/


All Articles