Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

5510\TCP Нехватка памяти RAM в BC3.1

 Ответить Ответить
Автор
Сообщение
vladi33 Смотреть выпадающим
Участник
Участник


Присоединился: 13 Май 2005
Online Status: Offline
Публикации: 61
Свойства публикации Свойства публикации   Ответить, цитируя автора - vladi33 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: 5510\TCP Нехватка памяти RAM в BC3.1
    Опубликовано: 15 Декабрь 2011 23:24

Столкнулся с проблеммой нехватки ОЗУ при запуске программы, при добавлении нового функционала к текщему проекту. Задача заключается в том, что необходимо к собственно написанной программе на С++ добавить поддержку сокетов, для этого перед запуском моей управляющей программы должны резидентно загружаться драйверы AX8796 и socketp, и после загрузки последнего в системе из 204КБ остается 140КБ (c:\mem.exe), и при запуске управляющей программы получаю вылет с сообщением "Not enough memory".

Мои предполагаемые решения:

1) Увеличение памяти: В описании не сказано что ОЗУ всего лишь 256Кб: "640KB SRAM
- up to 384KB with battery backup (Accessed byFunction LIB)" (640-384=256), может можно ее увеличить (XMS напрмер, настройки DOS)?

2) Найти аналог менее прожерливого socketp Datalight

3) Оптимизировать собственную программу: Все возможности ВС3.1 уже исчерпаны, использую Medium model. Использовать другой компилятор? Как еще можно оптимизировать программу на требование к свободному ОЗУ? Заметил что даже функции без внутренних переменных тоже съедают память, (определяю методом new[] в цикле до неудачи).

4) Обойтись без библиотек Advantech - именно они съедают большую часть памяти. Прикрутить либы от small в проект Medium неудается.

В итоге получается что декларируется функционал а на деле использовать это вместе сложно, какие есть идеи? Спасибо.



Наверх
poison Смотреть выпадающим
Участник
Участник
Аватар

Присоединился: 02 Декабрь 2010
Online Status: Offline
Публикации: 68
Свойства публикации Свойства публикации   Ответить, цитируя автора - poison Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Декабрь 2011 14:46
Когда я де компилировал библиотеку от Advantech то обнаружил что много лиших незадействованных функций, складывается впечатления что Advantech в 1 модуль запихнула все ненужные версии своих функций которые и добавляются в ваш проект. Мой вывод недостаточно продуманная декомпозиция библиотек. В этой ветки обсуждали эту проблему http://forum.cta.ru/forum_posts.asp?TID=3843&PN=3
если вы в программе используете библиотеку для работы с последовательным портом, вы можете использовать мою библиотеку, она горазда меньше чем оригинал.
Наверх
Alexander_I Смотреть выпадающим
Участник
Участник


Присоединился: 09 Октябрь 2011
Online Status: Offline
Публикации: 45
Свойства публикации Свойства публикации   Ответить, цитируя автора - Alexander_I Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Декабрь 2011 17:31
Дело в том, что у Advantech это вообще не библиотека, так как это понимается в программировании. Они просто всю массу подпрограмм скомпилировали, как единый объектный модуль, и обработали его библиотекарем.В итоге, достаточно из библиотеки использовать самую малость, буквально из трех команд, например ввод из порта - и в результате в вашу программу лепится линкером весь объем библиотеки с совершенно ненужными в вашем конкретном проекте функциями. Мои долгие и безуспешные попытки объяснить их программистам, что такое библиотека, и как ее создают, где-то году в 1999-м ни к чему хорошему не привели. Как все это фуфло делалось - так и делается, судя по всему, по сей день. А выкручивался я в свое время, декомпилировав их библиотеку и написав на основе этого собственные библиотеки. Исходники из них выдавить, для того, чтобы сделать ДЛЯ НИХ ЖЕ (ну и себя естественно) нормальную библиотеку - так и не удалось. Ноу-хау....
Наверх
kuzulis Смотреть выпадающим
Участник
Участник


Присоединился: 04 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - kuzulis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Декабрь 2011 17:50

А выкручивался я в свое время, декомпилировав их библиотеку и написав на основе этого собственные библиотеки.

Ну так исходники то остались?

Если да - то можно скинуться всеми наработками и запостить на google code и т.п.

Можно и твои наработки и отсюда: http://forum.cta.ru/forum_posts.asp?TID=4142 ,
как предлагает poison взять.
Тем более, у poison есть еще исходники сокетов ;) (выдаю тайну).

Так что можно в общий доступ на общественных началах замутить.
Как минимум, исходники последовательных портов и сокетов, думаю, он не против выложить.
А остальное - это уже кто нить еще посодействует.

Кто ЗА? У кого что есть?
Наверх
vladi33 Смотреть выпадающим
Участник
Участник


Присоединился: 13 Май 2005
Online Status: Offline
Публикации: 61
Свойства публикации Свойства публикации   Ответить, цитируя автора - vladi33 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Декабрь 2011 18:39

Целиком и полностью ЗА, вот только обмен по СОМ можно сделать и без библиотек, благо UART стандартный, а вот как быть с аналоговым вводом выводом и т.п. как работать с их внутренней шиной куда цепляются модули это закрытая информация или чтото можно узнать?

Как например реализовать Get5017H()?

И по поводу пункта 3), почемуто программе не хватает 140КБ, хотя больших объектов не создаю, может дело еще в компиляторе или в его настройках? еще не удается подцепить TASM для опции "Compile via assembler" может тоже поможет.

Наверх
Alexander_I Смотреть выпадающим
Участник
Участник


Присоединился: 09 Октябрь 2011
Online Status: Offline
Публикации: 45
Свойства публикации Свойства публикации   Ответить, цитируя автора - Alexander_I Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Декабрь 2011 21:07
Я же уже пояснил, почему.... Когда начал с ними работать, меня сразу возмутило и насторожило, что пока я просто побаловался, подбирая наилучший вариант С - объемы программ были в пределах 15-20 кБ. А потом я решил проверить дискретный ввод. Вставляю опрос из "библиотеки" - и объемсразу, сколь помню, более 130 кб. Причина - это НЕ библиотека, а собственно одна подпрограмма, объектный модуль, только со множеством входных точек, но никак не библиотека. Такой туфты не сделал-бы даже начинающий программист, который работал с ассемблером. Вот после этого и начались выяснения, разборки и пр. со "спецами" из Advantech.
Что касается исходников - посмотрю, может и сохранились, кажется я делал копии на CD. Давно это было, как никак 12 лет прошло, три места работы сменилось. Если есть - выложу, жалко нету....
Наверх
kuzulis Смотреть выпадающим
Участник
Участник


Присоединился: 04 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - kuzulis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Декабрь 2011 22:09
vladi33
>> Целиком и полностью ЗА, вот только обмен по СОМ можно сделать и без библиотек, благо
>> UART стандартный,

Ну, не совсем стандартный. Но все-равно без библиотеки тяжело.

vladi33
>> а вот как быть с аналоговым вводом выводом и т.п. как работать с их внутренней шиной 
>> куда цепляются модули это закрытая информация или чтото можно узнать?

Ну нужно дизассемблировать. Знаю точно, что для модулей I/O
в адресном простанстве ПЛК имеется набор регистров (портов) с определенными адресами.
Т.е. точнее, для каждого слота зарезервирован набор портов (по три штуки вроде, если не изменяет память.)

Если модули высокоскоростные - то чтение/запись осуществляется напрямую через эти порты (по крайней мере для DI/DO)

Если модули низкоскоростные (например AI) - то там используется хитрый протокол обмена,
через внутренний UART (дада, именно на нем сидят такие модули) .
Протокол текстовый, напоминает DCON, а может он и есть.
Обмен также происходит через эти порты в адресном пространстве, только как бы через UART.

vladi33
>> Как например реализовать Get5017H()?

Вот тут через внутренний UART вроде рбмен идет между модулем и ПЛК.


В принципе, код для пары модулей DO/DI, а также наброски обмена через локальный UART
имеются у poison. 
Надо его просить куда нить выложить всё это, а я смогу на гуглокод перекинуть.

При условии, что у людей будет желание открыто развивать эти библиотечки.
Я на данный момент могу помочь только с гуглокодом.
Помогать тестировать и т.п. у меня нет возможности теперь.

Может быть нужно создать отдельную тему с наработками и набрать голоса
заинтересованных людей, готовых принять участие в проекте "реверс инжиниринга" :)

А иначе ИМХО, если будет мало людей (и все бутут только халявщиками) - то смысла не вижу
что-то выкладывать. Путь каждый пилит втихаря сам. 

Alexander_I
>> Если есть - выложу, жалко нету....

А ты все-таки получше поищи ;)

Наверх
poison Смотреть выпадающим
Участник
Участник
Аватар

Присоединился: 02 Декабрь 2010
Online Status: Offline
Публикации: 68
Свойства публикации Свойства публикации   Ответить, цитируя автора - poison Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Декабрь 2011 14:34
Доброго времени суток!
Создал открытый проект на code.google.
Для меня опыт открытия проекта на code.google впервые, так что если что-то нужно поправить пишите в личку.
Ccылка на проект тут
Модули:
mio - работа с модулем ввода вывода
nio - работа с сетью TCP/IP
sio - работа с последовательными портами
Наверх
vladi33 Смотреть выпадающим
Участник
Участник


Присоединился: 13 Май 2005
Online Status: Offline
Публикации: 61
Свойства публикации Свойства публикации   Ответить, цитируя автора - vladi33 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 22 Декабрь 2011 13:46

Большое спасибо poison и всем тем, кто хочет сдвинуть эту проблемму с места. Частичным решением может быть еще использование "старых" библиотек 2003 года, там не все модули поддерживаются, но ресурсов съедают меньше. Пока выкручиваюсь данным способом.

Данную тему можно закрыть, см. "Собственная библиотека для ADAM 5510" http://forum.cta.ru/forum_posts.asp?TID=4142

Наверх
vladi33 Смотреть выпадающим
Участник
Участник


Присоединился: 13 Май 2005
Online Status: Offline
Публикации: 61
Свойства публикации Свойства публикации   Ответить, цитируя автора - vladi33 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 11 Июль 2014 15:01
Повторно поднимаю данную тему, опять уперся в нехватку SRAM.

Эта проблема была частично решена с помощью Set_NVRAM_Size(256k) т.е. перераспределением NVRAM в пользу RAM, но NVRAM где храню архивы тоже нельзя уменьшать.
Проблема в том что библиотеки Адама берут столько памяти, что под разработку остается примерно четверть (взято сторонними библиотеками 201KB из 342KB) и приходится оптимизировать код который не помещается, ужимаясь постоянно!Cry

Есть вопросы, может кто знает:
1. Почему NVRAM располагается в том же адресном пространстве 640КБ (Conventional memory)?
2. Возможно ли использовать компилятор более оптимально использующий RAM кроме BC3.1 ?
3. Появились ли исходники или Open Source библиотек, обсуждалось здесь http://forum.cta.ru/forum_posts.asp?TID=4142
4. Компилятор резервирует RAM даже для кода который не использует переменных статических и динамических, а также для локальных объектов которые не создаются, а просто декларируются, замечаю линейную зависимость между объемом кода и потребностью в RAM.


Остатки памяти после загрузки драйверов TCP (socketp.exe):
D:\>mem
ROM-DOS MEM v6.22 (Revision 4.11.1417)
Copyright (c) 1989-2002 Datalight, Inc.

Memory Type        Total  =   Used  +   Free
----------------  -------   -------   -------
Conventional         384K      132K      252K
Upper                  0K        0K        0K
Adapter RAM/ROM      640K      640K        0K
Extended (XMS)    34,304K        0K   34,304K
----------------  -------   -------   -------
Total memory      35,328K      772K   34,556K

Total under 1 MB     384K      132K      252K

Largest executable program size       252K (257,552 bytes)
Largest free upper memory block         0K       (0 bytes)
ROM-DOS is resident in the ROM.

Может есть какие идеи?
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz