pahanvs 0 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Привет всем :) Есть следующая загвоздка: Пытаюсь реализовать чтение с ЮСБ флешки файла BMP. Как бы все работает вроде неплохо, но вот наткнулся на один косяк. все подключается, пишется и т.д. НО мне нужно прочитать в заголовке файла некую информацию, а именно откуда начинаются данные самого растра, дабы переместится туда и начать их считывать. Ну ладно думаю в чем проблема-то: f_lseek (&MyFile, 10); f_read (&MyFile, rastr, sizeof(rastr), &br); считываю что растр начинается с 62 байта. перемещаюсь туда: f_lseek (&MyFile, 62); и вот прикол- пытаюсь считать 2500 байт f_read (&MyFile, send, sizeof(send), &br); буфер send имеет размер 2500... и фигушки... ну ладно думаю, погляжу в отладке.. смотрю... а он считывает только 450 байт и все. при повторном обращении не читает ничего и f_error(&MyFile) устанавливает единичку, тобиш ахтунг... Ломал голову и так и сяк, потом заметил что если сначала не читать заголовок файла, а сразу начинать читать кусками по 2500, то все нормально. читает весь файл до конца без ошибок. Вообщем суть такова что после любого перемещения указателя по файлу он разрешает читать только 450 байт, а если сразу читать нужные куски, то хоть 4000. Мож кто сталкивался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pahanvs 0 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Вообщем поправлю себя. Поковырял маленько. Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Вообщем поправлю себя. Поковырял маленько. Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался. Возможно связано с работой драйвера. Если флеш, страничная организация - то чтение идет естественно страницей. Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора. Вот тут и может быть написано нечто "мелким шрифтом" :) к примеру что lseek двигать кратно размеру страницы, иначе ОНО должно подкачивать в буфер сразу 2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pahanvs 0 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба вот это мелкий шрифт и не читается ))) Тут у меня скорей всего скила не хватает. я сделал так: читаю заголовок и перемещаю указатель на начало растра+величина одной строки растра и поехал дальше читать. первую строчку канеш теряю, но их там очень много, и потеря одной не критична :) :01: Вообщем вруша я :) Нифигасеньки не получилось :) Все упирается в магические цифры :( перемещаю указатель на 600 позицию - читаю сколько влезет. А если на 2562-ю, то фсе... Опять те же грабли... :( Вообщем ну эти большие куски :) Читаю по 4 байта нужное количество раз (все равно в BMP запись пикселей кратна 4-ем байтам), складываю все в массив, потом отправляю дальше по конвееру :) Так работает :) Уже проверил на железе :) :08: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Если флеш, страничная организация - то чтение идет естественно страницей. Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора. Если так, то очевидно, что проблема в кривом low-level драйвере, через который работает FatFS. Так как FatFS - это middleware, то FatFS не знает и не должен ничего знать о низкоуровневой организации флешь (всяких страницах, секторах, ...). Вот его и надо выпрямлять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 29 сентября, 2016 Опубликовано 29 сентября, 2016 (изменено) · Жалоба Если так, то очевидно, что проблема в кривом low-level драйвере, через который работает FatFS. Так как FatFS - это middleware, то FatFS не знает и не должен ничего знать о низкоуровневой организации флешь (всяких страницах, секторах, ...). Вот его и надо выпрямлять. Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом, т.е. можно читать и записывать блоки, как минимум 512-4096, или более байт. Как они организованы внутри флешки - да фиг с ними. У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры. Изменено 29 сентября, 2016 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом, И что??? Значит low-level драйвер через который работает FatFS - это реализация класса MassStorage на UsbHost. Вот он и "при том". В нём и следует искать проблему, что-то он читает неверно. Функция disk_read() (и прочие disk_...()), вызываемая FatFS, каким-то способом обращается к классу MassStorage, скорей всего проблема здесь. У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1 Что это за функция такая? И каким образом Вы узнали что у автора она есть??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры. Да где же следует, если ...заметил что если сначала не читать заголовок файла, а сразу начинать читать кусками по 2500, то все нормально. читает весь файл до конца без ошибок. И еще информация к размышлению на основе данных из первого поста: 62 + 450 = 512, что как бы намекает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба И еще информация к размышлению на основе данных из первого поста: 62 + 450 = 512, что как бы намекает. Открыть disk_read() (и прочие disk_...()) и разбираться что там да как напортачено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Что это за функция такая? И каким образом Вы узнали что у автора она есть??? Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 сентября, 2016 Опубликовано 29 сентября, 2016 · Жалоба Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии... В любом случае в FatFS есть low-level функции указанные в файле diskio.h. Эти же функции описаны на странице http://elm-chan.org/fsw/ff/00index_e.html в разделе "Device Control Interface". Именно через это API FatFS общается с низкоуровневым драйвером. А то что у Вас - это что-то лично Ваше. Возможно это что-то более нижнего уровня. И оно не входит в FatFS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться