Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Рзмер скомпиленного образа в переменную
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
elektronshik
Добрый день.
Вот пишу вторичный загрузчик LPC2368, возникла необходимость подставлять размер образа в код программы. Естественно заранее он не известен, но после линковки выводится в сообщении:
X bytes of readonly code memory
Y bytes of readonly data memory
Z bytes of readwrite data memory

Вот этими X Y Z надо инициализировать какие нибудь переменные в коде (получается, что уже после линковки).

В некоторых компиляторах это вроде работает (видел строки наподобие "U32 Size = Image$$ER_IROM$$RO$$Length"), а вот как в ИАР это сделать?
Сергей Борщ
Цитата(elektronshik @ Aug 14 2009, 10:02) *
В некоторых компиляторах это вроде работает (видел строки наподобие "U32 Size = Image$$ER_IROM$$RO$$Length"), а вот как в ИАР это сделать?
Скриптом линкера колдовать. Т.е. эту информацию может подставить линкер. У 4.хх через ключ -D, у более новых - не знаю.
zltigo
Цитата(elektronshik @ Aug 14 2009, 09:02) *
Вот пишу вторичный загрузчик LPC2368, возникла необходимость подставлять размер образа в код программы.

Для этого существуют фиктивные переменные типа RAMSTART, RAMEND.... и иже с ними - можете спросить их адрес smile.gif. Соответственно можете и свои сегменты-переменные создать, залинковать их куда хотите и пользоваться. Можете инфомацию о сегментах получить типа __segment_begin(). Документацию, короче, посмотреть.
P.S.
Вообще, почему каждый, кто решил написать загрузчик задает вопросы заново???
elektronshik
В общем получилось вычислить размер всех секций, но как их не складываю, с размером бинарика не сходится.

CSTACK 0x0 (0)
IRQ_STACK 0x200 (512)
SVC_STACK 0x200 (512)
.vectors 0x40 (64)
.cstartup 0xFC (252)
HEAP 0x1000 (4096)
.text 0x827C (33404)
.rodata 0x3287 (12935)
ICODE 0xE0 (224)
.iar.init_table 0x0 (0)
.bss 0x574 (1396)
.data 0x1B4 (436)
.iar.dynexit 0x300 (768)

В .map - файле:
33944 bytes of readonly code memory
13189 bytes of readonly data memory
7 721 bytes of readwrite data memory

33944 +13189 = 47133, а сам бинарик весит 47134 байт - то есть даже с .map расхождение.
Из каких же секций он складывается?
zltigo
Цитата(elektronshik @ Aug 20 2009, 09:48) *
Из каких же секций он складывается?

1.Секции располагаются в памяти соответствии с заданными Вами же требованиями по их выравниваю.
2.Ума не приложу, зачем нужно знать из размер, а не просто конечный результат.
elektronshik
Цитата(zltigo @ Aug 20 2009, 11:56) *
1.Секции располагаются в памяти соответствии с заданными Вами же требованиями по их выравниваю.
2.Ума не приложу, зачем нужно знать из размер, а не просто конечный результат.

И как же узнать конечный результат (я так понимаю, Вы имели ввиду размер бинарика)?
zltigo
Цитата(elektronshik @ Aug 20 2009, 10:41) *
И как же узнать конечный результат

Отвечал. Например, контрольную сумму положить в отдельный сегмент и прилинковать его последним - и конец, и сумма в одном флаконе smile.gif
Какие проблемы?
elektronshik
Цитата(zltigo @ Aug 20 2009, 13:22) *
Отвечал. Например, контрольную сумму положить в отдельный сегмент и прилинковать его последним - и конец, и сумма в одном флаконе smile.gif
Какие проблемы?

Спасибо, теперь понял!
elektronshik
И все равно не получается smile3046.gif: Пытаюсь разместить специально созданную секцию в самом конце, но при линковке выскакивает ругательство:

Tool Internal Error:
Internal Error: [CoreUtil/General]: Access violation (0xc0000005) at 00618DCA (reading from address 0x0)

Кажется это изза того, что ИАР пытается расположить обязательно в конце какие-то служебные данные.
Вот краткое содержание .map файла:
Код
"P1":  place in [from mem:0x0 to mem:0x7ffff] { ro section .vectors };
"P2":  place in [from mem:0x0 to mem:0x7ffff] { ro section .cstartup };
"P3":  place in [from mem:0x0 to mem:0x7ffff] { block _RO_ALL_ };
"P4":  place in [from mem:0x40000000 to mem:0x40007fff] {
          block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
          block UND_STACK, block ABT_STACK, block HEAP };
"P5":  place in [from mem:0x40000000 to mem:0x40007fff] { block _RW_ALL_ };

  Section              Kind        Address    Size  Object
  -------              ----        -------    ----  ------
"P1":                                         0x40
  .vectors                      0x00000000    0x40  <Block>
    .vectors           ro code  0x00000000    0x40  vectors.o [1]
                              - 0x00000040    0x40

"P2":                                         0xfc
  .cstartup                     0x00000040    0xfc  <Block>
    .cstartup          ro code  0x00000040    0xfc  cstartup.o [1]
                              - 0x0000013c    0xfc

"P3":                                       0xb6ee
  _RO_ALL_                      0x0000013c  0xb6ee  <Block>
    .iar.init_table    const    0x0000013c    0x2c  - Linker created -
    .rodata                     0x00000168  0x3287  <Block>
      ...........................................................................
...........
      .rodata          const    0x000033ee     0x1  xlocale_c.o [3]
    .text                       0x000033f0  0x8288  <Block>
      ...........................................................................
................
      .text            ro code  0x0000b590    0xe8  packbits_init2.o [4]
    ICODE                       0x0000b678    0xe0  <Block>
      ICODE            ro code  0x0000b678    0xe0  lowlevel.o [1]
    Initializer bytes  ro data  0x0000b758    0xd2  <for .data-1>
                              - 0x0000b82a  0xb6ee

Из него видно, что самой последней секцией конец которой я могу вычислить идет "ICODE", после него впихиваются некие "Initializer bytes"
Причем, если я в линкере пытаюсь разместить "ICODE" последней, вылетает вышеуказанная ошибка.

...Кажется "Initializer bytes" это на самом деле секция ".data_init", если её расположить последней, ошибок не возникает, но её конец (__section_end(".data_init")) почему то равен 0х4, хотя в map файле все правильно и её конец равен размеру образа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.