دسته‌بندی

دسته‌ای کردن چیست؟

دسته‌ای کردن به بافر کردن رویدادهای حسگر در مرکز حسگر و/یا سخت‌افزار FIFO قبل‌از گزارش رویدادها ازطریق Sensors HAL اشاره دارد. مکان‌هایی که رویدادهای حسگر در آن‌ها بافر می‌شوند (مرکز حسگر و/یا سخت‌افزار FIFO) در این صفحه به‌عنوان «FIFO» نام برده می‌شوند. وقتی دسته‌بندی رویداد حسگر فعال نباشد، رویدادهای حسگر بلافاصله پس‌از دردسترس قرار گرفتن به «لایه انتزاع سخت‌افزاری حسگرها» گزارش می‌شود.

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

دسته‌بندی فقط زمانی می‌تواند رخ دهد که حسگری دارای سخت‌افزار FIFO باشد و/یا بتواند رویدادها را در مرکز حسگر بافر کند. در هر دو حالت، حسگر باید حداکثر تعداد رویدادهایی را که می‌توانند به‌طور هم‌زمان ازطریق SensorInfo.fifoMaxEventCount دسته‌بندی شوند گزارش کند.

اگر حسگری در یک FIFO فضای رزروشده داشته باشد، حسگر باید تعداد رویدادهای رزروشده را ازطریق SensorInfo.fifoReservedEventCount گزارش کند. اگر FIFO به حسگر اختصاص داده شده باشد، SensorInfo.fifoReservedEventCount اندازه FIFO است. اگر FIFO بین چندین حسگر مشترک باشد، این مقدار ممکن است صفر باشد. یک مورد استفاده رایج این است که به حسگر اجازه داده شود اگر تنها حسگر فعال است از کل FIFO استفاده کند. اگر چند حسگر فعال باشند، هر حسگر حداقل SensorInfo.fifoReservedEventCount جایگاه رویداد در FIFO را تضمین می‌کند. اگر از مرکز حسگر استفاده شود، ممکن است ضمانت ازطریق نرم‌افزار اجرا شود.

رویدادهای حسگر در شرایط زیر دسته‌بندی می‌شوند:

  • حداکثر تأخیر گزارش فعلی حسگر بیشتر از صفر است، یعنی رویدادهای حسگر می‌توانند تا حداکثر تأخیر گزارش به‌تأخیر بیفتند قبل‌از اینکه ازطریق HAL گزارش شوند.
  • نقطه دسترسی در حالت تعلیق است و حسگر از نوع حسگر غیربیدارکننده است. در این مورد، رویدادها نباید AP را بیدار کنند و باید تا زمانی که AP بیدار می‌شود ذخیره شوند.

اگر حسگری از دسته‌بندی پشتیبانی نکند و AP در حالت خواب باشد، فقط رویدادهای حسگر بیدارباش به AP گزارش می‌شود و رویدادهای غیربیدارباش نباید به AP گزارش شود.

پارامترهای دسته‌ای

دو پارامتری که رفتار دسته‌بندی را کنترل می‌کنند عبارت‌اند از sampling_period_ns و max_report_latency_ns. sampling_period_ns تعیین می‌کند که هر چند وقت یک‌بار رویداد حسگر جدیدی تولید شود، و max_report_latency_ns تعیین می‌کند که چقدر طول می‌کشد تا رویداد به HAL حسگرها گزارش شود.

sampling_period_ns

معنی پارامتر sampling_period_ns به حالت گزارش حسگر مشخص‌شده بستگی دارد:

  • پیوسته: sampling_period_ns نرخ نمونه‌گیری است، یعنی نرخی که رویدادها با آن تولید می‌شوند.
  • On-change: sampling_period_ns limits the sampling rate of events, meaning events are generated no faster than every sampling_period_ns nanoseconds. اگر رویدادی تولید نشود و مقادیر اندازه‌گیری‌شده برای مدت طولانی تغییر نکند، دوره‌ها می‌توانند طولانی‌تر از sampling_period_ns باشند. برای جزئیات بیشتر، حالت گزارش‌دهی تغییر را ببینید.
  • تک‌ضرب: sampling_period_ns نادیده گرفته می‌شود. هیچ تأثیری ندارد.
  • ویژه: برای جزئیات مربوط به نحوه استفاده از sampling_period_ns برای حسگرهای ویژه، انواع حسگر را ببینید.

برای اطلاعات بیشتر درباره تأثیر sampling_period_ns در حالت‌های مختلف، به حالت‌های گزارش‌دهی مراجعه کنید.

برای حسگرهای پیوسته و درحال تغییر:

  • اگر sampling_period_ns کمتر از SensorInfo.minDelay باشد، پیاده‌سازی HAL باید بی‌صدا آن را به max(SensorInfo.minDelay, 1ms) محدود کند. ‫Android از تولید رویداد با نرخ بیش‌از ۱۰۰۰ هرتز پشتیبانی نمی‌کند.
  • اگر sampling_period_ns بزرگ‌تر از SensorInfo.maxDelay باشد، پیاده‌سازی HAL باید بی‌صدا آن را به SensorInfo.maxDelay کوتاه کند.

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

اگر بسامد درخواست‌شده

سپس بسامد واقعی باید

زیر حداقل بسامد (<1/maxDelay)

بین ۹۰٪ و ۱۱۰٪ حداقل بسامد

بین حداقل و حداکثر بسامد

بین ۹۰٪ و ۲۲۰٪ بسامد درخواستی

بالاتر از حداکثر تناوب (>1/minDelay)

بین ۹۰٪ و ۱۱۰٪ حداکثر بسامد، و زیر ۱۱۰۰ هرتز

max_report_latency_ns

max_report_latency_ns حداکثر زمان را برحسب نانوثانیه تنظیم می‌کند، که طی آن رویدادها می‌توانند به‌تأخیر بیفتند و در FIFO سخت‌افزار ذخیره شوند، پیش‌از اینکه ازطریق HAL درحالی‌که AP بیدار است گزارش شوند.

مقدار صفر نشان می‌دهد که رویدادها باید به‌محض اندازه‌گیری گزارش شوند، یا FIFO به‌طور کامل نادیده گرفته شود، یا FIFO به‌محض اینکه یک رویداد از حسگر وجود داشته باشد خالی شود.

برای مثال، شتاب‌سنجی که در ۵۰ هرتز فعال شده است با max_report_latency_ns=0 وقتی AP بیدار است ۵۰ بار در ثانیه وقفه‌ها را راه‌اندازی می‌کند.

وقتی max_report_latency_ns>0، رویدادهای حسگر نیازی به گزارش شدن به‌محض شناسایی ندارند. می‌توانند به‌طور موقت در FIFO ذخیره شوند و به‌صورت دسته‌ای گزارش شوند، به‌شرطی که هیچ رویدادی بیش‌از max_report_latency_ns نانوثانیه تأخیر نداشته باشد. این یعنی همه رویدادها از دسته قبلی به‌طور هم‌زمان ضبط و برگردانده می‌شوند. این کار میزان وقفه‌های ارسال‌شده به AP را کاهش می‌دهد و به AP اجازه می‌دهد درحالی‌که حسگر درحال ضبط و دسته‌بندی داده‌ها است، به حالت کم‌مصرف‌تر (درانتظار) برود.

هر رویداد یک مُهر زمان منسوب به خود دارد. تأخیر در زمان گزارش رویداد تأثیری بر مُهر زمان رویداد ندارد. مُهر زمان باید دقیق باشد و با زمانی که رویداد به‌صورت فیزیکی رخ داده است مطابقت داشته باشد، نه زمانی که گزارش شده است.

مجاز کردن رویدادهای حسگر برای ذخیره شدن موقت در FIFO رفتار ارسال رویدادها به HAL را تغییر نمی‌دهد؛ رویدادهای حسگرهای مختلف می‌توانند درهم‌آمیخته شوند و همه رویدادهای حسگر یکسان به‌ترتیب زمانی مرتب می‌شوند.

رویدادهای بیداری و غیربیداری

رویدادهای حسگر از حسگرهای بیدارباش باید در یک یا چند FIFO بیدارباش ذخیره شوند. طراحی رایج این است که یک صف FIFO بزرگ و مشترک برای بیدار شدن داشته باشیم که رویدادهای همه حسگرهای بیدار شدن در آن درهم‌آمیخته شوند. به‌جای‌آن، می‌توانید یک FIFO بیدارباش برای هر حسگر داشته باشید یا FIFOهای اختصاصی برای حسگرهای بیدارباش خاص و یک FIFO مشترک برای بقیه حسگرهای بیدارباش داشته باشید.

به‌طور مشابه، رویدادهای حسگر از حسگرهای غیربیدارباش باید در یک یا چند FIFO غیربیدارباش ذخیره شوند.

در همه موارد، رویدادهای حسگر بیدارباش و رویدادهای حسگر غیربیدارباش نمی‌توانند در یک FIFO یکسان درهم‌آمیخته شوند. رویدادهای بیدارباش باید در FIFO بیدارباش ذخیره شوند، و رویدادهای غیربیدارباش باید در FIFO غیربیدارباش ذخیره شوند.

برای FIFO بیدار شدن، طراحی FIFO مشترک، بزرگ، و تکی بهترین مزایای توان را ارائه می‌دهد. برای FIFO غیربیدارباش، طراحی‌های FIFO مشترک بزرگ واحد و چندین FIFO رزروشده کوچک ویژگی‌های توان مشابهی دارند. برای پیشنهادهای بیشتر درباره نحوه پیکربندی هر FIFO، به اولویت تخصیص FIFO مراجعه کنید.

عملکرد خارج از حالت تعلیق

وقتی AP بیدار است (در حالت تعلیق نیست)، رویدادها به‌طور موقت در FIFO ذخیره می‌شوند، به‌شرطی که بیش‌از max_report_latency تأخیر نداشته باشند.

تا زمانی که AP وارد حالت تعلیق نشود، هیچ رویدادی حذف یا ازدست نخواهد رفت. اگر FIFOهای داخلی قبل‌از گذشت max_report_latency پر شوند، رویدادها در آن نقطه گزارش می‌شوند تا مطمئن شویم هیچ رویدادی ازدست نمی‌رود.

اگر چند حسگر از یک FIFO استفاده کنند و max_report_latency یکی از آن‌ها منقضی شود، همه رویدادهای FIFO گزارش می‌شود، حتی اگر max_report_latency حسگرهای دیگر هنوز منقضی نشده باشد. این کار تعداد دفعاتی را که دسته‌های رویداد گزارش می‌شوند کاهش می‌دهد. وقتی یک رویداد باید گزارش شود، همه رویدادهای همه حسگرها گزارش می‌شود.

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

  • شتاب‌سنج دسته‌ای با max_report_latency = ۲۰ ثانیه
  • ژیروسکوپ دسته‌بندی‌شده با max_report_latency = ۵ ثانیه

دسته‌های شتاب‌سنج هم‌زمان با دسته‌های ژیروسکوپ (هر ۵ ثانیه) گزارش می‌شوند، حتی اگر شتاب‌سنج و ژیروسکوپ از FIFO یکسانی استفاده نکنند.

عملکرد در حالت تعلیق

دسته‌بندی به‌ویژه برای جمع‌آوری داده‌های حسگر در پس‌زمینه بدون بیدار نگه داشتن AP مفید است. ازآنجایی‌که درایورهای حسگر و پیاده‌سازی HAL اجازه ندارند قفل بیداری* را نگه دارند، AP می‌تواند حتی درحالی‌که داده‌های حسگر جمع‌آوری می‌شود وارد حالت تعلیق شود.

رفتار حسگرها درحین تعلیق AP به این بستگی دارد که آیا حسگر از نوع حسگر بیدارباش است یا نه. برای جزئیات بیشتر، حسگرهای بیدار شدن را ببینید.

وقتی یک FIFO غیربیدارکننده پر می‌شود، باید دور بزند و مانند یک بافر حلقوی عمل کند و رویدادهای قدیمی‌تر را با رویدادهای جدید جایگزین کند و رویدادهای قدیمی را بازنویسی کند. max_report_latency تأثیری بر FIFOهای غیربیدارباش در حالت تعلیق ندارد.

وقتی FIFO بیداری پر می‌شود، یا وقتی max_report_latency یکی از حسگرهای بیداری به‌پایان می‌رسد، سخت‌افزار باید AP را بیدار کند و داده‌ها را گزارش کند.

در هر دو حالت (بیدار شدن و بیدار نشدن)، به‌محض اینکه AP از حالت تعلیق خارج شود، دسته‌ای با محتوای همه FIFOها تولید می‌شود، حتی اگر max_report_latency برخی‌از حسگرها هنوز سپری نشده باشد. این کار خطر اینکه نقطه دسترسی مجبور شود کمی پس‌از بازگشت به حالت تعلیق دوباره بیدار شود را به‌حداقل می‌رساند و، بنابراین، مصرف انرژی را به‌حداقل می‌رساند.

*یک استثنای قابل‌توجه برای درایورهایی که مجاز به نگه داشتن قفل بیدارباش نیستند، زمانی است که حسگر بیدارباش با حالت گزارش‌دهی مداوم با max_report_latency < ۱ ثانیه فعال می‌شود. در این مورد، برنامه‌نویس می‌تواند قفل بیداری داشته باشد زیرا AP فرصت ورود به حالت تعلیق را ندارد، زیرا قبل‌از رسیدن به حالت تعلیق با رویداد بیداری بیدار می‌شود.

اقدامات احتیاطی هنگام دسته‌بندی حسگرهای بیدارباش

بسته به دستگاه، ممکن است چند میلی‌ثانیه طول بکشد تا AP به‌طور کامل از حالت تعلیق خارج شود و شروع به پاک کردن FIFO کند. باید فضای کافی در FIFO اختصاص داده شود تا دستگاه بتواند بدون سرریز شدن FIFO بیدارباش از حالت تعلیق خارج شود. هیچ رویدادی نباید ازدست برود و max_report_latency باید رعایت شود.

اقدامات احتیاطی هنگام دسته‌بندی حسگرهای غیربیدارباش حساس به تغییر

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

در اینجا وضعیتی وجود دارد که باید از آن اجتناب کنید:

  1. برنامه‌ای در شمارشگر گام غیربیدار (تغییر) و شتاب‌سنج غیربیدار (پیوسته) ثبت می‌شود، هر دو از یک FIFO مشترک استفاده می‌کنند.
  2. برنامه رویداد گام‌شمار step_count=1000 stepscode> را دریافت می‌کند.
  3. نقطه دسترسی به حالت تعلیق می‌رود.
  4. کاربر ۲۰ قدم راه می‌رود، که باعث می‌شود رویدادهای شتاب‌سنج و گام‌شمار درهم‌آمیخته شوند، آخرین رویداد گام‌شمار step_count = 1020 steps است.
  5. کاربر برای مدت طولانی حرکت نمی‌کند و باعث می‌شود رویدادهای شتاب‌سنج در FIFO همچنان انباشته شوند و درنهایت هر رویداد step_count در FIFO مشترک را بازنویسی کنند.
  6. AP بیدار می‌شود و همه رویدادها از FIFO به برنامه ارسال می‌شود.
  7. برنامه فقط رویدادهای شتاب‌سنج را دریافت می‌کند و فکر می‌کند که کاربر راه نرفته است.

با ذخیره کردن آخرین رویداد شمارشگر گام خارج از FIFO،‏ HAL می‌تواند این رویداد را وقتی AP بیدار می‌شود گزارش کند، حتی اگر همه رویدادهای شمارشگر گام دیگر با رویدادهای شتاب‌سنج بازنویسی شده باشند. به این ترتیب، برنامه هنگام بیدار شدن نقطه دسترسی step_count = 1020 steps را دریافت می‌کند.

پیاده‌سازی دسته‌ای

برای صرفه‌جویی در مصرف برق، دسته‌بندی باید بدون کمک AP اجرا شود و AP باید اجازه داشته باشد درطول دسته‌بندی تعلیق شود.

اگر دسته‌بندی در هاب حسگر انجام می‌شود، مصرف برق هاب حسگر باید به حداقل برسد.

تأخیر بیشینه گزارش را می‌توان در هر زمانی، به‌ویژه زمانی که حسگر مشخص‌شده ازقبل فعال است، تغییر داد؛ و این کار نباید منجر به ازدست رفتن رویدادها شود.

اولویت تخصیص خروج به‌ترتیب ورود

در پلاتفرم‌هایی که اندازه بافر مرکز حسگر و/یا سخت‌افزار FIFO محدود است، طراحان سیستم ممکن است مجبور شوند انتخاب کنند که چه مقدار FIFO برای هر حسگر رزرو شود. برای کمک به این انتخاب، در اینجا فهرستی از برنامه‌های ممکن هنگام اجرای دسته‌بندی در حسگرهای مختلف آورده شده است.

ارزش بالا: محاسبات مرده پیاده‌روی کم‌مصرف

زمان دسته‌بندی هدف: ۱ تا ۱۰ دقیقه

حسگرهایی که باید دسته‌ای شوند:

  • تشخیص‌دهنده گام بیدارباش
  • بردار چرخش بازی بیداری در ۵ هرتز
  • فشارسنج بیدارباش در ۵ هرتز
  • مغناطیس‌سنج کالیبره‌نشده را با ۵ هرتز بیدار کنید

دسته‌بندی این داده‌ها امکان انجام محاسبات گام‌شمار را فراهم می‌کند و به «نقطه دسترسی» اجازه می‌دهد به حالت تعلیق برود.

مقدار بالا: تشخیص حرکت/فعالیت متناوب با توان متوسط

زمان دسته‌بندی هدف: ۳ ثانیه

حسگرها برای دسته‌بندی: شتاب‌سنج غیربیدارباش در ۵۰ هرتز

دسته‌بندی این داده‌ها امکان تشخیص دوره‌ای فعالیت‌ها و اشاره‌های دلخواه را بدون نیاز به بیدار نگه داشتن AP درحین جمع‌آوری داده‌ها فراهم می‌کند.

مقدار متوسط: فعالیت مداوم با قدرت متوسط/تشخیص اشاره

زمان دسته‌بندی هدف: ۱ تا ۳ دقیقه

حسگرهای دسته‌ای: شتاب‌سنج بیداری در ۵۰ هرتز

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

مقدار متوسط-بالا: کاهش بار وقفه

زمان دسته‌بندی هدف: کمتر از ۱ ثانیه

حسگرهایی که باید دسته‌ای شوند: هر حسگر با بسامد بالا، معمولاً غیربیدارکننده.

اگر ژیروسکوپ روی ۲۴۰ هرتز تنظیم شده باشد، حتی دسته‌بندی ۱۰ رویداد ژیروسکوپ می‌تواند تعداد وقفه‌ها را از ۲۴۰/ثانیه به ۲۴/ثانیه کاهش دهد.

مقدار متوسط: جمع‌آوری مداوم داده‌های با بسامد پایین

زمان دسته‌بندی هدف: ۱ تا ۱۰ دقیقه

حسگرها برای دسته‌بندی:

  • فشارسنج در ۱ هرتز بیدار می‌شود
  • حسگر رطوبت بیدارباش در ۱ هرتز
  • سایر حسگرهای بیدارباش با بسامد پایین در نرخ‌های مشابه

اجازه می‌دهد برنامه‌های پایش با مصرف کم باتری ایجاد شود.

مقدار متوسط-پایین: جمع‌آوری مداوم حسگرهای کامل

زمان دسته‌بندی هدف: ۱ تا ۱۰ دقیقه

حسگرها برای دسته‌بندی: همه حسگرهای بیدارباش، در فرکانس‌های بالا

امکان جمع‌آوری کامل داده‌های حسگر را درحالی‌که نقطه دسترسی در حالت تعلیق است فراهم می‌کند. فقط درصورتی درنظر بگیرید که فضای FIFO مشکلی نداشته باشد.