проблема функционирования программ для ко |
Ответить | Страница 12> |
Автор | |
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
Опубликовано: 18 Ноябрь 2005 15:45 |
В некоторых проектах, которые мы делали на контроллерах I-7188 (как правило, 256 кБ RAM, 512 кБ FLASH), мы столкнулись с ненадежным (даже сбойным!) функционированием программ, написанных под эти контроллеры в среде разработки TC++ 3.0(3.1). Причину проблемы до сих пор выявить не удалось, однако её суть вот в чем:
При определенных условиях (каких – неизвестно) возникает сбой в работе непрерывно работающей программы, записанной в контроллере, который проявляется в том, что значения переменных программы вдруг скачкообразно изменяются на произвольные. Соответственно, это приводит, как минимум, к таким последствиям, как останов программы и всего оборудования, которым она управляет. Это в лучшем случае, т.е. когда программа написана с использованием метода переменных состояния (при этом система переходит в дефолтное состояние, в котором все устройства выключаются). Наши предположения о причине проблемы были совершенно разнообразные: 1. Наши исходные коды несовершенны и дают утечки памяти (память выделяется, но не освобождается). Опровержение: один проект мы делали, вообще не используя динамическое выделение памяти. 2. Библиотеки для доступа к периферии контроллера дают утечки памяти. Опровержение: нет. Мы выяснили, что функции доступа к таймерам действительно дают утечки памяти, по каковой причине пришлось разработать свои и пользоваться ими. Насчет остальных функций – неизвестно. 3. Ненадежная защита цепей питания контроллера от помех. Опровержение: нет. Однако, мы выяснили, что в случае подключения длинного кабеля RS485 к оптонеизолированному порту COM1 контроллера появляются именно такие сбои программы (памяти), как описано выше (достаточно часто – раз в одну-две недели). Таким образом, действительная причина таких нам до сих пор неизвестна. Вопросы: 1. Какие требования к питанию данного контролера. 2. Какие требования к защите по COM портам. 3. В каких проектах и для каких задач использовались данные контролеры, с указанием примерных размеров программ. 4. Как отследить утечки памяти работающей программы? 5. Есть ли спецификация на ОС MiniOS7 (функции ОС на каком программном прерывании реализованы и т.п.) и где достать? Спасибо за ответы. |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 08 Сентябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 178 |
|
Прям как бальзам на раны. Оказывается, не у меня одного такая или аналогичная хрень происходит... |
|
SY,
EK |
|
Новичок Присоединился: 19 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 7 |
|
Приветствую.
Я в последнее время бьюсь над потерей данных при передачи между контроллером I-7188 и компьютером. Периодичность потери от 10 мин. до 10 часов. Теряются от нескольких символов до нескольких строк. Экспериментировал: - c разными контроллерами - не зависит; - с размими операционными системами - Разная реакция на операторы cout и printf; - с разными операторами вывода в порт (нет чёткого понимания их функционирования); - с разными компьютерами (оказывается есть зависимость); Приведу кусок программы и результат работы. Может кто даст совет? Пример программы printCom4("%02d:%02d:%02d:%03d fo_r[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fo_r[chout]); printCom4("%02d:%02d:%02d:%03d fr_r[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fr_r[chout]); printCom4("%02d:%02d:%02d:%03d tm_r[%d] %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, tm_r[chout]); printCom4("%02d:%02d:%02d:%03d df_r[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, df_r[chout]); printCom4("%02d:%02d:%02d:%03d fo[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fo[chout]); printCom4("%02d:%02d:%02d:%03d fr[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fr[chout]); printCom4("%02d:%02d:%02d:%03d tm[%d] %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, tm[chout]); printCom4("%02d:%02d:%02d:%03d df[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, df[chout]); printCom4("%02d:%02d:%02d:%03d foi_f[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, foi_f[chout]); printCom4("%02d:%02d:%02d:%03d fri_f[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fri_f[chout]); printCom4("%02d:%02d:%02d:%03d tmi_f[%d] %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, tmi_f[chout]); printCom4("%02d:%02d:%02d:%03d dfi_f[%d] %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, dfi_f[chout]); printCom4("%02d:%02d:%02d:%03d Kvi[%d] %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, Kv[chout]); printCom4("%02d:%02d:%02d:%03d CountKv[%d] %d\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, (int)CountKv[chout]); printCom4("%02d:%02d:%02d:%03d Ckv[%d] %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, Ckv[chout]); Результат работы 22:36:42:054 fo_r[1] 1788077 22:36:42:054 fr_r[1] 1752816 22:36:42:054 tm_r[1] 23.9375 22:36:42:054 df_r[1] 35261 22:36:42:054 fo[ 357615 22:36:42:054 fr[1] 350563 22:36:42:054 tm[1] 4.7875 22:36:42:054 df[1] 7052 22:36:42:054 foi_f[1] 35762 22:36:42:054 fri_f[1] 35056 22:36:42:054 tmi_f[1] 0.4787 22:36:42:054 dfi_f[1] 705 22:36:42:054 Kvi[1] -1.0872 22:36:42:054 CountKv[1] 1 22:36:42:054 Ckv[1] -3.2617 22:36:46:055 fo_r[2] 1764279 22:36:46:055 fr_r[2] 1728043 22:36:46:055 tm_r[2] 24.0000 22:36:46:055 df_r[2] 36236 22:36:46:055 fo[2] 352856 22:36:46:055 fr[2] 345609 22:36:46:055 tm[2] 4.8000 22:36:46:055 df[2] 7247 22:36:46:055 foi_f[2] 35286 22:36:46:055 fri_f[2] 34561 22:36:46:055 tmi_f[2] 0.4800 22:36:46:055 dfi_f[2] 725 22:36:46:055 Kvi[2] -1.6586 Числа начинаются с 35 позиции. При шрифте с равной шириной символов числа расположены в столбик. Потерялись данные в 5 строке. |
|
С уважением,
Инженер Евченко Сергей Евгеньевич. |
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Уточните, пожалуйста, куда производится вывод этих данных - не в консоль 7188.exe ? Если так, то под WinXP у меня половина данных теряется. Под Win2k вроде все нормально. Это также зависит от того, связь между контроллером и компьютером по RS232 или по RS485. |
|
Новичок Присоединился: 19 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 7 |
|
Да в консоль. Приём вёлся гипертерминалом под XP - теряется 0.1% - 1 раз в час.
При приёме гиппертерминалом по 98 - терялось до 5% - каждую мин. Но причём тут может быть операционная система. Она обязана работать правильно. Думаю глюки в программе контроллера I-7188. Интересно может оказывать влияние версия компилятора? Использую BC 3.1 |
|
С уважением,
Инженер Евченко Сергей Евгеньевич. |
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Операционная система работает правильно. Ваш контроллер - думаю тоже. Дело в программе 7188.exe и гипертерминале (на
мой взгляд). Вы пробовали написать собственную программу, которая бы занималась аналогичным приемом данных (для проверки)? Могу выслать исходники на C++ (WinAPI) для работы с COM-портом. Мы часто их применяем в своих проектах. |
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Вдогонку:
Вы пробовали смотреть данные, поступающие в порт, какой-нибудь программой мониторинга COM-порта (например, LGComSpy++ здесь)? Думаю, он вам поможет увидеть, что пропадает. Запускаете LGComSpy, выбираете нужный порт, запускаете гипертерминал. И смотрите, что он принимает. Просто у гипертерминала, по-моему, полно глюков при выводе принятой информации на экран. |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
Скажите - а для вас это принципиально - почему они теряются? Вы передаете "голые" данные по последовательному порту, без всякой проверки и подтверждения - так какие в этом случае могут быть претензии к потере отдельных байтов? Кто его знает, почему такое происходит! Может там помехи какие проскакивают, вот и все. Тут сам вопрос нужно ставить по другому - нужно реализовать нормальный протокол обмена, в простейшем случае типа Модбас - запрос-ответ с контрольной суммой в пакетах. |
|
Александр Бурмистров,
www.entels.ru |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
coreleft - Возвращает размер свободной оперативной памяти Назначение Возвращает размер свободной оперативной памяти. Замечания Функция coreleft возвращает размер свободной оперативной памяти. Она дает различные значения в зависимости от используемой модели памяти. Возвращаемое В малых моделях памяти coreleft возвращает значение объем свободной памяти между вершиной кучи и стеком, а в больших - объем памяти между самым верхним выделенным блоком и концом доступной памяти. ----------------------------------------------------------------- farcoreleft - Возвpащает размер свободной памяти в куче с дальней адpесацией |
|
Александр Бурмистров,
www.entels.ru |
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Спасибо. Попробую все-таки отследить, что же там
происходит с программой. |
|
Ответить | Страница 12> |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |