الوصول المباشر للذاكرة في الأنظمة المدمجة Direct Memory Access


#1

الوصول المباشر للذاكرة (Direct Memory Access (DMA


شكل يوضح مكونات نظام الوصول المباشر للذاكرة

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

كيفية الوصول المباشر للذاكرة

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


نلاحظ فى الشكل السابق الاشارة الواردة من متحكم DMA للمعالج

وفي العادة تستغرق دورة DMA دورتين على الأقل من التحكم فى خط نقل البيانات احدهما قراءة من النهاية الطرفية والكتابة فى الذاكرة والاخرى القراءة من الذاكرة والكتابة فى النهاية الطرفية ويعتمد هذا على حجم عنوان الذاكرة اي كمية البيانات التي يمكن نقلها مرة واحدة للذاكرة، كما يمكن ايضا نقل البيانات من مكان لأخر بالذاكرة او من نهاية طرفية لاخرى، وللعلم فان متحكم DMA نفسه لا يقوم بأى عملية معالجة للبيانات فهو ينقلها فقط من مكان لأخر فى اتجاهين مختلفين كما هو مطلوب منه في مسجلات الاعدادات configuration registers. كما يمكن ايضا لمتحكم DMA القيام بعملية قراءة وكتابة بالذاكرة فى نفس الوقت ولكن هذا يعتمد غالبا على نوع خط نقل البيانات والوظائف المتاحة بالميكروكنترولر.

المعالجات التي تدعم التعامل مع متحكمات DMA يجب ان تحتوي على اشارة دخل خاصة تستقبلها عندما يريد متحكم DMA بالوصول للذاكرة والتحكم فيها، كذلك اشارة خرج من المعالج لمتحكم DMA لتخبره بالسماح له بالتحكم والوصول للذاكرة وهذه الاشارة تسمى HLDA اختصارا لي HoLD Acknowledge وتعني انها تكون فعالة دائما أثناء وصول متحكم DMA للذاكرة ويجب على متحكم DMA عدم الوصول لخط العناوين الا عندما تكون اشارة HLDA القادمة من المعالج فعالة active كذلك يجب عليه ان يقف كل عمليات الوصول والتعامل مع الذاكرة قبل ان يقوم المعالج بجعل اشارة HLDA غير فعالة inactive.

dma-having-the-control-over-the-bus
نرى فى الشكل السابق متحكم DMA لديه تحكم كامل فى الذاكرة

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

يقوم متحكم DMA بالوصول للذاكرة عن طريق أحدي الطرق الأتية:

  • دفعات متعددة burst mode
  • مرة واحدة كل دورة single-cycle mode.

في حالة نقل البيانات دفعات متعددة يظل متحكم DMA في حالة تحكم كامل بالذاكرة حتي يتم نقل جميع البيانات التي تم استقابلها بواسطة النهاية الطرفية للذاكرة او عند امتلاء مكان تحزين البيانات الخاص بالنهاية الطرفية فى حالة اذا كانت البيانات سيتم ارسالها. كما يمكن عند استخدام هذه الطريقة التنسيق مع المعالج حيث يتم السماح فقط بالوصول للذاكرة عندما يكون المعالج يقوم باتمام عمليات لا تتطلب الوصول لخطوط النظام system buses وقد يكون هذا معقدا جدا حيث سيكون من الصعب لمتحكم DMA يحديد ما اذا كان المعالج يقوم بعمليات مهمة أم لا.

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

ولذلك يرجى دائما اختيار طريقة عمل متحكم DMA بعناية فاذا كان النظام قد لا يسمح بالقليل من التأخير دورة او دورتين في زمن الاستجابة للمقاطعات فمن الأفضل اختيار النقل في صورة دفعات أما اذا كانت النهاية الطرفية تستقبل وترسل البيانات بسرعة وبكمية كبيرة فليس من الجيد اختيار نظام الدفعات مما يجعل متحكم DMA مسيطر على الذاكرة طول الوقت وبالتالي نظام النقل مرة واحدة كل دورة هو الأفضل.

كيفية استخدام متحكم DMA

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