Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-авг-15 04:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 2018-мар-17 19:33 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
TCP/IP стек LwIP при компиляции для микроконтроллеров 1986ВЕ9х занимает примерно 65 КБайт.
В наличии для Keil5 для 1986ВЕ9х: проект номер 1 - bootloader на базе LwIP, проект номер 2 - программа связи с компьютером на базе LwIP. В итоге overhead 128 Кбайт.
Идея - выделить LwIP в отдельный проект c компиляцией в файл .lib с размещением в кокретный адрес флеш и вызовом необходимых функций из двух первоначальных проектов. Попытка это сделать показала, что LwIP использует стандартную библиотеку Си (cpp.lib) + в первоначальных проектах линкером вырезаются ненужные функции - всё это приводит к ошибкам размещения кода по адресам памяти и полному краху при переходах между проетками. Как реализовать данную задачу? У кого-нибудь есть идеи? ...пока копаю в сторону
http://www.keil.com/support/man/docs/uv ... _adsld.htm
Цитата:
Make RW Sections Position Independent
When enabled, the variable region containing the RW and ZI output sections are position-independent. When disabled, the RW and ZI sections are located to absolute memory addresses. Generates the linker command-line option --rwpi.
Make RO Sections Position Independent
When enabled, the constant and code region containing the RO output section is position-independent. When disabled, the RO section is located to an absolute memory address. Generates the linker command-line option --ropi.

https://community.arm.com/tools/b/blog/ ... compiler-6

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-мар-17 21:24 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 73
А не пробовали в настройках проекта включить опцию Use MicroLIB? По идее, вместо стандартной библиотеки подцепится максимально усеченная. Идея в том, что линкер, быть может, ничего из MicroLIB не выкинет.
Выдержка из Keil-ого хелпа: "Use MicroLIB to change the C run-time library set for smallest code application code. MicroLIB is not fully ANSI compatible but sufficient for most small embedded applications."


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-мар-18 14:25 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Включить можно, но кроме этого:
допустим есть .lib файл задержек: сначала функция us, потом ms, потом s. Проект 1 вызывает функцию s, проект 2 вызывает функцию us, из-за того что, ms не вызывается, линкер её выкинет, и в проекте 1 будут глюки, так как произойдёт смещение по коду, т.е. вопрос в том, чтобы линкер подшивал полностью весь код бибилиотеки - пробовал ключ линкера --keep *.lib - не помогает, --no remove вроде тоже - секция кода с ms всё равно выкидывается...

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-мар-18 16:20 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 73
А попробуйте посмотреть в map-файле, в каком именно объектном (*.o) файле располагаются требуемые функции. И именно для этого файла примените ключ --keep.
Но меня смущает другое. Пусть есть два проекта: P1, начинающийся с адреса 0x08000000, и P2 - с адреса 0x08008000. По адресу 0x80018000 в обоих проектах размещена секция кода F с некоторым набором функций. Все функции в F размещены по одинаковым адресам как для P1, так и для P2. Зальем сначала проект P2, а затем P1. В самом начале P1 до входа в main() предусмотрим условие перехода на P2.
Что получаем. Из какового бы проекта мы не обратились к функциям секции F, все равно эти функции будут в свою очередь вызывать стандартные функции только проекта P1. Эти функции по-любому будут реализованы и находиться будут в диапазоне адресов 0x08000000 ... 0x08008000.
Опасность же будет в том, что при обращении из проекта P2 могут возникнуть проблемы с распределением памяти функций из F и вызываемых ими стандартных функций из P1. Если эти функции работают с глобальными переменными, то эти переменные будут лежать по разным адресам для проектов P1 и P2. Вот тут-то все и рухнет. Тоже самое будет, если в функциях из F и вызываемых ими стандартных функциях используется динамическое распределение памяти.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-мар-18 16:40 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Чёт я ошибся, давно экспериментировал, сейчас проверил для примера проекта с задержками --keep *.o (--no_remove) работает =)) ... ща буду курить, что всё-таки с LwIP творится ...
Насчёт до main () - немного не понял, что касается общих функций в F, то, например scatter-файл проекта 1:
Код:
LR_ROM_PRJ1_BOOT 0x08000000 0x00001000  {    ; load region size_region
  ER_ROM_PRJ1_BOOT 0x08000000 0x00001000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM_PRJ1_BOOT 0x20000000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
LR_ROM_LIBS 0x08001000 0x00001000  {    ; load region size_region
  ER_ROM_LIBS 0x08001000 0x00001000  {  ; load address = execution address
   delay.o (+RO)
    port.o (+RO)
  }
}

для проекта 2:
Код:
LR_ROM_PRJ1_BOOT 0x08000000 0x00001000  {    ; load region size_region
  ER_ROM_PRJ1_BOOT 0x08000000 0x00001000  {  ; load address = execution address
   boot.o (+RO)
  }
}

LR_ROM_LIBS 0x08001000 0x00001000  {    ; load region size_region
  ER_ROM_LIBS 0x08001000 0x00001000  {  ; load address = execution address
   delay.o (+RO)
    port.o (+RO)
  }
}

LR_ROM_PRJ2_MAIN 0x08002000 0x0001E000  {    ; load region size_region
  ER_ROM_PRJ2_MAIN 0x08002000 0x0001E000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM_PRJ2_MAIN 0x20000000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

в boot.s - кусок 1 проекта без библиотек
Код:
AREA boot, CODE, READONLY
      INCBIN   ..\..\prj1\Objects\bin\ER_ROM_PRJ1_BOOT
   END

В обоих проектах подшиты библиотеки из общей папки delay.lib (содержит delay.o) и port.lib (содержит port.o), глобальных переменных там нет - для них я так понимаю нада вырезать кусок RAM c ключами delay.o (+RW +ZI), port (+RW +ZI)...попробую кстати с переменными тоже...возможно в LwIP как раз с этим проблемы наверное, потому что там глобальные перемнные и heap используется (я только сейчас до этого додумался тоже), а основная проблема как раз как затолкать в два независимых проекта стандартную библиотеку, потому что компилятор к ней много чего сам дописывает - у меня два проекта частично с LwIP работали, только в некоторых точках программы был отвал...

Я так понимаю, главное правильно нарезать куски колбасы в scatter и следить за символьными именами в объектных файлах ...)))

