03

اندازه گیری زمان در نرم افزار نهفته

مقدمه

از آنجایی که یکی از بارزترین ویژگی های نرم افزار نهفته، اجرای کد در زمان بندی های مشخص است، اندازه گیری زمان در نرم افزار نهفته اهمیت ویژه ای دارد. نرم افزار نهفته معمولا برای کنترل، مشاهده کردن و یا جمع آوری و ذخیره اطلاعات سیستم ها به کار می رود. در تمام این کاربردها، زمان بندی دقیق اجرای نرم افزار، یکی از موارد مهم مورد نظر توسعه دهنده است و این یکی از تفاوت های مهم بین نرم افزار نهفته و نرم افزارهای غیر نهفته (کامپیوتری) است. در نرم افزارهای کامپیوتری معمولا پارامترهایی مانند متوسط سرعت اجرای برنامه، متوسط خروجی اطلاعات و پارامترهایی از این دست اهمیت دارند. در حالی که در نرم افزارهای نهفته، اجرای هر بخشی از کد در زمان بندی مشخص حائز اهمیت است. به عبارت دیگر، بخش مهمی از نرم افزارهای نهفته لازم است که به صورت “زمان حقیقی” اجرا شوند.

[! ] زمان حقیقی “زمان حقیقی” بودن نرم افزار به معنی سرعت بالای اجرا یا سرعت بالای عکس العمل به رویدادها نیست. بلکه بدین معنی است که عکس العمل به هر رویداد، باید تا مدت زمان مشخصی (deadtime) به اتمام برسد.

به دلیل اهمیت زمان بندی در نرم افزار نهفته، اندازه گیری زمان نیز اهمیت ویژه ای پیدا می کند. در نرم افزار نهفته به دو دلیل به اندازه گیری زمان نیاز است.

  • نظارت
  • کنترل

اندازه گیری زمان برای نظارت

یکی از کاربردهای اندازه گیری زمان، نظارت است. از آنجایی که در اکثر سیستم های نهفته، صحت عملکرد سیستم در گرو اجرای نرم افزار بر اساس زمان بندی های مشخص است، نمیتوان صرفا به طراحی های انجام شده در حوزه معماری نرم افزار، طراحی لایه اجرا، تنظیمات کرنل (در صورت استفاده)، تایمرها و اینتراپت ها اعتماد کرد. بنابراین لازم است که یک بخش نظارتی از کد، زمان بندی های نرم افزار اصلی را پایش کرده و در صورتی که در محدوده قابل قبول نبود، هشدارهای لازم را صادر کرده و یا عملکرد نرم افزار را متوقف کند. در زیر تعدادی از مثال های کاربرد اندازه گیری زمان به منظور نظارت را ذکر می شود :

  • اندازه گیری حجم پردازش پردازشگر و همچنین اندازه گیری حجم پردازشی بخش های مختلف کد
  • اندازه گیری زمان اجرای بخشی از کد
  • اندازه گیری فرکانس اجرای حلقه های کنترلی
  • اندازه گیری فاصله زمانی وقوع رویداد تا عکس العمل نرم افزار

اندازه گیری زمان برای کنترل

در موارد بسیاری، اندازه گیری زمان، جهت نظارت بر صحت عملکرد بخش اصلی نرم افزار نیست. بلکه جهت اجرای آن است. مثلا برای تولید تاخیر در اجرای بخشی از کد یا تشخیص وقوع timeout در پروتکل های ارتباطی، باید سنجشی از زمان سپری شده در هر لحظه داشت. در ادامه مثال هایی از این دست ذکر شده است.

  • ایجاد تاخیر به مقدار مشخص در حین اجرای بخشی از کد
  • چشمک زدن یک نمایشگر با فرکانسی مشخص
  • ایجاد یک دیبانس نرم افزاری بر روی ورودی یک پین دیجیتال که به یک کلید فشاری متصل است
  • اجرای بخشی از کد در بازه های زمانی مشخص مانند حلقه های کنترلی
  • اجرای بخشی از کد پس از سپری شدن زمان مشخصی از لحظه وقوع یک رویداد
  • تشخیص گذشتن مدت زمانی مشخص از لحظه وقوع یک رویداد (مانند timeout در تمام پروتکل های ارتباطی)

نیازمندی های اندازه گیری زمان

با توجه به مباحث و مثال های بیان شده، نیازمندی های حوزه زمان در نرم افزار نهفته به شرح زیر است :

  • ایجاد تاخیر در اجرای بخشی از کد به صورت Blocking و Non-Blocking
  • اندازه گیری زمان سپری شده از لحظه ای خاص
  • اندازه گیری زمان باقیمانده تا لحظه ای خاص
  • تشخیص رسیدن به مدت زمانی مشخص از لحظه ای خاص
  • اندازه گیری دوره زمانی اجرای بخشی از نرم افزار
  • اندازه گیری زمان بین دو رویداد
  • اندازه گیری زمان اجرای بخشی از کد

روش های اندازه گیری زمان

پس از صحبت در مورد ضرورت اندازه گیری زمان در نرم افزارهای نهفته، در این بخش به انواع روش ها و ابزارهای اندازه گیری زمان پرداخته می شود.

حلقه خالی

یکی از ابتدایی ترین و دم دستی ترین ابزارها برای اندازه گیری زمان، حلقه خالی است. در این روش از یک حلقه for به تعداد مشخص استفاده می شود.

				
					for(int i=0; i<1000; i++){}
				
			

از این روش تنها در ایجاد تاخیر در اجرای بخشی از کد، آنهم به صورت Blocking می توان استفاده کرد.

نقاط قوت :

  • بسیار ساده
  • عدم نیاز به هیچ کتابخانه یا سخت افزار

نقاط ضعف :

  • تنها برای ایجاد تاخیر به صورت Blocking قابل استفاده است.
  • دقت پایین
  • نیاز به کالیبراسیون
  • مقدار تاخیر با تغییر کلاک پردازشگر، نوع کامپایلر و حتی سطح بهینه سازی کامپایلر تغییر می کند.

استفاده از پین پردازشگر

یکی دیگر از روش های اندازه گیری زمان، استفاده از پین پردازشگر است. بدین صورت که در بخش هایی از کد این پین صفر یا یک می شود و با استفاده از یک ابزار اندازه گیری خارجی مانند اسکوپ یا لاجیک آنالایزر، می توان اندازه پالس ایجاد شده را اندازه گیری کرد.

نقاط قوت :

  • بسیار ساده
  • اندازه گیری دقیق زمان

نقاط ضعف :

  • نیاز به یک پین سخت افزاری به ازای هر اندازه گیری همزمان
  • تنها کاربرد نظارتی آن در سطح کاربر بیرونی است. (یعنی یک انسان یا ابزار بیرونی باید پهنای پالس را اندازه بگیرد) و امکان استفاده به عنوان نظارت داخلی توسط خود نرم افزار را ندارد.
  • امکان استفاده در کاربردهای کنترلی را ندارد و تنها می توان برای اندازه گیری زمان بین دو رویداد و اندازه گیری دوره اجرای بخشی از کد استفاده کرد.

تایمرهای سخت افزاری

تایمرهای سخت افزاری از پریفرال های مفید در هر پردازشگر هستند که کاربردهایی متنوع دارند. از جمله کاربردهای آن، اندازه گیری زمان بین دو رویداد نرم افزاری است. بدین صورت که میتوان تایمر را در رویداد اول راه اندازی کرده و در رویداد بعدی آن را متوقف کرد و زمان سپری شده توسط آن را اندازه گیری کرد.

نقاط قوت :

  • اندازه گیری دقیق زمان

نقاط ضعف :

  • نیاز به یک تایمر به ازای هر اندازه گیری همزمان (پردازشگرها تعداد محدودی تایمر دارند که برای کابردهای دیگری مانند ایجاد سیگنال PWM، ایجاد اینتراپت های دوره ای و . . . استفاده می شوند.)

تیک

استفاده از تیک یکی دیگر از روش های مرسوم در اندازه گیری زمان است. این روش شباهت زیادی به استفاده از RTC جهت اندازه گیری های زمان در مقیاس دقیقه و ساعت و روز دارد. در این روش از یک شمارنده استفاده می شود که از زمان شروع به کار پردازشگر، مقدار آن صفر شده و بر اساس یک واحد زمانی مشخص (مثلا میکروثانیه یا میلی ثانیه) ، مقدار آن با گذشت زمان افزایش می یابد. بعد از رسیدن این شمارنده به حداکثر مقدار ممکن، مقدار آن صفر شده و این روند دائم ادامه پیدا می کند. با استفاده از این واحد زمانی، می توان تمام نیازمندی های نرم افزار نهفته در حوزه اندازه گیری زمان را تامین کرد. نکته مهم اینکه، در این روش، کد نوشته شده باید گذر مقدار شمارنده از صفر را تشخیص داده و پردازش های لازم را در این لحظه انجام دهد تا دچار خطا نشود. در ادامه چند مثال از استفاده از این تابع ذکر شده است.

  • ایجاد تاخیر : می توان تابعی نوشت که در شروع، تیک همان لحظه را ذخیره کند. سپس منتظر بماند تا مقدار تیک به مقدار تیک لحظه شروع به علاوه مقدار تاخیر برسد. سپس از تابع خارج شود
				
					void Delay(int delay)
{
	int nowTick = GetTick();
	while((nowTick + delay) > GetTick()){}
}
				
			
  • اندازه گیری زمان اجرای بخشی از کد : باید در ابتدا و انتهای کد، مقدار تیک را خوانده و با محاسبه اختلاف این دو، زمان اجرای کد را محاسبه کرد.
				
					int startTick = GetTick();

//Code that runTime is needed

int endTick = GetTick();
int runTime = endTick - startTick;

				
			

به همین ترتیب می توان تمام روش های مختلف زمان بندی و اندازه گیری زمان را با استفاده از تیک پیاده سازی کرد.

نقاط قوت :

  • تامین تمام نیازمندی های مورد نیاز در حوزه اندازه گیری زمان
  • عدم وجود محدودیت در تعداد اندازه گیری های همزمان
  • امکان تنظیم دقت اندازه گیری با تعیین واحد زمانی تیک

نقاط ضعف :

  • اندازه گیری زمان در این روش محدود به حداکثر زمانی است که مقدار متغیر یک بار سرریز می شود. به عنوان مثال اگر از یک شمارنده 32 بیتی استفاده شود و زمان هر تیک یک میکروثانیه باشد، این زمان حدود 71 ثانیه و در صورت استفاده از تیک یک دهم میکروثانیه، این زمان حدود 7 ثانیه می شود. از آنجایی که در اکثریت قریب به اتفاق موارد، اندازه گیری زمانی نرم افزار در حد میکروثانیه و میلی ثانیه است، این محدودیت مشکل خاصی ایجاد نمی کند. برای اندازه گیری زمان های بیشتر معمولا دقت بالایی (در حد میکروثانیه) مدنظر نیست و از RTC استفاده می شود.

تیک را میتوان به دو صورت ایجاد کرد :

  • نرم افزاری
  • سخت افزاری

تیک نرم افزاری

در این روش، در یک اینتراپت دوره ای با دوره مثلا یک میلی ثانیه مقدار متغیر یک عدد افزایش می یابد. بدین صورت یک شمارنده ساخته شده که مقدار آن نشان دهنده زمان سپری شده بر حسب میلی ثانیه است.

نقاط قوت :

  • عدم نیاز به تایمر سخت افزاری

نقاط ضعف :

  • مصرف زمان پردازشگر برای ایجاد شمارنده (باعث تغییر در زمان بندی بقیه بخش های نرم افزار می شود)
  • اینتراپت ایجاد تیک باید دارای بالاترین اولویت باشد تا مقدار تیک صحیح باشد.
  • وجود مناطق بحرانی باعث بر هم خوردن مقدار تیک می شود.
  • مقدار تیک تنها در حد میلی ثانیه قابل استفاده خواهد بود. زیرا در صورت نیاز به تیک دقیق تر، باید فرکانس اینتراپت افزایش یابد و در این صورت عملا بخش زیادی از زمان پردازشگر صرف ایجاد تیک خواهد شد.

[! ] نکته مهم یکی از نقاط ضعف اصلی تیک نرم افزاری آن است که در صورت عدم رعایت الزامات اولویت ها، ممکن است منجر به قفل شدن نرم افزار شود. اولویت اینتراپتی که تیک نرم افزاری را ایجاد می کند باید بالاتر از همه باشد. و در نواحی بحرانی هم به هیچ وجه نباید از توابعی که منتظر رسیدن تیک تیک نرم افزاری به مقدار خاصی می ماند استفاده شود. چون ناحیه بحرانی عملکرد تیک را متوقف کرده و دیگر مقدار تیک افزایش نمی یابد. در صورتی که در ناحیه بحرانی منتظر افزایش تیک و رسیدن آن به مقدار مشخصی باشد، نرم افزار قفل می شود.

تیک سخت افزاری

این روش در واقع ترکیبی از روش تیک و تایمر سخت افزاری است. با این تفاوت که در اینجا کلا یک تایمر سخت افزاری مورد نیاز خواهد بود و به تعداد نامحدود اندازه گیری همزمان با آن می توان انجام داد. در این روش، یکی از تایمرهای پردازشگر تنظیم می شود که به صورت یک شمارنده ساده عمل کند و هر بار با خواندن مقدار شمارنده این تایمر، زمان سپری شده را سنجش کرد. در صورت استفاده از SoC های دارای FPGA می توان این شمارنده را به صورت خیلی ساده در بخش FPGA آن پیاده سازی کرد. در این روش هیچ سربار نرم افزاری برای تولید تیک وجود نخواهد داشت و دقت آن نیز به هیچ وجه از دست نخواهد رفت.

نقاط قوت :

  • عدم سرباز پردازشی برای پردازشگر
  • دقت بالا در اندازه گیری زمان

نقاط ضعف :

  • نیاز به یک تایمر سخت افزاری

جمع بندی

با توجه به اهمیت زمان بندی در نرم افزار نهفته، ابزاری جهت اندازه گیری زمان جزو اولین و مهمترین نیازهای یک برنامه نویس نهفته است. این ابزار هم در بعد کنترلی (مانند تاخیر) کاربرد دارد و هم در بعد نظارتی (مانند اندازه گیری فرکانس اجرای بخشی از کد یا زمان مصرف شده برای اجرای بخشی از کد)

بدین منظور روش های مختلف نرم افزاری و سخت افزاری و ترکیبی از این دو وجود دارد که هر کدام نقاط قوت و ضعفی دارند. در میان روش های ذکر شده، کاملترین و دقیقترین روش برای اندازه گیری زمان، تیک سخت افزاری است. این روش به قدری بهینه و مرسوم است که حتی برخی از سازندگان پردازشگرها، تایمر ساده ای بدون هیچ قابلت جانبی در میکروکنترلر تعبیه می کنند که تنها عمل شمارش را انجام می دهد و در مستندات تایمر مربوطه هم ذکر شده که کاربرد این تایمر، اندازه گیری زمان توسط کد کاربر است.

ماژول کرونو

ماژول کرونو، یک کتابخانه جامع است که بر اساس روش تیک توسعه داده شده است. این ماژول به تیک کاربر متصل شده و تمام اندازه گیری ذکر شده را انجام می دهد. از آنجایی که این ماژول به تیک کاربر متصل می شود، قابل استفاده هم به صورت تیک سخت افزاری و هم به صورت تیک نرم افزاری است. کاربر می تواند با نوشتن توابع و ماکروهایی با استفاده از API های این ماژول، ابزارهای پیشرفته تری در حوزه زمان بندی و اندازه گیری زمان برای خود ایجاد کند.

مطالب مرتبط

ماژول کرونو

برچسب‌ها: بدون برچسب

دیدگاه شما چیست؟

آدرس ایمیل شما منتشر نخواهد شد، فیلدهای الزامی علامت گذاری شده اند.