البرمجة

تأخير مخصص في C بدون time.h

تفضل، فيما يلي مقال يشرح كيفية إنشاء دالة تأخير مخصصة في لغة البرمجة C بدون استخدام مكتبة الوقت القياسية (time.h)، وذلك من خلال تعديل الدالة الموجودة لتأخذ عددًا صحيحًا كمدخل يحدد عدد الثواني التي يجب أن تنتظر:


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

فلنبدأ بتحويل الدالة delay() التي تعتمد على حلقتين مدمجتين:

c
void delay() { int c = 1 , d = 1 ; for ( c = 1; c <= 100000; c++) { for ( d = 1; d <= 100000; d ++) { asm("nop"); } } }

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

c
void delay(int seconds) { int c = 0; while (c < seconds * 1000000) { asm("nop"); c++; } }

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

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

من الجدير بالذكر أن استخدام مثل هذه الدوال قد يكون مناسبًا في بعض الحالات المحددة حيث لا يتطلب البرنامج دقة عالية في الوقت. ومع ذلك، يجب مراعاة أن هذه الدوال قد لا تكون دقيقة بالمقارنة مع الحلول التي تستخدم وحدة تحكم متقدمة مثل مؤقت النظام (System Timer) عند تطوير تطبيقات تتطلب دقة موقتة عالية.

المزيد من المعلومات

بالإضافة إلى ذلك، يجب أن نفهم أن استخدام حلقات التأخير مثلما فعلنا في الدالة المعدلة قد يؤدي إلى توقف تنفيذ البرنامج بشكل كامل خلال فترة التأخير، مما قد يؤثر سلبًا على استجابة النظام أو التطبيق. ولذلك، يُفضَّل عادة استخدام تقنيات التأخير الأخرى مثل المقاطعات (Interrupts) أو تعليق المهمة (Task Suspension) إذا كانت متاحة في النظام الذي تعمل عليه.

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

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

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

زر الذهاب إلى الأعلى