5510\TCP Нехватка памяти RAM в BC3.1 |
Ответить |
Автор | |
Участник Присоединился: 13 Май 2005 Online Status: Offline Публикации: 61 |
Опубликовано: 15 Декабрь 2011 23:24 |
Столкнулся с проблеммой нехватки ОЗУ при запуске программы, при добавлении нового функционала к текщему проекту. Задача заключается в том, что необходимо к собственно написанной программе на С++ добавить поддержку сокетов, для этого перед запуском моей управляющей программы должны резидентно загружаться драйверы AX8796 и socketp, и после загрузки последнего в системе из 204КБ остается 140КБ (c:\mem.exe), и при запуске управляющей программы получаю вылет с сообщением "Not enough memory". Мои предполагаемые решения: 1) Увеличение памяти: В описании не сказано что ОЗУ всего лишь 256Кб: "640KB SRAM 2) Найти аналог менее прожерливого socketp Datalight 3) Оптимизировать собственную программу: Все возможности ВС3.1 уже исчерпаны, использую Medium model. Использовать другой компилятор? Как еще можно оптимизировать программу на требование к свободному ОЗУ? Заметил что даже функции без внутренних переменных тоже съедают память, (определяю методом new[] в цикле до неудачи). 4) Обойтись без библиотек Advantech - именно они съедают большую часть памяти. Прикрутить либы от small в проект Medium неудается. В итоге получается что декларируется функционал а на деле использовать это вместе сложно, какие есть идеи? Спасибо. |
|
Участник Присоединился: 02 Декабрь 2010 Online Status: Offline Публикации: 68 |
|
Когда я де компилировал библиотеку от Advantech то обнаружил что много лиших незадействованных функций, складывается впечатления что Advantech в 1 модуль запихнула все ненужные версии своих функций которые и добавляются в ваш проект. Мой вывод недостаточно продуманная декомпозиция библиотек. В этой ветки обсуждали эту проблему http://forum.cta.ru/forum_posts.asp?TID=3843&PN=3
если вы в программе используете библиотеку для работы с последовательным портом, вы можете использовать мою библиотеку, она горазда меньше чем оригинал. |
|
Участник Присоединился: 09 Октябрь 2011 Online Status: Offline Публикации: 45 |
|
Дело в том, что у Advantech это вообще не библиотека, так как это понимается в программировании. Они просто всю массу подпрограмм скомпилировали, как единый объектный модуль, и обработали его библиотекарем.В итоге, достаточно из библиотеки использовать самую малость, буквально из трех команд, например ввод из порта - и в результате в вашу программу лепится линкером весь объем библиотеки с совершенно ненужными в вашем конкретном проекте функциями. Мои долгие и безуспешные попытки объяснить их программистам, что такое библиотека, и как ее создают, где-то году в 1999-м ни к чему хорошему не привели. Как все это фуфло делалось - так и делается, судя по всему, по сей день. А выкручивался я в свое время, декомпилировав их библиотеку и написав на основе этого собственные библиотеки. Исходники из них выдавить, для того, чтобы сделать ДЛЯ НИХ ЖЕ (ну и себя естественно) нормальную библиотеку - так и не удалось. Ноу-хау....
|
|
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|
Ну так исходники то остались? Если да - то можно скинуться всеми наработками и запостить на google code и т.п. Можно и твои наработки и отсюда: http://forum.cta.ru/forum_posts.asp?TID=4142 , как предлагает poison взять. Тем более, у poison есть еще исходники сокетов ;) (выдаю тайну). Так что можно в общий доступ на общественных началах замутить. Как минимум, исходники последовательных портов и сокетов, думаю, он не против выложить. А остальное - это уже кто нить еще посодействует. Кто ЗА? У кого что есть? |
|
Участник Присоединился: 13 Май 2005 Online Status: Offline Публикации: 61 |
|
Целиком и полностью ЗА, вот только обмен по СОМ можно сделать и без библиотек, благо UART стандартный, а вот как быть с аналоговым вводом выводом и т.п. как работать с их внутренней шиной куда цепляются модули это закрытая информация или чтото можно узнать? Как например реализовать Get5017H()? И по поводу пункта 3), почемуто программе не хватает 140КБ, хотя больших объектов не создаю, может дело еще в компиляторе или в его настройках? еще не удается подцепить TASM для опции "Compile via assembler" может тоже поможет. |
|
Участник Присоединился: 09 Октябрь 2011 Online Status: Offline Публикации: 45 |
|
Я же уже пояснил, почему.... Когда начал с ними работать, меня сразу возмутило и насторожило, что пока я просто побаловался, подбирая наилучший вариант С - объемы программ были в пределах 15-20 кБ. А потом я решил проверить дискретный ввод. Вставляю опрос из "библиотеки" - и объемсразу, сколь помню, более 130 кб. Причина - это НЕ библиотека, а собственно одна подпрограмма, объектный модуль, только со множеством входных точек, но никак не библиотека. Такой туфты не сделал-бы даже начинающий программист, который работал с ассемблером. Вот после этого и начались выяснения, разборки и пр. со "спецами" из Advantech.
Что касается исходников - посмотрю, может и сохранились, кажется я делал копии на CD. Давно это было, как никак 12 лет прошло, три места работы сменилось. Если есть - выложу, жалко нету.... |
|
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|
vladi33 >> Целиком и полностью ЗА, вот только обмен по СОМ можно сделать и без библиотек, благо>> UART стандартный,
Ну, не совсем стандартный. Но все-равно без библиотеки тяжело. vladi33 >> а вот как быть с аналоговым вводом выводом и т.п. как работать с их внутренней шиной >> куда цепляются модули это закрытая информация или чтото можно узнать? Ну нужно дизассемблировать. Знаю точно, что для модулей I/O в адресном простанстве ПЛК имеется набор регистров (портов) с определенными адресами. Т.е. точнее, для каждого слота зарезервирован набор портов (по три штуки вроде, если не изменяет память.) Если модули высокоскоростные - то чтение/запись осуществляется напрямую через эти порты (по крайней мере для DI/DO) Если модули низкоскоростные (например AI) - то там используется хитрый протокол обмена, через внутренний UART (дада, именно на нем сидят такие модули) . Протокол текстовый, напоминает DCON, а может он и есть. Обмен также происходит через эти порты в адресном пространстве, только как бы через UART. vladi33 >> Как например реализовать Get5017H()? Вот тут через внутренний UART вроде рбмен идет между модулем и ПЛК. В принципе, код для пары модулей DO/DI, а также наброски обмена через локальный UART имеются у poison. Надо его просить куда нить выложить всё это, а я смогу на гуглокод перекинуть. При условии, что у людей будет желание открыто развивать эти библиотечки. Я на данный момент могу помочь только с гуглокодом. Помогать тестировать и т.п. у меня нет возможности теперь. Может быть нужно создать отдельную тему с наработками и набрать голоса заинтересованных людей, готовых принять участие в проекте "реверс инжиниринга" :) А иначе ИМХО, если будет мало людей (и все бутут только халявщиками) - то смысла не вижу что-то выкладывать. Путь каждый пилит втихаря сам. Alexander_I >> Если есть - выложу, жалко нету.... А ты все-таки получше поищи ;) |
|
Участник Присоединился: 02 Декабрь 2010 Online Status: Offline Публикации: 68 |
|
Доброго времени суток!
Создал открытый проект на code.google. Для меня опыт открытия проекта на code.google впервые, так что если что-то нужно поправить пишите в личку. Ccылка на проект тут Модули: mio - работа с модулем ввода вывода nio - работа с сетью TCP/IP sio - работа с последовательными портами |
|
Участник Присоединился: 13 Май 2005 Online Status: Offline Публикации: 61 |
|
Большое спасибо poison и всем тем, кто хочет сдвинуть эту проблемму с места. Частичным решением может быть еще использование "старых" библиотек 2003 года, там не все модули поддерживаются, но ресурсов съедают меньше. Пока выкручиваюсь данным способом. Данную тему можно закрыть, см. "Собственная библиотека для ADAM 5510" http://forum.cta.ru/forum_posts.asp?TID=4142 |
|
Участник Присоединился: 13 Май 2005 Online Status: Offline Публикации: 61 |
|
Повторно поднимаю данную тему, опять уперся в нехватку SRAM.
Эта проблема была частично решена с помощью Set_NVRAM_Size(256k) т.е. перераспределением NVRAM в пользу RAM, но NVRAM где храню архивы тоже нельзя уменьшать. Проблема в том что библиотеки Адама берут столько памяти, что под разработку остается примерно четверть (взято сторонними библиотеками 201KB из 342KB) и приходится оптимизировать код который не помещается, ужимаясь постоянно! Есть вопросы, может кто знает: 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. Может есть какие идеи?
|
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |