كيف يمكنك التعامل مع كبيرة في نقل البيانات على الذاكرة مقيدة, جزءا لا يتجزأ من النظم ؟

StackOverflow https://stackoverflow.com/questions/359745

سؤال

لدي متحكم يجب تحميل الملفات الكبيرة من جهاز كمبيوتر المنفذ التسلسلي (115200 سرعة البث بالباود) والكتابة إلى مسلسل ذاكرة فلاش على SPI (~2 ميغاهيرتز).فلاش يكتب يجب أن يكون في 256 بايت كتل يسبقها كتابة الأوامر و عنوان الصفحة.إجمالي ذاكرة الوصول العشوائي المتاحة على النظام هو 1 كيلو بايت مع 80 بايت حجم مكدس.

هذا وتعمل حاليا من خلال تعبئة 256 بايت العازلة من UART ثم بينغ ponging إلى آخر 256 بايت العازلة شغل المقاطعة على RX العازلة على استعداد إشارة في حين فلاش هو مكتوب مع مشغول يكتب.المخزن المؤقت مبادلة تتكرر حتى اكتمال العملية.

وأود أن تفضل أن الإعداد TX/RX معالجات المقاطعة لكل من SPI و UART الموانئ التي تعمل على تفريق مخازن دائرية.لذا بدلا من الاقتراع جديدة بايت و في انتظار عمليات كاملة يمكنني ببساطة ملء تكساس مخازن و تمكين المقاطعة أو التحقق من المخازن على البيانات الواردة.هذا من شأنه أن يعطي الكثير من الساعة دورات العمل الحقيقي بدلا من الانتظار على الأجهزة الطرفية.

بعد تنفيذ IRQ مع 128 بايت مخازن دائرية ، أنا استطلاع UART RX المخزن المؤقت للبيانات على الفور وضعه في SPI تكساس العازلة للقيام نقل الملفات.المشكلة أنا أعاني مع هذا النهج هو أن لا يكون لديك ما يكفي من ذاكرة الوصول العشوائي على مخازن الكمبيوتر تلقي المخزن المؤقت هو ملء أسرع مما كنت الحصول على بيانات لأكثر من فلاش إرسال المخزن المؤقت.ومن الواضح أن سرعة انتقال ليست المشكلة (115.2 كيلو هرتز في 2 ميغاهيرتز) ، ولكن هناك كتابة دورة الانتظار بعد كل 256 بايت الصفحة المرسلة.


يبدو أن كثرة SPI يقطع تم حجب بعض UART يقطع وتسبب بايت ينبغي تفويتها.الحل اخترت استخدام المخزن المؤقت الحلقي UART تتلقى المقاطعة و تغذية البيانات إلى 256 بايت الصفحة العازلة التي يتم إرسالها إلى المسلسل فلاش عن طريق الاقتراع بايت نقل وكتابة الانتهاء.128 حلقة العازلة كبيرة بما يكفي لمنع تجاوزات خلال SPI الكتابة.

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

المحلول

وكنت تفعل شيئا مثل مبعثر يتجمع على جهاز كمبيوتر. إنشاء قائمة مرتبطة البنية مثل هذا:

typedef struct data_buffer {
    char flags;
    char[128] data;
}

ولديك واحد من البتات في العلم يعني "ReadyToFlash" واحد ل "وميض". يجب أن تكون قادرة على ضبط عدد من المخازن المؤقتة في قائمتك ربط للحفاظ على فلاش من اصطياد UART كما يكتب أو العكس بالعكس.

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

نصائح أخرى

هل UART والجانب PC للدعم تطبيق RS-232 المصافحة (التحكم في التدفق)؟ إذا كان الأمر كذلك، عندما تتلقاها عازلة يحصل قريبة إلى كونها كامل، لديها ISR إسقاط خط CTS - إذا تم تكوين الجانب PC احترام أجهزة التحكم في التدفق يجب أن تتوقف عن إرسال عندما ترى هذا الشرط. وبمجرد الانتهاء من استنزاف (أو ما يقرب من استنزاف) التلقي العازلة، تأكيد CTS مرة أخرى وPC ينبغي أن تبدأ بإرسال مرة أخرى.

لاحظ أن هذا يجعل البرنامج على الجهاز جزءا لا يتجزأ كبير أكثر تعقيدا - سواء كان ذلك من شأنه أن مفاضلة كنت على استعداد لجعل بد من تحليل قام به أنت ومديرك وفريق

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

وأفترض أنك نقل ملف ثنائي حتى XON-XOFF ليس الحل الأمثل، الأمر الذي يترك أجهزة التحكم في التدفق.

وثمة خيار آخر هو لاستخدام بروتوكول مع المدمج في التحكم في التدفق مثل إكس مودم. لدي مشروع مماثل جزءا لا يتجزأ من حيث هو مكتوب الفلاش في صفحات 128byte. يا لها من مصادفة أن إكس مودم يرسل البيانات في قطع 128byte ثم ينتظر لACK قبل أن يرسل في اليوم التالي.

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

ولكن هل تقول أنه يعمل عندما كان كتلة مخازن, ولكن الآن بعد أن كنت قد بايت مخازن انها لا ؟

يمكنك العصا مع كتلة المخازن المؤقتة التي تمتلئ بها UART RX المقاطعة و عند كل العازلة كاملة ذلك SPI/فلاش رمز فارغة أن العازلة باستخدام SPI المقاطعة ؟ من شأنها أن توفر لك نسخ كل بايت بدلا من الاضطرار إلى القيام دائرية العازلة المنطق مرتين لكل بايت, سيكون لديك فقط للقيام بذلك لكل كتلة.

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