На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Как заставить IAR расположить кучу во внешней памяти?
      Только начал с ним разбираться, в WinAVR с этим вопросом все просто, а тут вот не получилось...
      Контроллер - atmega128
      Пока пробовал вот так: в параметрах проекта General указывал на существование внешней памяти (32х8к) и задавал размер кучи в 0x6F00 = 32кбайт - 4352(внутренние адреса) Ругается на недостаток места для RSTACK:
      Error[e16]: Segment RSTACK (size: 0x200 align: 0) is too long for segment definition. At least 0x200 more bytes
      needed. The problem occurred while processing the segment placement command
      "-Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_RSTACK_BASE-_..X_RSTACK_END", where at the moment of
      placement the available memory ranges were "-none-"
      Reserved ranges relevant to this placement:
      DATA:100-4ff CSTACK
      DATA:500-10ff HEAP

      А я хочу кучу в адресах 0x1100-0x8000
      Видимо нужно добавить параметр командной строки для линкера, но это-то у меня сделать прямым способом не вышло...
        Давно не работал с IAR. Этот выводимый кусок - это кусок конфигурационного файла. Там, ЕМНИП, можно указать, какой сегмент где должен лежать.
          Цитата Matracc @
          А я хочу кучу в адресах 0x1100-0x8000
          Видимо нужно добавить параметр командной строки для линкера, но это-то у меня сделать прямым способом не вышло...

          IAR использует .xcl - файл как расширитель командной строки
          линкера. Покопайся там.
          У нужного тебе сегмента укажи начальный адрес. И, если надо, еще и размер.
          Чтобы настройки .xcl файла конкретного проекта не влияли на другие
          проекты, нужно скопировать этот файл в директорию проекта.
          Затем в настройках среды программирования "указать на него".

          Можно просто физически расположить сегмент последним в списке сегментов.
          Указать его начальный адрес и все. Но в этом случае не будет контроля
          за возможным выходом за предельные размеры сегмента.
          Сообщение отредактировано: ЫукпШ -
            Скопировал в папку с кодом файл, который использовался линкером. Руками поправил один параметр, получилась такая строка:
            -Z(DATA)HEAP+0x6F00=0x1100-0x8000
            Вот итоговый файл:

            ExpandedWrap disabled
              //////////////////////////////////////////////////////////////////////////////
              //
              // Configuration for a generic -v3 -ms target.
              //
              // File version: $Revision: 1.12 $
              //
              // The '_..X_' prefix is used by C-SPY as an indication that the label should
              // not be displayed in the dissassembly window.
              //
               
              // Set up XLINK
              -ca90
              -w29
               
              //////////////////////////////////////////////////////////////////////////////
              // Code (flash) segments
              -Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)
              -Z(CODE)TINY_F=_..X_FLASH_BASE-FF
              -Z(CODE)NEAR_F=_..X_FLASH_BASE-_..X_FLASH_NEND
              -Z(CODE)SWITCH=_..X_FLASH_BASE-_..X_FLASH_NEND
              -Z(CODE)DIFUNCT=_..X_FLASH_BASE-_..X_FLASH_NEND
              -Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END
              -Z(CODE)FAR_F=[_..X_FLASH_BASE-_..X_FLASH_END]/10000
              -Z(CODE)INITTAB=_..X_FLASH_BASE-_..X_FLASH_END
              -Z(CODE)HUGE_F=_..X_FLASH_BASE-_..X_FLASH_END
              -Z(CODE)TINY_ID=_..X_FLASH_BASE-_..X_FLASH_END
              -Z(CODE)NEAR_ID=_..X_FLASH_BASE-_..X_FLASH_END
              -Z(CODE)CHECKSUM#_..X_FLASH_END
               
              //////////////////////////////////////////////////////////////////////////////
              // Data (SRAM, external ROM or external NV RAM) memory
              -Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_TBASE:+_..X_SRAM_TSIZE
              -Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_CSTACK_BASE-_..X_CSTACK_END
              -Z(DATA)HEAP+0x6F00=0x1100-0x8000
              -Z(DATA)IOSTREAM_N#_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X_EXT_SRAM_SIZE
              -Z(DATA)NEAR_HEAP+_..X_NEAR_HEAP_SIZE=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X_EXT_SRAM_SIZE
              -Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_RSTACK_BASE-_..X_RSTACK_END
              -Z(DATA)NEAR_I,NEAR_Z=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X_EXT_SRAM_SIZE
              -Z(DATA)NEAR_C=_..X_EXT_ROM_BASE:+_..X_EXT_ROM_SIZE
              -Z(DATA)NEAR_N=_..X_EXT_NV_BASE:+_..X_EXT_NV_SIZE
               
              //////////////////////////////////////////////////////////////////////////////
              // Internal EEPROM
               
              -Z(XDATA)EEPROM_I,EEPROM_N=_..X_EEPROM_START-_..X_EEPROM_END


            На это мне говорят непонятную фразу:
            Linking
            Fatal Error[e106]: Syntax error or bad argument in -D_..X_FLASH_BASE=_..X_INTVEC_SIZE
            Сообщение отредактировано: Matracc -
              А если попробовать расположить строку
              Цитата

              -Z(DATA)HEAP+0x6F00=0x1100-0x8000

              последней в списке ?

              Сообщение об ошибке, как я понял, относится к ROM а не к RAM.
              На первый взгляд все правильно, но с этой версией линкера я не
              работал, у меня все проще.
              Если не все понятно, надо посмотреть документацию на содержание
              .xcl - файла. Обычно эта документация прилагается и там несложно
              разобраться.

              Возможно, это не тот файл. Файлов может быть и несколько под разные
              модели памяти и сегментации.
              Сообщение отредактировано: ЫукпШ -
                Действительно, я менял не тот файл. Нашел, вроде бы действительно подходящий для этого, поменял все, что нужно.
                Все откомпилировалось, но в отладчике выполнение даже не доходит до начала main. Выполняется участок ассемблерного кода с меткой __flashcpy.
                Притом, когда просто отключаю Linker command file - Override default, код выполняется нормально, просто все большие запросы к маллоку возвращают 0.

                Вот файл линкера, между строками комментариев
                "/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/"
                те строки, которые я менял:

                ExpandedWrap disabled
                  /*                      - lnkm128.xcl -
                   *
                   *   XLINK command file for the ICCAVR C-compiler using the --cpu=m128, -ms
                   *   options. Segments are defined for an ATmega128 whithout external
                   *   memory. It is also possible to "add" external SRAM, EPROM and EEPROM.
                   *
                   *   Usage: xlink your_file(s) -f lnkm128
                   *
                   *   File version: $Revision: 1.9 $
                   */
                   
                  /*====================================================*/
                  /*
                   * Constants used down below,
                   * Do not change these lines,
                   * if it is not stated otherwise
                   */
                   
                  /* Code (flash) segments */
                  -D_..X_INTVEC_SIZE=8C   /* 4 bytes * 35 vectors */
                  -D_..X_FLASH_TEND=FF    /* End of tiny flash memory */
                  -D_..X_FLASH_NEND=FFFF  /* End of near flash memory */
                  -D_..X_FLASH_END=1FFFF  /* End of flash memory */
                  /* Internal data memory */
                   
                  /*
                   * Change the two lines below to 60(BASE) and FF(TEND)
                   * if you are running in "mega103 mode"
                   */
                  -D_..X_SRAM_BASE=100    /* Start of ram memory */
                  -D_..X_SRAM_TEND=100    /* End of tiny ram memory */
                   
                  -D_..X_SRAM_END=10FF    /* End of ram memory */
                  /* Internal EEPROM */
                  -D_..X_EEPROM_END=FFF   /* End of eeprom memory */
                  /*====================================================*/
                   
                   
                  /*
                   * Modify the lines below to alter the size of the RSTACK, CSTACK and HEAP
                   * segments. These need to be fine tuned to suit your specific application.
                   * The '_..X_' prefix is used by C-SPY as an indication that the label should
                   * not be displayed in the dissassembly window.
                   */
                  -D_..X_CSTACK_SIZE=400  /* 1024 bytes for auto variables and saved registers. */
                  -D_..X_RSTACK_SIZE=40   /* 64 bytes for return addresses, equivalent to 32 */
                                          /* levels of calls, including interrupts. */
                   
                   
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                  -D_..X_HEAP_SIZE=6F00  
                  -D_..X_NEAR_HEAP_SIZE=6F00
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                   
                  /*
                   * Modify these lines if you have an external SRAM connected to the system.
                   *
                   * Note: Remember to turn on the external data and address busses in
                   *       __low_level_init if external memory is used.
                   */
                   
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                  -D_..X_EXT_SRAM_BASE=1100
                  -D_..X_EXT_SRAM_END=8000
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                   
                  /*
                   * Modify these lines if you have an external EPROM connected to the system.
                   *
                   * Note: Remember to turn on the external data and address busses in
                   *       __low_level_init if external memory is used.
                   */
                  -D_..X_EXT_EPROM_BASE=_..X_SRAM_BASE
                  -D_..X_EXT_EPROM_END=_..X_SRAM_END
                   
                  /*
                   * Modify these lines if you have an external EEPROM connected to the system.
                   *
                   * Note: Remember to turn on the external data and address busses in
                   *       __low_level_init if external memory is used.
                   */
                  -D_..X_EXT_EEPROM_BASE=_..X_SRAM_BASE
                  -D_..X_EXT_EEPROM_END=_..X_SRAM_END
                   
                   
                  /*
                   * The following segments are located in the internal memory of
                   * the ATmega128. Do not change these lines.
                   */
                   
                  /* Define CPU */
                  -ca90
                   
                  /* Code memory */
                  -Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)
                   
                  /* Fill unused interrupt vector's with RETI */
                  //-H1895
                  -h(CODE)0-_..X_INTVEC_SIZE
                   
                  -Z(CODE)TINY_F=_..X_INTVEC_SIZE-_..X_FLASH_TEND
                  -Z(CODE)NEAR_F,SWITCH,DIFUNCT=_..X_INTVEC_SIZE-_..X_FLASH_NEND
                  -Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END
                  -Z(FARCODE)FAR_F=_..X_INTVEC_SIZE-_..X_FLASH_END
                  -Z(CODE)HUGE_F,INITTAB=_..X_INTVEC_SIZE-_..X_FLASH_END
                  -Z(CODE)TINY_ID,NEAR_ID=_..X_INTVEC_SIZE-_..X_FLASH_END
                  -Z(CODE)CHECKSUM#_..X_FLASH_END
                   
                  /* Internal data memory */
                  -Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_BASE-_..X_SRAM_TEND
                  -Z(DATA)NEAR_I,NEAR_Z=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END
                   
                  /*
                   * If external SRAM is available it is possible to place the stacks there.
                   * However, the external memory is slower than the internal so moving the
                   * stacks to the external memory will degrade the system performance.
                   */
                  -Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */
                  -Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */
                   
                  /*
                   * If external SRAM is available it might be a good idea to move the
                   * heap segment there, i.e. remove the _..X_SRAM_BASE-_..X_SRAM_END range.
                   */
                   
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                  -Z(DATA)HEAP+_..X_HEAP_SIZE=_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                   
                  -Z(DATA)IOSTREAM_N#_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END
                   
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                  -Z(DATA)NEAR_HEAP+_..X_NEAR_HEAP_SIZE=_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END
                  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
                   
                  /* Internal eeprom memory */
                  -Z(XDATA)EEPROM_I,EEPROM_N=0-_..X_EEPROM_END
                   
                  /*
                   * The following segment definitions are only used if external memory is
                   * connected to the AVR controller.
                   */
                   
                  /* External EPROM */
                  -Z(CONST)NEAR_C=_..X_EXT_EPROM_BASE-_..X_EXT_EPROM_END
                   
                  /* External EEPROM */
                  -Z(DATA)NEAR_N=_..X_EXT_EEPROM_BASE-_..X_EXT_EEPROM_END
                   
                  /* Select reduced "printf" support to reduce library size.
                     See configuration section in manual concerning printf/sprintf. */
                   
                  /*Dlib*/
                  -e_PrintfSmall=_Printf
                   
                  /*Clib*/
                  -e_small_write=_formatted_write
                   
                  /*Dlib and Clib*/
                  -e_small_write_P=_formatted_write_P
                   
                  /* Disable floating-point support in "scanf" to reduce library size.
                     See configuration section in manual concerning scanf/sscanf */
                   
                  /*Dlib*/
                  -e_ScanfSmall=_Scanf
                   
                  /*Clib*/
                  -e_medium_read=_formatted_read
                   
                  /*Dlib and Clib*/
                  -e_medium_read_P=_formatted_read_P
                   
                  /* Suppress one warning which is not relevant for this processor */
                  -w29
                   
                  /* Code will now reside in file aout.a90 or aout.d90, unless -o is specified */
                  /* .d90 is the default if debug system is linked (option -r) */
                  /* .a90 is the default without debugging. Default format is -Fmotorola */
                  Цитата Matracc @
                  Выполняется участок ассемблерного кода с меткой ..

                  У меня точно такого результата не было, поэтому могу только предполагать. :huh:

                  я бы попробовал проверить - а не сбрасываются/устанавливаются
                  какие-либо "птички" в настройках среды автоматически, когда
                  меняется .xcl - файл ?

                  Разрешена ли внешняя память в настройках проекта ?
                  У AVR действительно возможна тупиковая ситуация, если стек смонтирован
                  на внешнюю память, а она запрещена.

                  Если поиски по документации не приведут к успеху, можно просто
                  поизучать - на чем циклится программа ? Что читает и чего ожидает ?
                  Выяснив, какой(ие) регистры старт-ап читает и какие биты ожидает
                  можно понять, что происходит.

                  Попробуй еще тут поспрашивать.
                  Сообщение отредактировано: ЫукпШ -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0266 ]   [ 15 queries used ]   [ Generated: 29.03.24, 08:44 GMT ]