Вверх ↑
Этот топик читают: Гость
Ответов: 205
Рейтинг: 44
#1: 2013-02-02 22:30:41 ЛС | профиль | цитата
Пишу (рисую) программу – осциллограф. Ни как не получается решить проблему утечки памяти! Программа в процессе работы постепенно съедает оперативную память вплоть до зависания программы!

Принцип работы:

1. отправляем (через com порт) контроллеру команду – выдать массив данных
2. принимаем массив (512 byte) в буфер
3. очищаем график и rx буфер com порта
4. выводим содержимое буфера на график
5. очищаем буфер
6. все с начало…

Где тут может расходоваться память?

Схема
карма: 0

0
Ответов: 8948
Рейтинг: 824
#2: 2013-02-02 23:02:31 ЛС | профиль | цитата
wss60, к схеме ещё бы и Ваш контроллер Пустая не "жрёт" память
карма: 19

0
Ответов: 205
Рейтинг: 44
#3: 2013-02-02 23:12:46 ЛС | профиль | цитата
Могу только схему с прошивками скинуть
Если пункт 6 выполнять в ручную (кнопкой например) то “утечки” нет!
Все буфера очищаются - куда память девается? Второй день ни как не разберусь…

карма: 0

0
Ответов: 8948
Рейтинг: 824
#4: 2013-02-02 23:26:45 ЛС | профиль | цитата
wss60, Какая может быть "утечка" Скорость порта выставлена 50 это 5 байт в секунду! Ваши 512 байт (по одному! байту) -- 100 секунд Включил иммитацию (см рис), утечки нет, может не так понял?
Один_Байт.jpg
карма: 19

0
файлы: 1Один_Байт.jpg [36.7KB] [418]
Ответов: 205
Рейтинг: 44
#5: 2013-02-03 00:06:37 ЛС | профиль | цитата
Скорость порта 230400! Это приблизительно 20945 байт в секунду, если я правильно посчитал!
Вот схема с эмулятором контроллера:
скачать
Так же съедает память и виснет через 5..10 секунд
карма: 0

0
Ответов: 8948
Рейтинг: 824
#6: 2013-02-03 00:42:43 ЛС | профиль | цитата
wss60 писал(а):
Скорость порта 230400
Ой, у меня крайняя цифра 115200, поэтому и установился на 50! А где же найти такую замечательную скорость? На старом компьютере с двумя СОМ проводил эксперемент по передаче звука на 8 кГц и 8 бит дискретности, на 115200 бывали пропуски!
карма: 19

0
Ответов: 205
Рейтинг: 44
#7: 2013-02-03 01:10:38 ЛС | профиль | цитата
У меня на встроенном порту тоже 115200.
Контролер подключен через переходник usb – rs232, пропусков нет. Пробовал поднять до 460800 – идет с кучей ошибок…

Похоже, победил утечку памяти!!!
Проблема в элементе “Repeat” – после каждого остановки/запуска съедал ~10kByte!?
Если его не останавливать то все нормально – странно…
карма: 0

0
Ответов: 8948
Рейтинг: 824
#8: 2013-02-03 01:47:36 ЛС | профиль | цитата
wss60, нет, проблема в скорости отрисовки -- не успевает А цикл Repeat -- я так и не понял, зачем вообще он нужен, да ещё в моде NULL=NULL
карма: 19

0
Ответов: 205
Рейтинг: 44
#9: 2013-02-03 09:50:14 ЛС | профиль | цитата
Леонид, должно успевать! Т.к. программа ждет пока не выведется график.
Repeat – цикл, который бесконечно читает(максимально быстро) данные из порта.
По какому принципу должна работать подобная программа...

карма: 0

0
Ответов: 8948
Рейтинг: 824
#10: 2013-02-03 15:52:18 ЛС | профиль | цитата
wss60, ещё тормозит чтение по одному байту, вот схемка:
code_30241.txt
Читает, собака, 50--60 раз/сек Обратите внимание на схемку накопления и вывода 512 тчк.
------------ Дoбавленo в 15.30:
wss60, не удержался, на IC сделал обработку строки по 256 из СОМ

Add(MainForm,10623790,196,140)
{
Width=619
Height=324
BorderStyle=1
link(onCreate,474771:doEvent1,[])
}
Add(COM,6353273,273,175)
{
BaudRate=19
TimeOut=1
link(onRead,2111790:doRecData,[])
}
Add(DoData,5233936,224,238)
{
Data=Integer(256)
link(onEventData,6353273:doRead,[(264,244)(264,209)])
}
Add(Thread,10878508,133,238)
{
Delay=0
link(onExec,5233936:doData,[])
}
Add(Button,14315189,35,217)
{
Left=20
Top=20
Caption=">>"
link(onClick,5035321:doEvent1,[])
}
Add(Button,16120133,35,252)
{
Left=20
Top=70
Caption="II"
link(onClick,6175985:doEvent1,[])
}
Add(PlotLines,2037800,392,182)
{
Grapher="MyDevice"
Point(ValuesX)
link(ValueX,5265381:Value,[])
}
Add(Plotter,6283154,392,98)
{
Left=135
Top=10
Width=465
Height=270
Color=12639424
Name="MyDevice"
GridX=16
GridY=16
MinH=-128
MaxH=128
}
Add(MultiElement,15592299,133,189)
{
@Hint=#34:Формирование строки (Sin) 256 байт|
link(onEvent1,4811701:doEvent1,[])
}
BEGIN_SDK
Add(EditMulti,3044716,21,21)
{
EventCount=1
WorkCount=2
Width=426
Height=144
link(doWork1,5126659:doTimer,[(72,27)(72,62)])
link(doWork2,5126659:doStop,[(59,34)(59,69)])
}
Add(Convertor,14746393,287,56)
{
Mode=4
link(onResult,15692242:doStrCat,[])
}
Add(Timer,5126659,98,56)
{
Interval=40
Enable=1
link(onTimer,3743529:doFor,[])
}
Add(For,3743529,147,56)
{
End=255
link(onEvent,15730124:doNext,[])
link(onStop,15224708:doEvent1,[(188,69)(188,118)])
}
Add(Counter,15730124,196,56)
{
Max=999999999
link(onNext,6961004:doCalc,[])
}
Add(MathParse,6961004,245,56)
{
DataCount=1
MathStr="sin(%1)*127 + 128"
AngleMode=1
link(onResult,14746393:doConvert,[])
}
Add(StrCat,15692242,329,56)
{
link(onStrCat,8384805:doValue,[])
link(Str1,1145836:Var1,[(335,44)(367,44)(367,98)])
}
Add(Memory,8384805,378,56)
{
Default=String()
}
Add(DoData,14255720,378,112)
{
link(onEventData,3044716:onEvent1,[(428,118)(428,27)])
link(Data,1145836:Var2,[])
}
Add(GetDataEx,1145836,378,93)
{
link(Data,8384805:Value,[])
}
Add(Hub,15224708,343,112)
{
link(onEvent1,14255720:doData,[])
link(onEvent2,8384805:doClear,[(371,125)(371,69)])
}
END_SDK
Add(InlineCode,2111790,322,175)
{
WorkPoints=#34:doStart=Расчёт начальных установок|26:doRecData=Потоковые данные|
EventPoints=#14:onIndex=Индекс|22:onSignal=Выход сигнала|36:onBegin=Щас будем рисовать график :)|
VarPoints=#
DataPoints=#
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|36: Signal:Array[0..511] of integer;|16: Num:integer;|9: public|25: _data_Data:THI_Event;|44: onSignal:THI_Event; //Выход сигнала|37: onIndex:THI_Event; //Индекс|47: onBegin:THI_Event; //Начало отрисовки|0:|51: procedure doStart(var _Data:TData; Index:word);|53: procedure doRecData(var _Data:TData; Index:word);|4:end;|0:|14:implementation|0:|30:procedure THiAsmClass.doStart;|15: var i:integer;|7: begin |34: for i:=0 to 2 do Signal[i]:=0;|9: Num:=0|5: end;|1: |32:procedure THiAsmClass.doRecData;|16: var St:string; |22: i,j,_Len:integer;|6: begin|25: St:=ToString(_Data);|22: _Len:=Length(St);|25: for i:=1 to _Len do|12: begin|36: Signal[Num]:=ord(St[i])-127;|19: Num:=Num+1;|24: if Num>511 then|15: begin|34: _hi_OnEvent(onBegin,0);|30: for j:=0 to 511 do|18: begin|37: _hi_OnEvent(onIndex,j);|46: _hi_OnEvent(onSignal,Signal[j]);|21: Num:=0;|17: end;|14: end;|11: end;|5: end;|1: |4:end.|
link(onIndex,5265381:doValue,[(366,181)(366,146)])
link(onSignal,2037800:doAdd,[])
link(onBegin,10151809:doEvent1,[])
}
Add(Hub,474771,238,154)
{
link(onEvent1,2111790:doStart,[(313,160)(313,181)])
link(onEvent2,6353273:doOpen,[(262,167)(262,181)])
}
Add(Memory,5265381,399,140)
{
}
Add(Hub,10151809,364,189)
{
link(onEvent1,2037800:doClear,[])
link(onEvent2,4093072:doNext,[(390,202)(390,223)])
}
Add(Hub,4811701,175,189)
{
link(onEvent1,6353273:doWrite,[(250,195)(250,202)])
link(onEvent2,2351202:doNext,[(207,202)(207,272)])
}
Add(Math,14997438,476,217)
{
OpType=2
Op2=512
link(onResult,10514087:doStrCat,[])
}
Add(Math,164902,476,266)
{
OpType=2
Op2=256
link(onResult,10155871:doStrCat,[])
}
Add(Counter,2351202,434,266)
{
Max=9999999
link(onNext,164902:doOperation,[])
}
Add(Counter,4093072,434,217)
{
Max=9999999
link(onNext,14997438:doOperation,[])
}
Add(Label,12864651,560,266)
{
Left=5
Top=120
}
Add(Label,6067157,560,217)
{
Left=5
Top=155
}
Add(Hub,5035321,77,217)
{
OutCount=4
link(onEvent1,4093072:doReset,[(374,223)(374,237)])
link(onEvent2,2351202:doReset,[(199,230)(199,286)])
link(onEvent3,15592299:doWork1,[(102,237)(102,195)])
link(onEvent4,10878508:doStart,[])
}
Add(Hub,6175985,77,252)
{
link(onEvent1,15592299:doWork2,[(110,258)(110,202)])
link(onEvent2,10878508:doStop,[(115,265)(115,251)])
}
Add(StrCat,10155871,518,266)
{
Str1="Получено "
link(onStrCat,12864651:doText,[])
}
Add(StrCat,10514087,518,217)
{
Str1="Обработано "
link(onStrCat,6067157:doText,[])
}
------------ Дoбавленo в 15.52:
Забыл добавить, что в этих схемах на разъёме порта ставил перемычку между 2-ым и 3-им контактами и "тихо сам с собою я веду беседу" (при этом, наверное надо иметь ввиду, что максимальная скорость приёма/передачи не менее чем в два раза меньше установленной)
карма: 19

1
файлы: 1code_30241.txt [2.1KB] [164]
Голосовали:wss60
Ответов: 16884
Рейтинг: 1239
#11: 2013-02-03 18:27:16 ЛС | профиль | цитата
Леонид, выбираем несуществующий порт и смотрим "Принято"
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8948
Рейтинг: 824
#12: 2013-02-03 20:03:03 ЛС | профиль | цитата
Tad, ну это же эксперемент, зачем она (защита от пользователя) здесь Не буду выбирать несуществующий порт!
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#13: 2013-02-03 21:11:51 ЛС | профиль | цитата
Леонид, претензия не к Вам, а к кодам COM.
Хотя можно и к Вам : даже эксперемент не оправдывает применения лишних компонент. Это уже в крови.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 205
Рейтинг: 44
#14: 2013-02-04 10:08:01 ЛС | профиль | цитата
Леонид, Спасибо, про буфер буду знать!
Кстати первый пример у меня не работает. Rx-Tx замыкал
Элемент “Thread” не хочет дружить с графиком – постоянно срывается изображение (синхронизация) при работе с реальным контроллером! Поэтому и использую Repeat + Application!
Пересмотрев еще раз все примеры (свои и ваши) – дошло
Зачем вообще нужен буфер!? Ведь в com порте он уже есть!
В общем, получилось схема. Позже проверю на реальном контроллере…
карма: 0

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#15: 2013-02-04 11:13:51 ЛС | профиль | цитата
wss60 писал(а):
Элемент “Thread” не хочет дружить с графиком

А и не будет. Асинхронные выходы категорически не рекомендуется цеплять ни на какие графические элементы. А Леонида, хоть учи, хоть нет -- бесполезно. Буквально недавно ему работу потоков разжевывал, и он снова наступил на теже самые грабли.

wss60, я недавно выкладывал компонент COMEX, он чисто асинхронный, на управление чтения ничего не надо, читает автоматически. Можешь его попробовать с реальным контроллером, мне бы интересно знать результат тестов
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)