این قابلیت فقط در EmWolf و بخش EmWolf نرمافزار WolfEye است. پروتکل قدیمی EW_START رفتار قبلی خود را دارد؛ حالت جدید با EW_RUN_START و شناسهٔ ۶۴ بیتی، صریحاً انتخاب میشود.
- PC ابتدا تصویر کامل پروژه و شناسهٔ اجرا را روی دیسک خودش ثبت میکند.
- کل بستهٔ EWS2 یکجا ارسال و CRC، طول و همهٔ سناریوها بررسی میشود.
- برد پیش از صفکردن اجرا، محل ذخیره را قفل و فضای ژورنال را رزرو میکند؛ سرآیند پایدار میشود.
- برد بستهٔ پذیرفتهشده را یکبار اجرا میکند. قطع TCP و heartbeat باعث STOP این اجرا نمیشوند. تکرار همان شناسه، اجرا را دوباره آغاز نمیکند.
- پس از آخرین مرحلهٔ پایانپذیر، مسیر موجود Safe Stop خروجیها را صفر میکند. سپس پایان اجرا در ژورنال ثبت میشود.
- اتصال بعدی وضعیت و رخدادها را در قطعات حداکثر ۶۴ تایی دریافت میکند. شمارهٔ ترتیب و شناسه از ثبت تکراری جلوگیری میکنند.
- PC فقط پس از دریافت همهٔ رخدادها و fsync فایل محلی، تأیید دریافت کامل میفرستد. برد این رسید را نیز پایدار میکند.
- تا پیش از این رسید، اجرای دیگری اجازهٔ جایگزینکردن نتایج را ندارد. داده حتی پس از رسید نیز تا آغاز اجرای بعدی نگه داشته میشود.
| مورد | محل | حد |
|---|---|---|
| رخدادهای برد | vector رزروشده در heap معمولی Linux | ۶۵٬۵۳۶ رخداد؛ در ABI فعلی ۲۴ بایت برای هر رخداد، حدود ۱٫۵ MiB |
| ژورنال برد | /var/lib/emwolf/run.bin روی root ext4 |
حداکثر ۱٬۷۱۲٬۱۹۲ بایت، کمتر از ۱٫۶۴ MiB |
| رسید PC روی برد | /var/lib/emwolf/received.ack |
۲۴ بایت |
| مالکیت ذخیره | /var/lib/emwolf/owner.lock و flock |
یک نویسنده |
| نوشتن اتمیک | فقط فایلهای موقت .new در همان پوشه |
ژورنال قبلی و موقت، مجموعاً کمتر از حدود ۳٫۳ MiB |
| حاشیهٔ آزاد دیسک | بررسی statvfs پیش از رزرو اجرا | حداقل ۸ MiB علاوه بر فضای ژورنال جدید |
| صف ارسال TCP | فقط RAM بخش شبکه | حداکثر ۱۲۸ فریم؛ پرشدن آن فقط اتصال را میبندد |
| بافر پروتکل | LightStream | حداکثر payload برابر ۵۱۲۰ بایت؛ طولهای بزرگتر رد میشوند |
| نسخهٔ پایدار PC | %LOCALAPPDATA%/WolfEye/EmWolf/<board-hash>/ |
فایل پروژه و رخدادها برای هر شناسه، پیش از ارسال رسید |
هیچ آدرس فیزیکی برای ذخیرهٔ نتیجه استفاده نمیشود. محدودههای GPIO0=0x0209C000، GPIO2=0x020A4000 و GPIO3=0x020A8000 با اندازهٔ 0x1000، نگاشت خطوط، LDGH/D12 و توالی نوشتن DAC تغییر نکردهاند. پارتیشن boot و مسیرهای /dev/mem یا دستگاه بلوکی محل ذخیرهٔ داده نیستند. /tmp و /var/volatile برای نتایج ماندگار استفاده نمیشوند.
- ژورنال فقط پس از رسید کامل اجازهٔ جایگزینی دارد؛ بافر حلقویِ بازنویسیشونده وجود ندارد.
- پرشدن ظرفیت رخدادها باعث Safe Stop و وضعیت OVERFLOW میشود؛ نتایج قبلی باقی میمانند.
- خطای دیسک، کمبود فضا، فایل نامعتبر، CRC خراب و مسیر symlink باعث رد شروع یا توقف امن میشوند؛ فایل اصلی خودکار پاک یا فرمت نمیشود.
- هر رکورد دیسک CRC32 دارد. دادهٔ خراب/ناقص در انتهای ژورنال فقط به بازیابی پیشوند معتبر با وضعیت INTERRUPTED منجر میشود؛ فایل اصلی نگه داشته میشود.
- نوشتن دیسک در ترد جداست. مسیر نمونهبرداری فقط به حافظهٔ ازقبلرزروشده اضافه میکند؛ داخل آن fsync یا ارسال TCP انجام نمیشود.
- زمان رخداد در پروتکل جدید ۶۴ بیتی است. شناسهٔ مرحله از خود برد میآید؛ زمان تریپ/کلوز هنگام دریافت مجدد از نو محاسبه نمیشود.
- بافرهای اتصال LightStream اکنون مالکیت و destructor دارند و پس از قطع اتصال آزاد میشوند.
اجرای COMPLETED فقط پس از صفرشدن خروجیها و ثبت پایدار همهٔ رخدادها اعلام میشود. این نتایج بعد از راهاندازی دوبارهٔ برنامه/برد بازیابی میشوند. اگر برق یا فرایند در حین تست ناگهانی قطع شود، فقط رکوردهای معتبرِ باقیمانده روی دیسک قابل بازیابیاند؛ انتهای هنوز همگامنشدهٔ RAM تضمین ماندگاری ندارد و اجرا INTERRUPTED است. برای پنهانکردن این وضعیت، خروجیها پس از بوت خودکار فعال یا سناریو از نو اجرا نمیشود.
شرط INFINITE و انتظار DI طبق تنظیم اصلی میمانند و ممکن است خودبهخود تمام نشوند. Stop test فرمان توقف صریح با شناسهٔ همان اجراست. Disconnect یا بستن WolfEye اجرای مستقل را متوقف نمیکند. Ctrl+C و Ctrl+Z روی ترمینال برد همان مسیر خروج ایمن را دارند.
نمونهبرداری فعلی همچنان ۳۲۰ میکروثانیه است؛ این تغییر، استفادهنشدن قبلی از مقدار UI برابر ۸٫۲ میکروثانیه را اصلاح نمیکند. قواعد waveform و پایان شرطهای سناریو تغییر نکردهاند. دقت و jitter روی سختافزار واقعی باید جداگانه سنجیده شود؛ آزمون نرمافزاری تضمین hard real-time نیست.
نامهای سفارشی، مدل DUT و تصویر گزارش در PC ذخیره میشوند. اگر این نسخهٔ محلی حذف شده باشد، پارامترهای سیمی از برد قابل بازیابیاند، ولی نام/مدلی که در EWS2 ارسال نشده قابل استنتاج قطعی نیست.
فایل EmWolfRunStore.cpp به SOURCES اضافه شده است؛ در Qt Creator ابتدا Run qmake، سپس Build و Deploy لازم است. استاندارد و تنظیمات کامپایل پروژه تغییر داده نشدهاند. نسخهٔ هماهنگ WolfEye باید همراه این بیلد استفاده شود.
آزمونهای سختافزاری باید توسط کاربر/با مجوز او انجام شوند. ابتدا بدون سناریوی فعال، خروج کامل و اجرای مجدد بررسی شود؛ سپس یک بستهٔ محدود TIME، قطع ارتباط، پایان مستقل و دریافت نتایج در اتصال بعدی. برای آزمون ریست، ابتدا یک اجرای پایانیافته و ذخیرهشده ولی دریافتنشده انتخاب شود. هیچیک از این اعمال روی برد توسط ابزارهای این تغییر انجام نشده است.
در بررسی خواندنیِ برد: MemTotal حدود ۴۸۸ MiB و MemAvailable حدود ۴۴۳ MiB بود؛ فضای آزاد root حدود ۱۲۶ MiB بود. این مقادیر لحظهایاند و پیش از هر اجرای جدید، فضای دیسک دوباره بررسی میشود. مقدار RAM جدول فقط بافر رخداد است و کل مصرف برنامه را نشان نمیدهد. صف ارسال سقف جداگانه دارد و فضای رزرو دیسک با RAM مشترک نیست.
بافر ۲۵۶ رخدادی نویسنده یکبار، بیرون قفل مشترک رزرو میشود. پوشهٔ تازه در والد fsync میشود؛ فایل بازیابیشده نیز پیش از اعلام durable همگام میشود، حتی اگر پایان فرایند قبلی فقط crash بوده و داده هنوز در page cache مانده باشد. خطای این همگامسازی، مجوز اجرا یا رسید صادر نمیکند.
۴۶ آزمون Python، آزمون ظرفیت ۶۵٬۵۳۶ رخداد، دریافت ناقص/تکراری، خطای فضای دیسک و قفل نویسنده، CRC و طول نامعتبر، قطع و اتصال مجدد، و بازیابی فرایند روی PC/WSL انجام شدند. آزمونهای C++ با AddressSanitizer و UndefinedBehaviorSanitizer بدون اتصال GPIO یا DAC اجرا شدند. آزمون نرمافزاری جای اندازهگیری jitter و آزمون قطع برق روی سختافزار واقعی را نمیگیرد.
در صفحهٔ EmWolf بخش Stored results قرار دارد:
- Receive results در حالت قطع، به Host/Port همین صفحه متصل میشود؛ در حالت متصل، وضعیت همان اجرا را تازه میکند. سناریویی ارسال یا از نو اجرا نمیشود.
- تعداد رخدادهای دریافتی و وضعیت receipt pending/confirmed نمایش داده میشود. دریافت ناقص در اتصال بعدی ادامه مییابد.
- Save results JSON نسخهای قابلحمل شامل شناسهٔ اجرا، تنظیمات اصلی پروژه، رخدادها و زمانهای ۶۴ بیتی و وضعیت کامل/ناقص میسازد. این دکمه با Save JSON پروژه تفاوت دارد.
- Open results folder پوشهٔ نسخههای محلی همان برد را باز میکند. فایلهای اصلی این پوشه از طریق دکمهٔ خروجی JSON قابل بازنویسی نیستند.
- Print PDF گزارش نتایج دریافتشده را صادر میکند. هنگام گرفتن خروجی یک گزارش موجود، تغییرات احتمالی و نامعتبر ویرایشگر سناریو مانع نمیشوند.
برد در /var/lib/emwolf/run.bin پارامترهای اجرا و رخدادها/زمانها را نگه میدارد. این قابلیت ضبط پیوستهٔ تمام نمونههای موج DAC نیست. فایل received.ack رسید دریافت کامل PC است. این قابلیت به بیلد مستقل EmWolf روی برد نیاز دارد؛ بیلد ویندوز سورس برد را کامپایل یا دیپلوی نمیکند.
- code/wolfeye/services/emwolf_protocol.py: پروتکل اجرا/دریافت، ادامهٔ دریافت و خروجی JSON.
- code/wolfeye/services/emwolf_run.py: حافظهٔ پایدار PC، CRC، ترتیب رخدادها و قفل نویسنده.
- code/wolfeye/widgets/emwolf_page.py: کنترلهای Stored results و گزارش نتایج.
- code/wolfeye/services/emwolf_report.py: تفسیر رخدادهای مرحلهدار و زمان ۶۴ بیتی.
- tests/test_emwolf_autonomous.py: دریافت ناقص، رسید، حفاظت فایل و خروجی JSON.
این قابلیت در خروجی عادی Dist/DEVolf-x64.exe بستهبندی میشود. دستور رسمی از ریشهٔ پروژه:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\build.ps1 -Architecture x64نسخههای ثبتشدهٔ وابستگیها با همین دستور حفظ میشوند. گزینههای UpdateBeachEye/UpdateWolfEye برای بهروزرسانی صریح وابستگی هستند و برای گرفتن این بیلد لازم نیستند.
در WolfEye، لاگ عادی شامل نام سناریو و sent/start/end و شمارهٔ DI با زمان ثبتشدهٔ برد است. start پس از رخداد اعمال خروجی نمایش داده میشود. هر DI یکبار چاپ میشود؛ نتیجهٔ تریپ همان DI دوباره در لاگ تکرار نمیشود. اتصال مجدد گزارش را بازیابی میکند، ولی رخدادهایی که در همان پنجره قبلاً چاپ شدهاند دوباره چاپ نمیشوند. Clear log متن هر دو نمای EmWolf را پاک میکند؛ دادهها و گزارش را نگه میدارد.
SHOT_1 sent
SHOT_1 start
DI1 17.101 ms
SHOT_1 end
نام سناریو در EWS2 منتقل نمیشود؛ لاگ ترمینال برد از scenario_1 و شمارههای بعدی استفاده میکند. DI زماندار نسبت به اعمال خروجی گزارش میشود؛ اگر مرجع زمانی فعالی نباشد، kernel_us زمان monotonic رخداد را نشان میدهد. چاپ RX/TX، مراحل داخلی و HEARTBEAT دورهای حذف شده است. خود پیامهای heartbeat شبکه، keepalive، ذخیرهٔ نتایج و منطق اجرا برقرارند. خطاها، توقف و هشدار توقف حلقه همچنان قابل مشاهدهاند.
برای اعمال تغییر لاگ ترمینال، سورس /home/poimu/EmWolf_2 باید در Qt Creator بیلد و سپس توسط کاربر دیپلوی شود. تغییرات ویندوز از خروجی Dist اجرا میشوند.