|
Вопрос по записи файла на OMAP L-138 |
|
|
|
Jul 31 2017, 12:28
|
Участник

Группа: Участник
Сообщений: 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));
Не сталкивался кто-нибудь с такой ситуацией?
|
|
|
|
|
Jul 31 2017, 16:10
|
Знающий
   
Группа: Участник
Сообщений: 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) и объем свободной системной памяти - как вариант, ошибка в исходниках, например, открываете файл, пишете и не закрываете, банальная утечка..
|
|
|
|
|
Aug 2 2017, 10:44
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 2 2017, 11:36
|
Участник

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

|
Просто мне кажется странным, что памяти расходуется примерно половина объема. Нет ли по этой причине наползания на память другой программы? А функция close не предполагает очистку буферов?
|
|
|
|
|
Aug 2 2017, 11:45
|
Гуру
     
Группа: Свой
Сообщений: 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 не предполагает очистку буферов? Нет. В том и смысл кэширования, чтобы держать в неиспользуемой памяти относительно полезную нагрузку.
|
|
|
|
|
Aug 2 2017, 11:54
|
Участник

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

|
Конфигурацию памяти я взял из документации, собственно там сказано, что linux эти адреса не использует. И в примерах SDK конфигурируется именно это адресное пространство. А если как-то принудительно очищать кэш или ограничить его размер? Просто судя по статистике расхода памяти память в примере, описанном выше расходуется с 108 МБ до 21МБ.
|
|
|
|
|
Aug 2 2017, 12:13
|
Участник

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

|
Посмотрю, но все-таки по поводу расхода памяти. Просто мне надо писать несколько суток непрерывно, и крутится еще несколько программ, вот до какого момента будет кэшироваться?
|
|
|
|
|
Aug 2 2017, 12:52
|
Участник

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

|
Цитата Надо сопоставить, что передается ядру в mem=, и что прописано в конфигурации DSP/BIOS. Посмотрел - длины и начальные адреса совпадают
|
|
|
|
|
Aug 4 2017, 06:39
|
Участник

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

|
Извиняюсь, невнимательно посчитал адреса, действительно в конфинурации DSPLINK зарезервирован диапазон адресов 0xC3E00000-0xC4000000, а в DSP 0xC3E00000-0xC4001000, видимо в этом причина
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|