реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопрос по записи файла на OMAP L-138
alexey123_45
сообщение Jul 31 2017, 12:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Здравствуйте
Столкнулся с такой проблемой: В ARM ядре из-под Linux пишу текстовый файл CSV формата на внешнюю SDHC карту, отформатированной в FAT32. Как только размер файла на диске становится примерно 39МБайт программа аварийно завершается и в файле вместо последних нескольких записей мусор. Проверял, на утечки памяти, не обнаружил, не может ли это быть связано с каким-то кэшированием?
Запись в файл идет на фоне обмена с DSP ядром через DSPLINK

Файл открываю так
resultFile = open(name, O_RDWR | O_CREAT | O_APPEND, 0640);
Записываю
test_a = write(resultFile, rec_buf, strlen(rec_buf));


Не сталкивался кто-нибудь с такой ситуацией?


Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2017, 15:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(alexey123_45 @ Jul 31 2017, 15:28) *
Запись в файл идет на фоне обмена с DSP ядром через DSPLINK

Проверьте, нет ли где перекрытия по карте памяти - это отличный источник разнообразных чудес.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Jul 31 2017, 16:10
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(alexey123_45 @ Jul 31 2017, 15:28) *
Столкнулся с такой проблемой: В ARM ядре из-под Linux пишу текстовый файл CSV формата на внешнюю SDHC карту, отформатированной в FAT32. Как только размер файла на диске становится примерно 39МБайт программа аварийно завершается и в файле вместо последних нескольких записей мусор. Проверял, на утечки памяти, не обнаружил, не может ли это быть связано с каким-то кэшированием?

широкополосно:
- отключите на время обмен с DSP, если перестанет валиться, то копаете в том направление
- в линуксе из под того же пользователя командой dd сгенерите запись файла допустим 100МБ на тот носитель (SDHC)
- в своей софтине добавьте отладочный блок с записью в отдельный файл транзакций рабочих записей, хотя бы rec_buf, strlen(rec_buf) и объем свободной системной памяти
- как вариант, ошибка в исходниках, например, открываете файл, пишете и не закрываете, банальная утечка..
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Aug 2 2017, 10:44
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Проверил, сделал простой тест
rec_len =2800;
char rec_buf[4096];

resultFile = open(name, O_RDWR | O_CREAT | O_APPEND, 0640);

while(dsp_message_count<30000)
{
test_a = write(resultFile, rec_buf, rec_len);
printf("Write to file = %d,%d,%d\n",test_a, resultFile, dsp_message_count);
//usleep(100000);
dsp_message_count +=1;
}

close(resultFile);


Посмотрел расход памяти, пока файл пишется свободная память уменьшается, но когда приложение перестает работать, т.е. отрабатывает close(resultFile); и приложение закрывается, объем свободной памяти не восстанавливается, это правильная работа?

Расход памяти смотрел через вторую консоль free -b
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2017, 11:06
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Память задействуется под буферизацию, криминала в этом нет.
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Aug 2 2017, 11:36
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Просто мне кажется странным, что памяти расходуется примерно половина объема.
Нет ли по этой причине наползания на память другой программы?
А функция close не предполагает очистку буферов?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2017, 11:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(alexey123_45 @ Aug 2 2017, 14:36) *
Просто мне кажется странным, что памяти расходуется примерно половина объема.

Чем больше памяти отдается на кэширование, тем легче живется системе.

Цитата(alexey123_45 @ Aug 2 2017, 14:36) *
Нет ли по этой причине наползания на память другой программы?

Только в случае неправильной конфигурации памяти: в какой-то момент расширяющийся кэш перекрывается
с памятью DSP. До этого момента все как бы в порядке.

Цитата(alexey123_45 @ Aug 2 2017, 14:36) *
А функция close не предполагает очистку буферов?

Нет. В том и смысл кэширования, чтобы держать в неиспользуемой памяти относительно полезную нагрузку.
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Aug 2 2017, 11:54
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Конфигурацию памяти я взял из документации, собственно там сказано, что linux эти адреса не использует. И в примерах SDK конфигурируется именно это адресное пространство. А если как-то принудительно очищать кэш или ограничить его размер?
Просто судя по статистике расхода памяти память в примере, описанном выше расходуется с 108 МБ до 21МБ.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2017, 12:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Надо сопоставить, что передается ядру в mem=, и что прописано в конфигурации DSP/BIOS.
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Aug 2 2017, 12:13
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Посмотрю, но все-таки по поводу расхода памяти. Просто мне надо писать несколько суток непрерывно, и крутится еще несколько программ, вот до какого момента будет кэшироваться?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2017, 12:19
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Дисковый кэш - это не есть прямой расход памяти. Как только она понадобится "для дела", то освободится.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 2 2017, 12:27
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(alexey123_45 @ Aug 2 2017, 14:36) *
А функция close не предполагает очистку буферов?

Это скорее очистка буфера не предполагает отдачу его памяти в системный пул. Может отдавать, а может и нет. В зависимости от реализации.
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Aug 2 2017, 12:52
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Цитата
Надо сопоставить, что передается ядру в mem=, и что прописано в конфигурации DSP/BIOS.


Посмотрел - длины и начальные адреса совпадают
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Aug 4 2017, 06:39
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Извиняюсь, невнимательно посчитал адреса, действительно в конфинурации DSPLINK зарезервирован диапазон адресов 0xC3E00000-0xC4000000, а в DSP 0xC3E00000-0xC4001000, видимо в этом причина
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2017, 06:47
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(alexey123_45 @ Aug 4 2017, 09:39) *
Извиняюсь, невнимательно посчитал адреса, действительно в конфинурации DSPLINK зарезервирован диапазон адресов 0xC3E00000-0xC4000000, а в DSP 0xC3E00000-0xC4001000, видимо в этом причина

Так резервировать надо в одном файле. Например - командном файле линкёра. Чтобы не было подобных чудес. laughing.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016