Update: протестировал случаи с RAM):
1) если обе переменные (k) глобальные, то линкер выдаёт ошибку multiple defined.
2) если обе переменные (k) static, то в таблице символов
Код:
Image Symbol Table
    Local Symbols
    Symbol Name                              Value     Ov Type        Size  Object(Section)
k                                        0x20000004   Data           4  main.o(.data)
    .data                                    0x20000008   Section        4  system_mdr32f9qx.o(.data)
    .data                                    0x2000000c   Section        4  delay.o(.data)
    k                                        0x2000000c   Data           4  delay.o(.data)

3) если одна глобальная, другая static, то
Код:
Image Symbol Table

    Local Symbols
    Symbol Name                              Value     Ov Type        Size  Object(Section)
.data                                    0x2000000c   Section        4  delay.o(.data)
    k                                        0x2000000c   Data           4  delay.o(.data)

Global Symbols
    Symbol Name                              Value     Ov Type        Size  Object(Section)
k                                        0x20000004   Data           4  main.o(.data)

4)
Цитата:
Если эти функции работают с глобальными переменными, то эти переменные будут лежать по разным адресам для проектов P1 и P2. Вот тут-то все и рухнет.

если в delay.h написать например extern unsigned int k; , а в delay.c unsigned int k; , то в prj1.map
Код:
  Global Symbols
    Symbol Name                              Value     Ov Type        Size  Object(Section)
k                                        0x20000008   Data           4  delay.o(.data)

а в prj2.map
Код:
  Global Symbols
    Symbol Name                              Value     Ov Type        Size  Object(Section)
k                                        0x20000004   Data           4  delay.o(.data)

...hack-tool конечно, но весь проект собирается на этапе сборки проекта 2 и на этом же этапе происходит разрешение символьных имён (подшивается delay.o c переменной k, для этого и нужен boot.s)....если кто научит делать правильно, WELCOME =)))

...так что, линкер не обманешь...

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-мар-18 18:20 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 73
Стоп, стоп. Вы оба проекта совместно собираете?
Я-то думал вы независимо друг от друга собираете два разных проекта, каждый из которых пытаетесь подружить с общей библиотекой, а потом по очереди заливаете их. Именно так обычно и делаю (до трех проектов в одном камне), только общих библиотек никогда не использовал. Если проекты собираются независимо друг от друга, то и линкер, естественно, не будет ругаться о совпадении имен глобальных переменных. Если интересны подробности такой технологии, могу рассказать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-мар-18 19:09 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Типо того, проект bootloader компилируется и заливается только для целей отладки на первоначальном этапе. Когда он отлажен, создаётся основной проект, к которому через scatter файл подшивается ассемблерный файл с инструкцией INCBIN, подключающей по относительному пути бинарник bootloader и в итоге заливается весь hex: bootloader + основной. При этом можно что-то поменять в основной программе, перекомпилировать и залить только основную часть основного проекта уже через прошитый bootloader.
...В одном проекте я тоже объединял до пяти проектов....

Тут прочитал другую интересную вещь http://www.keil.com/support/man/docs/uv ... odules.htm:
This can be useful, for instance, when generating a boot portion of an application containing generic routines that are used from program parts which are reloaded later. Может вообще сделать весь bootloader в виде библиотеки, тогда точно проблем не будет :? :?:

Можно ещё попробовать сделать multitarget-проект, но я пока не понял логику его создания + считается, что bootloader и основной делаются как бы отдельно (кроме запуска PLL и общей настройки) и bootloader - чистый бинарник.

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB