xmailer 0 24 октября, 2017 Опубликовано 24 октября, 2017 · Жалоба Люди с опытом в С в keil, подскажите, есть файл на sd (размер может быть различным), нужно его читать в самом старте и куда-то писать, потом эти данные активно используются. Если бы разговор был о каком нить C#,Delphi,VB,... я бы однозначно читал бы в динамический массив, но вот в случае C на stm32 камне возникли сомнения. Имеет ли право следующий код считаться рабочим, код работает, проверял в отладчике. Но вот как отследить - хватит ли свободной памяти под массив, если допустить, что файлов может быть несколько, то это может быть проблемой. Или может есть другие варианты, без массивные. Можно конечно постоянно держать открытым файл и читать из него данные, но файл на sd, и если sd слетит по разным причинам, то все - приехали. Поэтому sd хотел задействовать на начальном этапе - при старте, потом можно вообще sd отмонтировать, и уже работать со считанными данными. Спасибо! uint8_t *adata; adata = (uint8_t *) malloc(РазмерМассива*sizeof(uint8_t)); adata[0] = 9; adata[1] = 8; adata[2] = 7; adata[3] = 6; ... // for(i=0;i<10;i++){ uint8_t x = adata[i]; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Но вот как отследить - хватит ли свободной памяти под массив, если допустить, что файлов может быть несколько, то это может быть проблемой. можете посчитать сумарный размер всех файлов вначале и зная сколько у вас свободного RAM принять решение - выделить массив или читать с карты. и можно выделить статический массив. не вижу смысла в динамической алокации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба не вижу смысла в динамической алокации.Сегодня у вас один файл 200 байтов, второй 1000. Завтра первый 1500, второй 300. Какого размера статический массив выделять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Сегодня у вас один файл 200 байтов, второй 1000. Завтра первый 1500, второй 300. Какого размера статический массив выделять? вобще то можно выделить общий массив. все равно нужно хранить все файлы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Сегодня у вас один файл 200 байтов, второй 1000. Завтра первый 1500, второй 300. Какого размера статический массив выделять? При создании этих файлов надо одновременно генерить и код на С для выделения статического массива, а лучше структуры. Я везде так делаю. Потому как в микроконтроллерах не так напрягают изменения размера файлов сколько вопрос о занимаемом им объёме. Поэтому любое изменение размера файла читаемого в RAM это работа, так что подкрутить там размер массива чистая мелочь. Штатный malloc для выделения места для файла в RAM только потому что не хочется писать его размер - плохая идея. Это все равно что разложить грабли на будущее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба вобще то можно выделить общий массив.И в нем следить, где кончился один файл и начался другой. Ой, получился самописный менеджер динамической памяти. Какой конфуз... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xmailer 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Поясню алгоритм работы, почему возник данный вопрос: 1. пользователь в win приложении ведет список, состоящий из нескольких полей (достаточно разный по объему данных); 2. пользователь в приложении имеет возможность скинуть данные списка в файл на sd, данные пишу в бинарный файл; 3. sd карта вставляется в устройство на stm32, потом reset или power on, при запуске читается данные этого списка, что определяет алгоритмику работы. Рассматривались попытки организовать все по usb, через virtual port com, запись данных списка в eeprom, но было решено что с sd будет проще и мобильнее (устройство с собой не потаскаешь, с ноутбуком тоже не всегда удобно). Мне кажется ситуация достаточно типичная для работы устройства на stm32. Кто как поступает в таких случаях? При создании этих файлов надо одновременно генерить и код на С для выделения статического массива, а лучше структуры. Данный подход требует ребилда hex-а и его прошивка в камень. Мы сейчас так делаем, задумали как временное решение, поэтому сейчас пытаемся уйти от этого решения. Штатный malloc для выделения места для файла в RAM только потому что не хочется писать его размер - плохая идея. Это все равно что разложить грабли на будущее. Именно от сомнений использования malloc возник вопрос. вобще то можно выделить общий массив. все равно нужно хранить все файлы. общий массив какого размера? по максималке, но может быть и 100байт, а может 100Кбт. Этим рулит пользователь. И можно попасть в ситуацию что выделенный массив мал по размеру или просто живет, отъедает память. это можно использовать на относительно статичных данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Если вы не собираетесь менять длинну этого масива в процессе работы, то вполне можно использовать malloc - вычислить размер файла, выделить память и прочесть туда. Проблемы с malloc'ом будут если активно использовать пару malloc/free Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Поясню алгоритм работы, почему возник данный вопрос: 1. пользователь в win приложении ведет список, состоящий из нескольких полей (достаточно разный по объему данных); Вот это - "достаточно разный по объему данных" и есть основная проблема. Нужно ввести в вашей программе на PC контроль точного размера. Вам самим определится сколько же вы максимум можете отдать под это RAM-а и выделить наконец окончательный статический массив максимального размера. И вас перестанет мучать постоянная неизвестность сколько RAM-а есть в вашем распоряжении. А имеено эта неизвестность раздувает программы, которые в сотнях случаев должны предусматриваить реакцию на ситуации нехватки памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2017 Опубликовано 25 октября, 2017 (изменено) · Жалоба И в нем следить, где кончился один файл и начался другой. Ой, получился самописный менеджер динамической памяти. Какой конфуз... all_files_start+size_of_file1 общий массив какого размера? по максималке, но может быть и 100байт, а может 100Кбт. Этим рулит пользователь. И можно попасть в ситуацию что выделенный массив мал по размеру или просто живет, отъедает память. это можно использовать на относительно статичных данных. я уже год сижу над этой проблемой. единственное решение которое нашел - динамическое выделение памяти. но я против динамики поэтому... продолжаю сидеть. ну или можно перейти на другой камень. скажем у меня сейчас камень с 128 мега памяти. так я там создал FAT, директории и гоняю несколько десятков файлов с карты в память и обратно. Изменено 25 октября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xmailer 0 25 октября, 2017 Опубликовано 25 октября, 2017 (изменено) · Жалоба Вот это - "достаточно разный по объему данных" и есть основная проблема. Нужно ввести в вашей программе на PC контроль точного размера. Вам самим определится сколько же вы максимум можете отдать под это RAM-а и выделить наконец окончательный статический массив максимального размера. И вас перестанет мучать постоянная неизвестность сколько RAM-а есть в вашем распоряжении. А имеено эта неизвестность раздувает программы, которые в сотнях случаев должны предусматриваить реакцию на ситуации нехватки памяти. Такой контроль будет делаться. Если вы не собираетесь менять длинну этого масива в процессе работы, то вполне можно использовать malloc - вычислить размер файла, выделить память и прочесть туда. Проблемы с malloc'ом будут если активно использовать пару malloc/free Это как раз моя ситуация, malloc будет делаться один раз при старте, потом созданные массивы просто используются, без ресайза и free я уже год сижу над этой проблемой. единственное решение которое нашел - динамическое выделение памяти. но я против динамики поэтому... продолжаю сидеть. ну или можно перейти на другой камень. скажем у меня сейчас камень с 128 мега памяти. так я там создал FAT, директории и гоняю несколько десятков файлов с карты в память и обратно. достаточно сложной подход, наверное долго отлаживали Изменено 25 октября, 2017 пользователем xmailer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба но я против динамики поэтому... продолжаю сидеть."Мыши кололись, плакали, но продолжали жрать кактус". xmailer, смело используйте malloc. Слухи о его вреде сильно преувеличены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Сегодня у вас один файл 200 байтов, второй 1000. Завтра первый 1500, второй 300. Какого размера статический массив выделять? два по 1500 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба "Мыши кололись, плакали, но продолжали жрать кактус". xmailer, смело используйте malloc. Слухи о его вреде сильно преувеличены. извиняюсь. совсем забыл. решение таки нашел. поставил внешнюю память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба отъедает память какая вам разница, если её всё равно хватает ? и при этом программные глюки становится предсказуемыми, в отличие от Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться