اطلاعیه

Collapse
No announcement yet.

خطا نامفهوم در c18

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    خطا نامفهوم در c18

    سلام به همه دوستان
    من تازه از ccs به mplab c18 مهاجرت کردم و سعی کردم بعضی لایبری های پر کاربرد رو از ccs به c18 پورت کنم.اما یه خطای نا جور گرفته که نمی دونم چیه .دوستان کسی هست یه راه نمایی بکنه.آیا برای c18 کرک لازمه .؟
    اینم متن خطا..ممنون از کمکتون
    Error - section '.idata_main.o' can not fit the section. Section '.idata_main.o' length=0x000001db
    Errors : 1

    #2
    پاسخ : خطا نامفهوم در c18

    سلام.
    من هم قبلا این مشکل رو داشتم.
    جویا شدم فهمیدم که آرایه های خیلی بزرگ رو نمیشه همینجوری معرفی کرد.
    وباید بریزیم تو رام.
    همین قدر میدونستم. :redface:
    کد:
    rom unsigned int counter[160];
    تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

    دیدگاه


      #3
      پاسخ : خطا نامفهوم در c18

      با سلام
      بهترین جا برای یافتن سوالات جستجو در فروم خود میکروچیپ است
      من نتایج جستجو در فروم میکرو چیپ رو برات میزارم، یک نگاهی بنداز، انشاالله مشکلت حل میشه
      http://www.microchip.com/forums/search.aspx?searchid=790629&high=Error%20-%20section%20%27.idata_main.o

      دیدگاه


        #4
        پاسخ : خطا نامفهوم در c18

        نوشته اصلی توسط mehdi_nxp
        سلام.
        من هم قبلا این مشکل رو داشتم.
        جویا شدم فهمیدم که آرایه های خیلی بزرگ رو نمیشه همینجوری معرفی کرد.
        وباید بریزیم تو رام.
        همین قدر میدونستم. :redface:
        کد:
        rom unsigned int counter[160];
        داداشم واقعا ممنونم .خیلی ماهی .تمام مشکلاتش حل شد. دردش همین بود .من یه آرایه ی خیلی بزرگ معرفی کرده بودم.بازم ممنون

        دیدگاه


          #5
          پاسخ : خطا نامفهوم در c18

          سلام

          در کامپایلر C18 برای تعریف آرایه های بزرگ باید لینکر فایل ها رو تغییر بدین

          در لینک زیر توضیح کاملی وجود داره

          http://www.xargs.com/pic/c18large.html

          به این روش شما میتوانید قطعات بزرگی از حافظه رو اختصاص دهید

          اگر متوجه نشدید بگید تا ساده تر به صورت فارسی توضیح بدم
          نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
          تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

          دیدگاه


            #6
            پاسخ : خطا نامفهوم در c18

            سلام
            من هم همین مشکل را داشتم با عوض کردن linker مشکل حل شد .
            این linker موقع کار با 46k22 وجود نداشت و باید از linker های دیگه استفاده می کردم و تغییرشون میدادم .
            حالا یه سوال دارم این linker ها را در کل باید چطوری تعریف کرد؟؟
            ممنون

            دیدگاه


              #7
              پاسخ : خطا نامفهوم در c18

              منظور شما رو از تعریف فایل لینکر متوجه نشدم , اما در نرم افزار MPLAM X IDE شما میتوانید آدرس فایل لینکر خودتون رو برای کامپایلر تعریف کنید تا از این به بعد فقط برای پروژه مورد نظر فایل لینکر شما رو استفاده کند

              این تنظیمات در MPLAB X IDE در نوار ابزار در File در Project Properties قرار داره

              همچنین باید فایل لینکر خودتون رو در پنجره پروژه به پروژه اضافه کنید
              نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
              تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

              دیدگاه


                #8
                پاسخ : خطا نامفهوم در c18

                نوشته اصلی توسط ramezani.t
                منظور شما رو از تعریف فایل لینکر متوجه نشدم , اما در نرم افزار MPLAM X IDE شما میتوانید آدرس فایل لینکر خودتون رو برای کامپایلر تعریف کنید تا از این به بعد فقط برای پروژه مورد نظر فایل لینکر شما رو استفاده کند

                این تنظیمات در MPLAB X IDE در نوار ابزار در File در Project Properties قرار داره

                همچنین باید فایل لینکر خودتون رو در پنجره پروژه به پروژه اضافه کنید
                نه آقای رمضانی عزیز
                منظورشون اینه که چطور میشه Linker نوشت
                یا معنی تک تک خط های لینکر چی هست؟!
                که هر زمان بر اساس پروژه نیاز شد تغییری داده بشه بدونن کجا رو و چطور تغییر بدن که برنامه به درستی کاپمپایل شه
                درایور شبکه و nRF24L01
                کاتالوگ محصولات
                کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                فروش اسيلوسکوپ GWinstek GOS-630FC

                دیدگاه


                  #9
                  پاسخ : خطا نامفهوم در c18

                  بله منظورم دقیقا نحوه نوشتن linker .
                  برای یکی از برنامه ها مجبور شدم کلی از DATABANK ها یک لینکر را حذف کنم تا خطای برنامه برطرف بشه :rolleyes:
                  حالا می خوام بدونم این DATABANK ها چی هستند ؟
                  در مورد میکرو ها متفاوت چطور باید تعریف بشن؟
                  و محدودیت هاشون چیه؟ :smile:

                  دیدگاه


                    #10
                    پاسخ : خطا نامفهوم در c18

                    سلام

                    بله من توضیح بیشتری میدم , البته خط به خط که نمیشه ولی تا جایی که اطلاعات داشته باشم توضیح میدم , داخل لینکی که در بالا قرار دادم خیلی کامل تر توضیح داده , من خیلی ساده تر توضیح میدم


                    در ابتدا باید این رو بدونید که این موضوع که شما به سادگی نمیتوانید یک آرایه بزرگ تر از 256 بایت در کامپایلر MPLAB C18 تعریف کنید یک نقص برای این کامپایلر محسوب میشه اما این مشکل در سری جدید کامپایلر های شرکت میکروچیپ حل شده , شما در کامپایلر MPLAB XC8 این مشکل رو ندارید .


                    در کل لینکر یک نرم افزار است , قسمتی از کامپایلر شما که بیشتر کامپایلر ها دارای این برنامه هستن
                    ساده بگم وظیفه کلی این برنامه ادغام سرس کد ها و قسمت های مختلف کامپایلر با هم هست که یکی از ملزومات آن داشتن آدرس های حافظه است

                    هر میکرو کنترلر دارای بلوک های حافظه متعدد و جدا از هم هستند که به آنها GPR ( General Purpose Registers )

                    GPR رو در دیتاشیت میکرو خودتون سرچ کنید و بعد به لینکر فایل مورد نظرتون دقت کنید

                    مثلا میکرو 18f4550

                    به لینکرش دقت کنید :


                    کد:
                    // File: 18f4550_g.lkr
                    // Generic linker script for the PIC18F4550 processor
                    
                    #DEFINE _CODEEND _DEBUGCODESTART - 1
                    #DEFINE _CEND _CODEEND + _DEBUGCODELEN
                    #DEFINE _DATAEND _DEBUGDATASTART - 1
                    #DEFINE _DEND _DATAEND + _DEBUGDATALEN
                    
                    LIBPATH .
                    
                    #IFDEF _CRUNTIME
                     #IFDEF _EXTENDEDMODE
                      FILES c018i_e.o
                      FILES clib_e.lib
                      FILES p18f4550_e.lib
                    
                     #ELSE
                      FILES c018i.o
                      FILES clib.lib
                      FILES p18f4550.lib
                     #FI
                    
                    #FI
                    
                    #IFDEF _DEBUGCODESTART
                     CODEPAGE  NAME=page    START=0x0        END=_CODEEND
                     CODEPAGE  NAME=debug   START=_DEBUGCODESTART  END=_CEND    PROTECTED
                    #ELSE
                     CODEPAGE  NAME=page    START=0x0        END=0x7FFF
                    #FI
                    
                    CODEPAGE  NAME=idlocs   START=0x200000     END=0x200007    PROTECTED
                    CODEPAGE  NAME=config   START=0x300000     END=0x30000D    PROTECTED
                    CODEPAGE  NAME=devid   START=0x3FFFFE     END=0x3FFFFF    PROTECTED
                    CODEPAGE  NAME=eedata   START=0xF00000     END=0xF000FF    PROTECTED
                    
                    #IFDEF _EXTENDEDMODE
                     DATABANK  NAME=gpre    START=0x0        END=0x5F
                    #ELSE
                     ACCESSBANK NAME=accessram START=0x0        END=0x5F
                    #FI
                    
                    DATABANK  NAME=gpr0    START=0x60       END=0xFF
                    DATABANK  NAME=gpr1    START=0x100       END=0x1FF
                    DATABANK  NAME=gpr2    START=0x200       END=0x2FF
                    
                    #IFDEF _DEBUGDATASTART
                     DATABANK  NAME=gpr3    START=0x300       END=_DATAEND
                     DATABANK  NAME=dbgspr   START=_DEBUGDATASTART  END=_DEND      PROTECTED
                    #ELSE //no debug
                     DATABANK  NAME=gpr3    START=0x300       END=0x3FF
                    #FI
                    
                    DATABANK  NAME=gpr4    START=0x400       END=0x4FF
                    DATABANK  NAME=gpr5    START=0x500       END=0x5FF
                    DATABANK  NAME=gpr6    START=0x600       END=0x6FF
                    DATABANK  NAME=gpr7    START=0x700       END=0x7FF
                    ACCESSBANK NAME=accesssfr START=0xF60       END=0xFFF     PROTECTED
                    
                    #IFDEF _CRUNTIME
                     SECTION  NAME=CONFIG   ROM=config
                     #IFDEF _DEBUGDATASTART
                      STACK SIZE=0x100 RAM=gpr2
                     #ELSE
                      STACK SIZE=0x100 RAM=gpr3
                     #FI
                    #FI

                    در کامپیوتر من این لینکر در آدرس زیر قرار داشت :

                    C:\Program Files\Microchip\mplabc18\v3.42\bin\LKR

                    حال خوب به دیتاشیت و فایل لینکر دقت کنید

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

                    دیدگاه


                      #11
                      پاسخ : خطا نامفهوم در c18

                      و اما ادامه مطالب

                      با یک مثال همه چیز به سادگی مشخص میشود

                      فرض کنید که میخاهید سه آرایه با ظرفیت های مختلف داشته باشید , اولی 300 بایت دومی 350 بایت و سومی 400 بایت که آرایه سوم قرار است مقداردهی اولیه هم داشته باشد

                      اولین کاری که باید انجام دهید , قرار دادن کد های زیر در برنامه C خودتون هست , این کد ها رو در همانجا که متغیر های دیگرتون تعریف کردین قرار بدین




                      #pragma udata large_udata
                      unsigned char big_buff1[300];
                      unsigned char big_buff2[350];
                      #pragma udata

                      #pragma idata large_idata
                      unsigned char big_table[400] = { 1, 2, 42 };
                      #pragma idata


                      دقت کنید اصل این دستور در C18 به شکل زیر است



                      ( نام دیتا بانک انتخابی شما )pragma udata#
                      ( تعریف متغیر ها به صورت مقدار دهی نشده )
                      pragma udata#

                      ( نام دیتا بانک انتخابی شما )pragma idata#
                      ( تعریف متغیر ها به صورت مقدار دهی شده )
                      pragma idata#


                      بله , همان طور که متوجه شدید از idata برای متغیر هایی که مقدار اولیه دارند استفاده میشود ( initialized data )

                      و از udata برای متغیر هایی که مقدار اولیه ندارند استفاده میشود( un-initialized data )

                      نام هایی که برای دیتا بانک انتخاب میکنید را باید در فایل لینکر قرار بدین
                      و در اصل نرم افزار لینکر به این اسامی حصاص هستن
                      همان طور که میبینید ما نام های large_udata و large_idata رو انتخاب کردیم


                      حال برای تغییر فایل لینکر باید اقدام کنید
                      برای این کار ابتدا فایل لینکر خودتون رو در محل پرژه کپی کنید

                      و سپس در نرم افزار MPLAB X IDE در قسمت پنجره پروژه اون رو به Linker Files اضافه کنید و روی آن کلیک کنید تا باز شود

                      خب همان طور که گفتم ما بر روی تراشه 18f4550 کار میکنیم

                      به لینکر فایل این تراشه دقت کنید و توضیحات من رو بخوانید

                      من قصد دارم large_idata رو که 400 بایت ذرفیت دارد رو در gpr یک و دو قرار بدم
                      gpr های تغییر نیافته به شکل زیر هستن

                      DATABANK NAME=gpr0 START=0x60 END=0xFF
                      DATABANK NAME=gpr1 START=0x100 END=0x1FF
                      DATABANK NAME=gpr2 START=0x200 END=0x2FF

                      من اونا رو به شکل زیر تغییر دادم


                      DATABANK NAME=gpr0 START=0x60 END=0xFF
                      DATABANK NAME=gpr1 START=0x100 END=0x16F
                      DATABANK NAME=large_idata START=0x170 END=0x2FF PROTECTED

                      دقت کنید ! همان طور که بایت اول متغیر big_table در مثال big_table[0] هست و آخرین آن big_table[399] هست نه big_table[400]
                      در اینجاهم اولین آدرس حافظه این متغیر 0x170 هست و آخرین آن هم 0x2FF هست نه 0x300

                      حال برای اختصاص حافظه دیتا بانک large_udata اقدام میکنیم :smile:

                      برای این کار من از gpr های 4 , 5 , قسمتی از 6 استفاده میکنم

                      gpr های تغییر نیافته به شکل زیر هستن :


                      DATABANK NAME=gpr4 START=0x400 END=0x4FF
                      DATABANK NAME=gpr5 START=0x500 END=0x5FF
                      DATABANK NAME=gpr6 START=0x600 END=0x6FF
                      DATABANK NAME=gpr7 START=0x700 END=0x7FF

                      و پس از تغییر به شکل زیر شدند :


                      DATABANK NAME=gpr4 START=0x400 END=0x689 PROTECTED
                      DATABANK NAME=gpr6 START=0x68A END=0x6FF
                      DATABANK NAME=gpr7 START=0x700 END=0x7FF

                      دقت کنید در برخی از تراشه ها , مانند همین تراشه , برخی از gpr ها به صورت سخت افزاری به USB متصل هستند , که چنانچه از USB در این تراشه استفاده میکنید باید به این موضوع دقت کنید

                      و اما هنوز کار ما با فایل لینکر تمام نشده

                      دوخط در پایان این فایل باید وجود داشته باشد


                      SECTION NAME=large_udata RAM=large_udata
                      SECTION NAME=large_idata RAM=large_idata

                      این خط را در پایان gpr ها و بعد از رجیستر های SFR قرار بدین

                      در کل فایل لینکر 18F4550 به شکل زیر شد :


                      کد:
                      // File: 18f4550_g.lkr ( I changed the project )
                      // Generic linker script for the PIC18F4550 processor
                      
                      #DEFINE _CODEEND _DEBUGCODESTART - 1
                      #DEFINE _CEND _CODEEND + _DEBUGCODELEN
                      #DEFINE _DATAEND _DEBUGDATASTART - 1
                      #DEFINE _DEND _DATAEND + _DEBUGDATALEN
                      
                      LIBPATH .
                      
                      #IFDEF _CRUNTIME
                       #IFDEF _EXTENDEDMODE
                        FILES c018i_e.o
                        FILES clib_e.lib
                        FILES p18f4550_e.lib
                      
                       #ELSE
                        FILES c018i.o
                        FILES clib.lib
                        FILES p18f4550.lib
                       #FI
                      
                      #FI
                      
                      #IFDEF _DEBUGCODESTART
                       CODEPAGE  NAME=page    START=0x0        END=_CODEEND
                       CODEPAGE  NAME=debug   START=_DEBUGCODESTART  END=_CEND    PROTECTED
                      #ELSE
                       CODEPAGE  NAME=page    START=0x0        END=0x7FFF
                      #FI
                      
                      CODEPAGE  NAME=idlocs   START=0x200000     END=0x200007    PROTECTED
                      CODEPAGE  NAME=config   START=0x300000     END=0x30000D    PROTECTED
                      CODEPAGE  NAME=devid   START=0x3FFFFE     END=0x3FFFFF    PROTECTED
                      CODEPAGE  NAME=eedata   START=0xF00000     END=0xF000FF    PROTECTED
                      
                      #IFDEF _EXTENDEDMODE
                       DATABANK  NAME=gpre    START=0x0        END=0x5F
                      #ELSE
                       ACCESSBANK NAME=accessram START=0x0        END=0x5F
                      #FI
                      
                      DATABANK  NAME=gpr0     START=0x60       END=0xFF
                      DATABANK  NAME=gpr1     START=0x100       END=0x16F
                      DATABANK  NAME=large_idata  START=0x170       END=0x2FF  PROTECTED
                      
                      #IFDEF _DEBUGDATASTART
                       DATABANK  NAME=gpr3    START=0x300       END=_DATAEND
                       DATABANK  NAME=dbgspr   START=_DEBUGDATASTART  END=_DEND      PROTECTED
                      #ELSE //no debug
                       DATABANK  NAME=gpr3    START=0x300       END=0x3FF
                      #FI
                      
                      DATABANK  NAME=gpr4    START=0x400       END=0x689  PROTECTED
                      DATABANK  NAME=gpr6    START=0x68A       END=0x6FF
                      DATABANK  NAME=gpr7    START=0x700       END=0x7FF
                      ACCESSBANK NAME=accesssfr START=0xF60       END=0xFFF     PROTECTED
                      
                      SECTION  NAME=large_udata RAM=large_udata
                      SECTION  NAME=large_idata RAM=large_idata
                      
                      #IFDEF _CRUNTIME
                       SECTION  NAME=CONFIG   ROM=config
                       #IFDEF _DEBUGDATASTART
                        STACK SIZE=0x100 RAM=gpr2
                       #ELSE
                        STACK SIZE=0x100 RAM=gpr3
                       #FI
                      #FI


                      همچنین به gpr سه دقت کنید این gpr در داخل یک دستور پیش پردازنده هست که چنانچه شما پروژه خودتون رو برای دیباگ کردن کامپایل کنید , کامپایلر این gpr رو برای دیباگر در نظر میگیرد

                      من متوجه نشدم که آیا در نظر گرفتن این gpr برای دیباگر دلیل خاصی داشته یا نه , مثلا آیا دلیل سخت افزاری دارد ؟



                      موفق باشید @};-
                      نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
                      تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

                      دیدگاه


                        #12
                        پاسخ : خطا نامفهوم در c18

                        ممنون برای توضیحات خوبتون:smile:
                        فقط چند تا سوال برام پیش اومد اینکه گفتید نسبت به اسم ها حساسه یعنی فقط برای آرایه ها می تونیم udata و idata را انتخاب کنیم ؟
                        من اسم های دیگری را هم دیدم !!
                        در مورد usb هم جایی این linker را دیدم:
                        کد:
                        // File: 18f4550_g.lkr
                        // Generic linker script for the PIC18F4550 processor
                        
                        #DEFINE _CODEEND _DEBUGCODESTART - 1
                        #DEFINE _CEND _CODEEND + _DEBUGCODELEN
                        #DEFINE _DATAEND _DEBUGDATASTART - 1
                        #DEFINE _DEND _DATAEND + _DEBUGDATALEN
                        
                        LIBPATH .
                        
                        #IFDEF _CRUNTIME
                         #IFDEF _EXTENDEDMODE
                          FILES c018i_e.o
                          FILES clib_e.lib
                          FILES p18f4550_e.lib
                        
                         #ELSE
                          FILES c018i.o
                          FILES clib.lib
                          FILES p18f4550.lib
                         #FI
                        
                        #FI
                        
                        #IFDEF _DEBUGCODESTART
                         CODEPAGE  NAME=page    START=0x0        END=_CODEEND
                         CODEPAGE  NAME=debug   START=_DEBUGCODESTART  END=_CEND    PROTECTED
                        #ELSE
                         CODEPAGE  NAME=page    START=0x0        END=0x7FFF
                        #FI
                        
                        CODEPAGE  NAME=idlocs   START=0x200000     END=0x200007    PROTECTED
                        CODEPAGE  NAME=config   START=0x300000     END=0x30000D    PROTECTED
                        CODEPAGE  NAME=devid   START=0x3FFFFE     END=0x3FFFFF    PROTECTED
                        CODEPAGE  NAME=eedata   START=0xF00000     END=0xF000FF    PROTECTED
                        
                        #IFDEF _EXTENDEDMODE
                         DATABANK  NAME=gpr0    START=0x0        END=0xFF
                        #ELSE
                         ACCESSBANK NAME=accessram START=0x0        END=0x5F
                         DATABANK  NAME=gpr0    START=0x60       END=0xFF
                        #FI
                        
                        DATABANK  NAME=gpr1    START=0x100       END=0x1FF
                        DATABANK  NAME=gpr2    START=0x200       END=0x2FF
                        
                        #IFDEF _DEBUGDATASTART
                         DATABANK  NAME=gpr3    START=0x300       END=_DATAEND
                         DATABANK  NAME=dbgspr   START=_DEBUGDATASTART  END=_DEND      PROTECTED
                        #ELSE //no debug
                         DATABANK  NAME=gpr3    START=0x300       END=0x3FF
                        #FI
                        
                        DATABANK  NAME=usb4    START=0x400       END=0x4FF     PROTECTED
                        DATABANK  NAME=usb5    START=0x500       END=0x5FF     PROTECTED
                        DATABANK  NAME=usb6    START=0x600       END=0x6FF     PROTECTED
                        DATABANK  NAME=usb7    START=0x700       END=0x7FF     PROTECTED
                        ACCESSBANK NAME=accesssfr START=0xF60       END=0xFFF     PROTECTED
                        
                        #IFDEF _CRUNTIME
                         SECTION  NAME=CONFIG   ROM=config
                         #IFDEF _DEBUGDATASTART
                          STACK SIZE=0x100 RAM=gpr2
                         #ELSE
                          STACK SIZE=0x100 RAM=gpr3
                         #FI
                        #FI

                        databank های خاصی را برای usb ها مشخص کرده حالا اگر مشخص نشده باشه باید اضافه اش کنیم ؟؟یا اینکه یکی به صورت پیش فرض مثلا gpr3اختصاص داده می شه؟

                        دیدگاه


                          #13
                          پاسخ : خطا نامفهوم در c18

                          اسم udata و idata برای متغیر ها استفاده نمیشوند بلکه pragma udata و pragma udata جزو کلمات کلیدی C18 هستن , همچنین بعد از این دوعبارت باید نام دیتابانک رو قرار بدین که هر چیزی میتواند باشد و منظور من از حساس بودن به اسامی این بود که این نام باید در لینکر فایل نیز باشد

                          در مورد USB هم باید به کتاب خانه های میکروچیپ دقت کنید

                          در این کتاب خانه ها مثال های خوبی وجود دارد , پروژه های آماده که لینکر فایل های اونها برای کار با USB تغییر داده شده اند

                          در کل هم باید به این موضوع دقت کنید که سخت افزار USB به صورت سخت افزاری به این gpr ها متصل هستن و نمیتوان هر gpr رو به USB نسبت داد , به این موضوع در دیتاشیت اشاره شده
                          نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
                          تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

                          دیدگاه

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