اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : کامپایلر IAR

    (int) در
    کد:
     GLCD_WriteData(GLCD_ReadByteFromROMMemory((char *)((int)font5x8 + (5 * charToWrite) + i)));

    یعنی چی ؟ چرا داخل (int) نام متغیری نیست یا مثلا (* char) هر چقدر تو کتابهای c گشتم چیزی پیدا نکردم ؟

    دیدگاه


      پاسخ : کامپایلر IAR

      نوشته اصلی توسط n340
      با درود
      من یک ارایه ثابت تعریف کردم در iar
      به شکل زیر
      کد:
      const char id[7]="100003";
      حالا میخوام این ارایه رو از خارج iar و بدونه کامپایله مجدد تغییر بدم
      فایل هگز تولیدی رو باز کردم ولی چیزی شبیه به مقدار متغییر پیدا نکردم جز دو مورد که عینا در کد تکرار شده و فک نمی کنم که مقدار برنامه باشه
      کد:
      1B[color=red]100003[/color]8720E004
      حال راه چاره چیست ؟
      در فایل hex با فرمت intel اگر یک بخش از اطلاعات تغییر کند، لازم است بقیه فایل هم تغییراتی داشته باشد و تنها تغییر همان بخش کافی نیست. یک روش پیشنهادی این است که توسط برخی نرم افزارهای قابل دسترس، فایل hex را به bin تبدیل کنید و بعد از شناسایی مکان مورد نظر و تغییر آن، توسط نرم افزارهای تبدیل bin به hex مجددا فایل جدید را بازسازی کنید.

      نوشته اصلی توسط mehdi210
      (int) در
      کد:
       GLCD_WriteData(GLCD_ReadByteFromROMMemory((char *)((int)font5x8 + (5 * charToWrite) + i)));

      یعنی چی ؟ چرا داخل (int) نام متغیری نیست یا مثلا (* char) هر چقدر تو کتابهای c گشتم چیزی پیدا نکردم ؟
      مبحث type casting در C را مطالعه کنید.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        پاسخ : کامپایلر IAR

        هنگام کامپایل کردن این پیغام خطا صادر میشود :
        Fatal Error[Pe005]: could not open source file "stdint.h" H:\H\D\Project\IAR\SPH2100 P\SPH2100.1\avr_compiler.h 53
        در منوی
        option\general option\LibraryConfiguration
        CLIB را به DLIB تغییر دادم پیغام خطا رفع شد ، این کار درست بوده یا اینکه این خطا مربوط به جای دیگری می باشد ؟

        دیدگاه


          پاسخ : کامپایلر IAR

          به نظر درست بوده
          فایل مورد نظر در پوشه dlib بوده و تحت کتابخانه D (سی ++)
          پس با تنظیم کامپایلر فایل رو یافته و خطا رفع شده
          هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
          بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
          میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

          تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

          دیدگاه


            پاسخ : کامپایلر IAR

            با سلام.
            در کامپایلر IAR (والبته GCC AVR ) میشه راحت اسمبلی رو به صورت Inline نوشت. منتهی برای استفاده از دستوراتی مثل in و out که با رجیسترهای i/o کار میکنند مشکل وجود داره واین مشکل اینه که در این دستورات نمیشه از نام رجیستر به طور مستقیم استفاده کرد و باید آدرس i/o مورد نظر به صورت عدد وارد بشه. مثلاً نمیشه نوشت( in r16,pinb ) و باید به جای اون بنویسیم ( in r16,0x16 ) .آیا برای این مشکل راه حلی وجود داره؟ یا اینکه چاره ای نیست؟

            دیدگاه


              پاسخ : کامپایلر IAR

              دوستان من یک کدی دارم در هر صورت پس از اجرا میکرو رست میشود
              کسی میتونه یک تحلیلی انجام بده و نهایتا باگ این تابع پیدا کنیم
              کد:
              void decode_PDU( char* tinput, int pdu_start)
              {  
              	int useless ,septetBtytesNo,RemainBytesNo,charMessageLength;
              	int i,j;
              	unsigned char lastValue;
              	unsigned char tempMsg[180]= {0};
              	unsigned char dateTime[14];
                 if(strlen(tinput) < 20)
                 {return ;}
              	useless=2+pdu_start;
              
              	useless += (((int)intvalue(tinput[0+pdu_start])*10 + intvalue(tinput[1+pdu_start]))*2);
              	useless +=2;
              	senderNoLength = ((int) intvalue(tinput[useless])*10 + intvalue(tinput[useless+1])) ;
              	if(senderNoLength == 12 )
              	{
              	    useless+=6;
              	    senderNo[0]='0';
              	    senderNoLength-=2;
              	}
              	else useless+=4;
              	for(i = 0; i <= senderNoLength-2; i+=2)
              	{
              		senderNo[i+2] = intvalue(tinput[useless+i])+48;
              		senderNo[i+1] = intvalue(tinput[useless+i+1])+48;
              	}
              	if((senderNoLength%2)== 1)
              	{
              		senderNo[i] = intvalue(tinput[useless+i+1])+48;
              		useless += senderNoLength + 1 + 4;
              	}
              	else
              		useless += senderNoLength + 4;
              
              	for(i = 0; i < 12; i+=2)
              	{
              		dateTime[i+1] = intvalue(tinput[useless+i])+48;
              		dateTime[i] = intvalue(tinput[useless+i+1])+48;
              	}
              	//timeZone = (((int)dateTime[12]*10) + dateTime[13]);
              	useless += 14;
              	messageLength = ((int) intvalue(tinput[useless])*10 + intvalue(tinput[useless+1])) ;
              	charMessageLength = (messageLength - (messageLength/7))*2;
              	useless += 2;
              	for (i=0, j=0; i < charMessageLength; i+=2, j++)
              	{
              		tempMsg[j] = intvalue(tinput[useless +i]);
              		tempMsg[j] = (tempMsg[j] << 4);
              		tempMsg[j] = (tempMsg [j] | intvalue(tinput[useless+i+1]));
              	}
              	septetBtytesNo = messageLength / 7;
              	RemainBytesNo = (messageLength % 7) - (messageLength/7);
              	for (i= 0; i < septetBtytesNo; i++)
              	{
              		lastValue = 0x00;
              		for( j= 6; j >= 0; j--)
              		{
              			buffer[(i*8)+j+1] = (((tempMsg[(i*7) + j]) >> (7 - j)) | lastValue) ;
              			lastValue = 0xFF;
              			lastValue = lastValue >> (j+1);
              			lastValue = lastValue & tempMsg[(i*7) + j];
              			lastValue = lastValue << (j);
              		}
              		buffer[(i*8)] = (tempMsg[(i*7)] & 0x7F);
              	}
              	j = RemainBytesNo -1;
              	lastValue = 0xFF;
              	lastValue = lastValue >> (j+1);
              	lastValue = lastValue & tempMsg[(septetBtytesNo*7) + j];
              	lastValue = lastValue << (j);
              	for( j = RemainBytesNo -1-1 ; j >= 0; j--)
              	{
              		buffer[(septetBtytesNo*8)+j+1] = (((tempMsg[(septetBtytesNo*7) + j]) >> (7 - j)) | lastValue) ;
              		lastValue = 0xFF;
              		lastValue = lastValue >> (j+1);
              		lastValue = lastValue & tempMsg[(septetBtytesNo*7) + j];
              		lastValue = lastValue << (j);
              	}
              	buffer[(septetBtytesNo*8)] = (tempMsg[(septetBtytesNo*7)] & 0x7F);
              
              }
              هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
              بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
              میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

              تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

              دیدگاه


                پاسخ : کامپایلر IAR

                نوشته اصلی توسط Intersil
                با سلام.
                در کامپایلر IAR (والبته GCC AVR ) میشه راحت اسمبلی رو به صورت Inline نوشت. منتهی برای استفاده از دستوراتی مثل in و out که با رجیسترهای i/o کار میکنند مشکل وجود داره واین مشکل اینه که در این دستورات نمیشه از نام رجیستر به طور مستقیم استفاده کرد و باید آدرس i/o مورد نظر به صورت عدد وارد بشه. مثلاً نمیشه نوشت( in r16,pinb ) و باید به جای اون بنویسیم ( in r16,0x16 ) .آیا برای این مشکل راه حلی وجود داره؟ یا اینکه چاره ای نیست؟
                یک روش استفاده از کدهای اسمبلی بصورت MODULE و صدا کردن آن از داخل کد C است که در این مورد می توانید به AVR1300 و نحوه نوشتن و اضافه کردن فایل adc_driver_asm.s90 مراجعه کنید.

                نوشته اصلی توسط n340
                دوستان من یک کدی دارم در هر صورت پس از اجرا میکرو رست میشود
                کسی میتونه یک تحلیلی انجام بده و نهایتا باگ این تابع پیدا کنیم
                کد:
                void decode_PDU( char* tinput, int pdu_start)
                {  
                	int useless ,septetBtytesNo,RemainBytesNo,charMessageLength;
                	int i,j;
                	unsigned char lastValue;
                	unsigned char tempMsg[180]= {0};
                	unsigned char dateTime[14];
                   if(strlen(tinput) < 20)
                   {return ;}
                	useless=2+pdu_start;
                
                	useless += (((int)intvalue(tinput[0+pdu_start])*10 + intvalue(tinput[1+pdu_start]))*2);
                	useless +=2;
                	senderNoLength = ((int) intvalue(tinput[useless])*10 + intvalue(tinput[useless+1])) ;
                	if(senderNoLength == 12 )
                	{
                	    useless+=6;
                	    senderNo[0]='0';
                	    senderNoLength-=2;
                	}
                	else useless+=4;
                	for(i = 0; i <= senderNoLength-2; i+=2)
                	{
                		senderNo[i+2] = intvalue(tinput[useless+i])+48;
                		senderNo[i+1] = intvalue(tinput[useless+i+1])+48;
                	}
                	if((senderNoLength%2)== 1)
                	{
                		senderNo[i] = intvalue(tinput[useless+i+1])+48;
                		useless += senderNoLength + 1 + 4;
                	}
                	else
                		useless += senderNoLength + 4;
                
                	for(i = 0; i < 12; i+=2)
                	{
                		dateTime[i+1] = intvalue(tinput[useless+i])+48;
                		dateTime[i] = intvalue(tinput[useless+i+1])+48;
                	}
                	//timeZone = (((int)dateTime[12]*10) + dateTime[13]);
                	useless += 14;
                	messageLength = ((int) intvalue(tinput[useless])*10 + intvalue(tinput[useless+1])) ;
                	charMessageLength = (messageLength - (messageLength/7))*2;
                	useless += 2;
                	for (i=0, j=0; i < charMessageLength; i+=2, j++)
                	{
                		tempMsg[j] = intvalue(tinput[useless +i]);
                		tempMsg[j] = (tempMsg[j] << 4);
                		tempMsg[j] = (tempMsg [j] | intvalue(tinput[useless+i+1]));
                	}
                	septetBtytesNo = messageLength / 7;
                	RemainBytesNo = (messageLength % 7) - (messageLength/7);
                	for (i= 0; i < septetBtytesNo; i++)
                	{
                		lastValue = 0x00;
                		for( j= 6; j >= 0; j--)
                		{
                			buffer[(i*8)+j+1] = (((tempMsg[(i*7) + j]) >> (7 - j)) | lastValue) ;
                			lastValue = 0xFF;
                			lastValue = lastValue >> (j+1);
                			lastValue = lastValue & tempMsg[(i*7) + j];
                			lastValue = lastValue << (j);
                		}
                		buffer[(i*8)] = (tempMsg[(i*7)] & 0x7F);
                	}
                	j = RemainBytesNo -1;
                	lastValue = 0xFF;
                	lastValue = lastValue >> (j+1);
                	lastValue = lastValue & tempMsg[(septetBtytesNo*7) + j];
                	lastValue = lastValue << (j);
                	for( j = RemainBytesNo -1-1 ; j >= 0; j--)
                	{
                		buffer[(septetBtytesNo*8)+j+1] = (((tempMsg[(septetBtytesNo*7) + j]) >> (7 - j)) | lastValue) ;
                		lastValue = 0xFF;
                		lastValue = lastValue >> (j+1);
                		lastValue = lastValue & tempMsg[(septetBtytesNo*7) + j];
                		lastValue = lastValue << (j);
                	}
                	buffer[(septetBtytesNo*8)] = (tempMsg[(septetBtytesNo*7)] & 0x7F);
                
                }
                آیا مشکل شما ناشی از تنظیم نادرست CSTACK و RSTACK نیست؟
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


                  پاسخ : کامپایلر IAR

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

                  تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

                  دیدگاه


                    پاسخ : کامپایلر IAR

                    اگر منظور شما قرار گرفتن شماره سریال متغیر در flash باشد، از طریق ارتباط برقرار کردن نرم افزار تولید کننده شماره سریال متغیر با Bootloader می توان در محل مشخصی از حافظه شماره مذکور را ثبت کرد. همچنین در XMEGA بخشی با نام User Signature Row که ناحیه مجزایی است برای این منظور پیش بینی شده است. روش های دیگری هم مانند دریافت شماره از طریق هر نوع ارتباط برنامه (USART، SPI، TWI و موارد دیگر) و نوشتن در eeprom قابل پیاده سازی است. نرم افزار پروگرامر هم اگر بصورت خاص طراحی شده باشد می تواند هنگام برنامه ریزی در محل مشخصی از حافظه اطلاعات متغیر شماره سریال را بنویسد.
                    اوژن: به معنای افکننده و شکست دهنده است
                    دانایی، توانایی است-Knowledge is POWER
                    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                    دیدگاه


                      پاسخ : کامپایلر IAR

                      با سلام
                      من موقع کامپایل یه برنامه با ارور زیر مواجه میشم :

                      Error[e16]: Segment NEAR_I (size: 0x203 align: 0) is too long for segment definition. At least 0x43 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)NEAR_I,NEAR_Z,NEAR_N=_..X_SRAM_BASE-_..X_SRAM_END", where at the moment of placement the available memory ranges were "DATA:140-2ff"
                      Reserved ranges relevant to this placement:
                      DATA:100-11f CSTACK
                      DATA:120-13f RSTACK
                      DATA:140-2ff NEAR_I


                      مقدار cstack و rstack رو اگر صفر هم بزارم ، باز هم near_i سه بایت کم میاره .
                      یه مورد دیگه این که میکرو که باهاش کار میکنم(at90usb162) مدل حافظه tiny پشتیبانی نمیکنه.
                      با این تفاسیر ؛

                      1. اول اینکه این NEAR_I رو اگر میشه یکم در موردش توضیح بدید .
                      2. به نظرتون برای حل این مشکل چکار میتونم بکنم به غیر از حذف روتین ها و یا متغیرهای اضافه از برنامه(البته به نظر خودم اصلا روتین و متغیر اضافه ندارم ) .

                      دیدگاه


                        پاسخ : کامپایلر IAR

                        در ناحیه NEAR_I متغیرهای سراسری و static با مقدار غیر صفر ذخیره می شوند. علیرغم محدودیت 512 بایت حافظه در At90usb162، با تصحیح فایل باپسوند xcl و یا command مستقیم می توان مرزهای segment ها را در حافظه جابجا کرد که در مراجعه بعدی به انجمن پاسخ دقیق تری را در اختیار شما قرار خواهم داد.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          پاسخ : کامپایلر IAR

                          بطور کلی برای کنترل کامل روی Segment های مختلف حافظه می توانید به ترتیب زیر عمل کنید:
                          1- از مسیر نصب IAR در فولدر Avr\Config فایل متناظر با میکروکنترلر مورد استفاده با پسوند xcl را در فولدر پروژه کپی کنید.
                          2- در Project\Options\General option\Target تیک Configure system using dialogs not in *XCL file را بردارید.
                          3- در مسیر Project\Options\Linker\Config\Linker command file تیک override default را بزنید و مسیر فایل کپی شده xcl را در آن قرار دهید.
                          4- حال در متن فایل کپی شده مقادیر مورد نظر برای آرایش حافظه را اعمال کنید.

                          اما قبل از طی مراحل بالا تصویری از بخش انتهایی فایل map پروژه خود را قرار دهید که در آن مقادیر سگمنت ها نمایش داده شده است.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            پاسخ : کامپایلر IAR

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

                            دیدگاه


                              پاسخ : کامپایلر IAR

                              با سلام به همه عزیزان و تبریک سال نو.
                              یه سوال داشتم.
                              یک رشته که حاوی 15 رقم هست داریم که در بد ترین حالت 7 بایت میشه.
                              این رشته رو چجوری تبدیل به عدد کنم.

                              از atol استفاده کردم اما منفی یک برگردوند. تست کردم دیدم atol رشته عددی بیشتر از 10 رقم رو منفی یک میده.
                              ممنون میشم کمک کنید.

                              دیدگاه


                                پاسخ : کامپایلر IAR

                                نوشته اصلی توسط امیر . م
                                با سلام به همه عزیزان و تبریک سال نو.
                                یه سوال داشتم.
                                یک رشته که حاوی 15 رقم هست داریم که در بد ترین حالت 7 بایت میشه.
                                این رشته رو چجوری تبدیل به عدد کنم.

                                از atol استفاده کردم اما منفی یک برگردوند. تست کردم دیدم atol رشته عددی بیشتر از 10 رقم رو منفی یک میده.
                                ممنون میشم کمک کنید.
                                با یه اشاره گر دونه دونه از رقم اول شروع کنید مقدار حافظه مربوط به رقم رو -48 میکنید بعد عدد حاصل رو به تعداد یکی کمتر از شماره رقم در 10 ضرب میکنید و با متغیر جواب نهایی جمع میکنید و حاصل رو دوباره میریزید داخل متغیر جواب نهایی
                                امیدوارم قابل فهم بوده باشه

                                دیدگاه

                                لطفا صبر کنید...
                                X