بوتلودر Bootloader چیست؟
اگر شما هم جزء آن دسته از اشخاصی هستید که بصورت آماتور و حتی حرفهای برنامه میکروکنترلر مینویسید متوجه دغدغه آپدیت بعد از تحویل پروژه خود هستید. برای نمونه شما پروژهای را تحویل کارفرما میدهید و تعداد زیادی از آن را هم تولید میکنید. بعداز مدتی تصمیم میگیرید که سیستمهاتون آپدیت بشند و یااینکه یک باگ در سیستم مشاهده میکنید که تصمیم میگیرید که اون را رفع کنید! نگید که قراره همه دستگاهها بازگشت داده بشند و یا اینکه قراره شما یک فایل هگز به کارفرما بدید و بگید برو با این پروگرمر به این شکل دستگاهها را آپدیت کن!خب, دقیقا اینجا هست که بوتلودر برای شما میتواند رویایی ترین قابلیت میکرو شود. از نظر تقسیم بندی و ساختار بوتلودر شامل سه قسمت مهم میباشد.
- پشتیبانی میکروکنترلر شما و قابلیت بوتلودر در میکرو شما, برای نمونه میکروهای ۸۰۵۱ از این قابلیت پشتیبانی نمیکرد( یعنی این قسمت یک قابلیت سخت افزاری در میکرو شما میباشد).
- نرمافزاری که بر روی بوتلودر میکرو شما نوشته میشه( تقریبا مشابه برنامهای است که در برنامهنویسی اون میکرو استفاده میکنید).
- نرمافزاری که قرار است اطلاعات برنامه را بر روی میکرو شما ارسال نماید(نرم افزار کامپیوتری یا میکروکنترلری مشابه).
بهترین مثالهایی که بصورت عمومی میتوان برای بحث بوتلودر زد، بوتلودری هست که بر روی بردهای آردوینو Arduino استفاده میشود، این برنامه قابلیت این را دارد که توسط یک پورتکام شناختهشده اطلاعات برنامه را دریافت نموده و در داخل فلش میکرو شما ذخیره نماید بدون اینکه نیاز باشد پروگرامر خاصی به میکرو شما وصل گردد. در دنیای دیجیتال میتوان بایوس کامپیوتر را هم شبیه بوت لودر تجسم کرد، برنامهای بسیار ساده که وظیفه دارد بستری مناسب فراهم کند که برنامهی اصلی ( مثلا ویندوز..) بر روی اون نصب بشه.
بوتلودر Bootloader چطور عمل میکند؟ قسمت بوتلودر در میکروکنترلر, آدرسی متفاوت از برنامهی اصلی دارد و غالبا نیز حجم کمی از فلش به این قسمت (بوت لودر) اختصاص داده میشود. شما در قسمت بوتلودر میکرو خود لازم است یک برنامه بنویسید که این برنامه باید در حد امکان ساده، کوچک و قابلیت گرفتن اطلاعات مربوط به پروگرام را از یک یا چند درگاه ارتباطی مشخص داشته باشد. سپس باید فیوزبیتها و یا تنظیمات خاص میکرو خود را طوری انجام دهید که میکروی شما به محض ریستارت شدن وارد برنامه بوت لودر گردد.
برنامه نوشته شده در این قسمت باید شامل موارد زیر باشد:
- تا حد امکان ساده و کم حجم
- ساختار آن باید طوری باشد که هنگام ریستارت کمترین زمان را جهت بررسی ارتباط خارجی صرف نماید.
- ساختار نوشته شده حتی الامکان نباید نیاز به آپدیت در آینده داشته باشد.
بوت لودر و پروگرمر چه تفاوتی با هم دارند؟
از نظر ساختار معماری میتوان گفت این دو قسمت, آدرسی کاملا متفاوت در میکروکنترلر شما دارند و این امکان در بوتلودر وجود دارد که میتواند به فلش برنامه اصلی دسترسی پیدا نموده و آن را پاک و بازنویسی نماید. از نظر قابلیتی نیز این امکان را میدهد که مبتنی بر نوع ارتباط در نظر گرفته شده در سختافزار شما امکان پروگرامکردن در آینده را به سیستم خود اضافه نمایید. مثلا از طریق بوتلودر و درگاه سریال، I2C ، 1Wire و حتی مثلا از طریق GSM Modem و از راهدور توانایی پروگرامکردن را خواهید داشت و این قابلیت مهم بوتلودر هست بدون درنظرگرفتن سختافزار اضافی میتوانید امکان پروگرامکردن میکرو خود و آپدیت آنرا در آینده داشتهباشید.
امنیت برنامه در بوت لودر
یکی از مهمترین مزایای استفاده از سیستم بوتلودر قابلیت رمزنگاری برنامهی اصلی میباشد که به عبارتی تضمین میکند که برنامه شما توسط کسی که قرار است عملیات آپدیت را انجام دهد نتواند کپیبرداری شود. شما میتوانید برنامه میکروی خود را توسط یک کد انکریپت (Encrypt) نموده و در برنامه بوتلودر میکرو این اطلاعات توسط کلید شما بازگشایی و پروگرام شود.
محاسن و کاربردهای بوت لودر Bootloader
همانطور که دربالا ذکر شد مهمترین محاسن بوتلودر موارد زیر میباشد:
- امکان حذف پروگرام جهت پروگرامهای بعدی ( شبیه بردهای آردوینو)
- امکان اینکریپت Encrypt کردن اطلاعات فلش برای واگذاری و ارسال فایل آپدیت به افراد دیگر
- امکان آپدیتکردن میکرو از درگاههای متفاوت از جمله سریال، بلوتوث، وای فای WIFI ،GPRS و… .
نکته مهم: در ساختار برنامه بوتلودر شما این موضوع باید حتما و بادقت مورد لحاظ قرارگیرد که برنامه بوتلودر حتما از گرفتن اطلاعات درستو بدون مشکل مطمئن شود و بعد اقدام به پروگرم فلش اصلی شما نماید. مثلا درصورتیکه شما یک پکت از درگاهسریال ارسال میکنید توسط CRC پکتارسالی و دریافتی را ازنظر درستبودن بررسی نمایید.
در ساختاری که از راه دور مثل GPRS شما سعی میکنید بوتلودر سیستم این کار را انجام دهد ابتدا فایل را کاملا دریافت کنید سپس کل فایل ریختهشده را از نظر صحت اطلاعات دریافتی چک نمایید و سپس اقدام به جایگزینی برنامه جدید نمایید. مطمئن باشید که برنامه فرستاده شده از نظر کارکرد درست است! برای نمونه؛ شما اگر برنامه اشتباهی ارسال کنید دستگاه این برنامه را جایگزین خواهد نمود و علنا برنامه اصلی به درستی بکار نخواهد افتاد تا سیستم شما امکان بروز تصحیح داشته باشد. در دستگاههای حساس ساختار بوتلودر شما میتواند همزمان از چند بستر امکان بروزآوری داشته باشد: مثلا از بستر سریال، از بستر GPRS و یا حافظه خارجی مثل مموری کارت و… که این امکان را میدهد در صورت بوجود آمدن مشکل بتوان از یک بستر دیگر عملیات بروزآوری انجام گیرد.
بوتلودر (bootloader) مخصوص AVR برای کد ویژن (Code Vision AVR )
سعی داریم یک نمونه بوتلودر که میتوان بر روی اکثر مدلهای AVR اجرا نمود را به همراه سورس کدویژن codevision و برنامه تحت ویندوز تفسیر کنیم. در ابتدا سراغ برنامهای میرویم که باید روی میکرو AVR ریخته بشه و نحوه پروگرام اون و نکات مربوط را ذکر میکنیم. به عنوان مثال نیز سعی میکنیم در زیر یک برنامه بوتلودر تست بر روی سختافزار ATMEGA128 و بر روی USRAT1 ریخته و آن پیوست نماییم.
در ابتدا باید بدونیم که لازم هست در قسمت فیوزبیتها یکسری تغییرات را اعمال کنیم تا میکروِی ما هنگام ریستارت اول سراغ بوت لودر برود و برنامه اونجا را اجرا نماید و صد البته باید حتما در برنامه بوتلودر آدرس دهی مناسبی داشته باشیم تا بعداز اتمامکار بوتلودر میکرو سراغ برنامهی اصلی برود که با دستورزیر اینکار انجام میگردد:
#asm("jmp 0x0000"); // Run application code
پس طبق صحبت بالا ابتدا ما بیت BOOTRST را فعال میکنیم تا میکرو به محض ریستارتشدن میکرو وارد اجرای برنامه در قسمت بوتلودر شود:
سپس لازم است که سایز بوت لودر را توسط BootSZ0 , BootSZ1 تعیین کنیم طبق جدول زیر:
کل نتیجهی اعمال فیوزبیتها برروی سختافزار تست ما را در زیر مشاهده مینمایید:
در برنامه پیوستشده شما باید در فایل Bootloader.h نوع میکروی خود را انتخابکنید که ما نیز میکرو تست خودمون یعنی ATMEGA128 را انتخاب نموده ایم.
//#define MEGATYPE Mega8 //#define MEGATYPE Mega16 //#define MEGATYPE Mega64 #define MEGATYPE Mega128 //#define MEGATYPE Mega32 //#define MEGATYPE Mega162 //#define MEGATYPE Mega169 //#define MEGATYPE Mega8515 //#define MEGATYPE Mega8535 //#define MEGATYPE Mega163 //#define MEGATYPE Mega323 //#define MEGATYPE Mega48 //#define MEGATYPE Mega88 //#define MEGATYPE Mega168 //#define MEGATYPE Mega165 //#define MEGATYPE Mega3250 //#define MEGATYPE Mega6450 //#define MEGATYPE Mega3290 //#define MEGATYPE Mega6490 //#define MEGATYPE Mega406 //#define MEGATYPE Mega640 //#define MEGATYPE Mega1280 //#define MEGATYPE Mega2560 //#define MEGATYPE MCAN128 //#define MEGATYPE Mega164 //#define MEGATYPE Mega328 //#define MEGATYPE Mega324 //#define MEGATYPE Mega325 //#define MEGATYPE Mega644 //#define MEGATYPE Mega645 //#define MEGATYPE Mega1281 //#define MEGATYPE Mega2561 //#define MEGATYPE Mega404 //#define MEGATYPE MUSB1286 //#define MEGATYPE MUSB1287 //#define MEGATYPE MUSB162 //#define MEGATYPE MUSB646 //#define MEGATYPE MUSB647 //#define MEGATYPE MUSB82 //#define MEGATYPE MCAN32 //#define MEGATYPE MCAN64 //#define MEGATYPE Mega329 //#define MEGATYPE Mega649 //#define MEGATYPE Mega256
سپس لازم است که تنظیمات سریال را تنظیم کنید از جمله باودریت و فرکانس و… :
//***************************************************************************** // MCU Frequency //***************************************************************************** #define XTAL 7372800 //***************************************************************************** // Bootload on UART x //***************************************************************************** #define UART 0 //#define UART 1 //#define UART 2 //#define UART 3 //***************************************************************************** // BaudRate //***************************************************************************** #define BAUDRATE 115200
در زیر تابع MAIN برنامه را مشاهده میکنید که در ابتدا سعی میشود تنظیمات مربوط به سریال انجام بشه که مربوط به ارتباط بیرونی خواهد بود و سپس میتوانید حتی با چککردن نوع سورس ریستارت ساختار مناسب آپدیت برنامهی اصلی را مشخص کنید. سپس طبق یک تراکنش که شامل یک تبادل اطلاعات با برنامهی ویندوز Sisoogloader هست میتوانید برنامهی اصلی را به صورت صفحه به صفجه بر روی میکرو بریزید. تابع WriteFlashPage عملیات پروگرام صفحهبهصفحه را انجام میدهد:
void main(void) { char i,Rxd_[20]; PULLUPPORT = PULLUPPIN; // Pull up on RX line //_UBRRH = ((XTAL / (16 * BAUDRATE)) - 1)>>8; _UBRRL = (XTAL / (16 * BAUDRATE)) - 1; //set baud rate; _UCSRB = 0x18; // Rx enable Tx Enable _UCSRC = 0x86; // Asyn,NoParity,1StopBit,8Bit #ifdef RS485DDR RS485DDR |= RS485TXE; // RS485 Tranceiver switch pin as output RS485PORT &= ~RS485TXE; // RS485 in Rx mode #endif for(i=0;i<20;i++) Rxd_[i]=0; //------------------------------------------------- //Setting Depend to new Project SettingThis(); //------------------------------------------------- switch(Check_Source_Reset()) { case 1: //Debug_putf("Power_on_Reset"); TxChar('Z');TxChar('1'); TxChar(0X0A);TxChar(0X0D); break; case 2: //Debug_putf("External_Reset_Reset"); TxChar('Z');TxChar('2'); TxChar(0X0A);TxChar(0X0D); break; case 3: //Debug_putf("Brown_Out_Reset"); TxChar('Z');TxChar('3');TxChar(0X0A);TxChar(0X0D); break; case 4: //Debug_putf("Watchdog_Reset"); TxChar('Z');TxChar('4'); TxChar(0X0A);TxChar(0X0D); break; } _UBRRL = (XTAL / (16 * BAUDRATE)) - 1; //set baud rate; _UCSRB = 0x18; // Rx enable Tx Enable _UCSRC = 0x86; // Asyn,NoParity,1StopBit,8Bit RxChar(); TxChar('>'); Rxd_[0]=RxChar();//delay_ms(20); if (Rxd_[0] == '<') { Rxd_[1]=RxChar(); Rxd_[2]=RxChar(); Rxd_[3]=RxChar(); Rxd_[4]=RxChar(); Rxd_[5]=RxChar(); Rxd_[6]=RxChar(); if(Rxd_[1]=='S' && Rxd_[2]=='I' && Rxd_[3]=='S' && Rxd_[4]=='O' && Rxd_[5]=='O') { if(Rxd_[6]=='G') Normal_file=1; else Normal_file=0; TxChar(PageSize); TxChar(DeviceID); TxChar(FlashSize); TxChar(BootSize); TxChar(EEpromSize); TxChar('!'); while (1) { WDR(); Ack_Khnowledge1=0XAA; Ack_Khnowledge2=0XBB; GetPageNumber(); PORTB.5=!PORTB.5; if (RealPageAddress == 0xffff) break; if (WriteFlashPage()) TxChar('!'); else TxChar('@'); } PORTB.5=0; #ifdef EEPROM EEpromLoad(); #endif #ifdef LOCKBIT LockBit(); #endif } } #ifdef RAMPZ_FLAG RAMPZ = 0; #endif #ifdef INTVECREG MCUCR = (1<<IVCE); MCUCR = 0x00; #endif delay_ms(20); #asm("jmp 0x0000"); // Run application code }
در برنامه ویندوز فایل هگز را انتخاب نمایید و سپس پورت و باودریت مناسب را انتخاب کنید و میکرو را ریستارت نمایید تا روال آپدیت بصورت اتوماتیک انجام گیرد.
دانلود فایلهای مورد نیاز
دانلود برنامه ویندوز بوت لودر:
منبع: سیسوگ