![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Доброго времени суток уважаемые эксперты. Собственно сабж:
1. Имеется flash-ка. 2. Контроллер диска принимает байт и адрес, куда нужно записать его. 3. Необходимо сказать контроллеру, чтобы он писал отдельные биты по нужным мне адресам. 4. Необходимо изменять именно биты, но никак не переупаковывать байт, а потом переписывать его. По сути, я хочу взять функции контроллера записи на себя. Поможет ли тут си/си++, и, если нет, сможет ли это сделать ассемблер? Заранее спасибо за ответы. |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
я вас огорчу контроллер оперирует минимальным обьектом файловой системы для записи и чтения, а это может быть и сектор в 512 и кластер в 4096, 1 байт вы ни как не запишите.
-------------------- |
|||
|
||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Это файловая система оперирует данными понятиями. Файловая система для того и нужна, что скрывает сложность записи на физический носитель. Как по Вашему происходит запись на устройство? Получается, что если я напишу файловую систему, где минимальный объект будет = 1 Гб, то контроллер проглотит 1Гб, а потом начнет писать данные? Нет конечно: 1. На шине данных выставляется сам байт. 2. На шине адреса выставляется адрес. 3. Выставляется флаг готовности, и контроллер начинает писать данные. А один байт записать вообще не проблема. Запишите в файл 1 ASCII символ, и опа - у нас файл размером в 1 байт. А вот с битами сложнее. Бит - 1 транзистор в матрице. Для простоты транзисторы объединяются в группы по 8, и контроллер имеет возможность оперировать только этой группой. Поэтому, собственно, и была создана данная тема((( |
|||
|
||||
| UniBomb |
|
||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
Теоретически. Практически же этот файл будет занимать столько байт, сколько имеет наименьшая единица хранения данных (кластер). Т.е.
то таки да, на диске этот файл будет занимать 1 Гб. Запись может происходить только блоками. Причём в NAND флеш эти блоки измеряются кибибайтами (4кб для записи и 256 для стирания). Второе "причём" - перед записью данных блок должен быть стёрт. Третье "причём"... А впрочем rtfm никто не отменял. Так что тут не поможет ни си/си++, ни ассемблер, ни даже чёрная магия |
||||
|
|||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Мда... Жалко. Ну спасибо за ответ. Плохо конечно, но что поделаешь. |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
а чем обусловлена необходимость записи 1 байте? или бита?
-------------------- |
|||
|
||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Нужно писать биты. Если при записи пропускать биты, которые установлены правильно, то скорость записи увеличится примерно в 1,71 раза (результат моделирования на реальных файлах). |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
чет не верю
чтоб проверить бит его и прочитать нада и сравнить -------------------- |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Добавлено через 1 минуту и 27 секунд Хммм. А если на флешку запихать ФС, умеющую разреженные файлы, и записывать их? Правда я в этом деле нуб нубом, могла и глупость сморозить ) -------------------- You're face to face With man who sold the world |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Всё зависит от контроллера и от того как организована флеш-память.
Хотя в контроллере могут быть команды для оперирования с отдельными битами, они обычно используются при обращении к OЗУ. Умный компиллятор в следующем коде будет использовать команды работы с битами, если они имеются:
Но для записи флеш-памяти обычно нужно произвести следующую процедуру: 1. Считать блок памяти из флеш в ОЗУ (если нужно, или проинициализировать ОЗУ) 2. Изменить считанные данные в ОЗУ (здесь могут быть использованы команды работы с битами) 3. Очистить блок памяти в флеш (в 0 или 1 в зависимости от типа флеш) Этот этап может быть пропущен если нужно изменить 1 в 0 или наоборот и флеш-память позволяет производить такую запись без предварительной очистки) 4. Записать данные. Размер блока флеш-памяти может не совпадать с размером кластера файлоыой системы, если таковая используется. Размер кластера обычно больше размера блока. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
На аппаратном уровне, процессор не может работать даже с ОЗУ на битовом уровне.
Это просто физически невозможно. Там данные выставляются на шину данных, и однми стробом прописывается целый байт (или даже целое с слово в зависимости от режима), один бит прописать нельзя. Чтоб изменить 1 бит, процессор считывает с ОЗУ байт, меняет у себя во внутреннем регистре бит, записывает назад в ОЗУ. Это про ОЗУ. Что уж говорить про флеш память... там стирать информацию можно только блоками. Размер блока зависит от конкретной микросхемы ППЗУ. Стирать - есть записывать все 0xFF. Записывать нолики можно и отдельными байтами. Все это самый низкий уровень, на котором работает контроллер флешки, (встроенный в саму флешку) выше этого(вернее ниже Прямого доступа к флеш памяти у нас нет. все идет посредством ФС. А там накладывается еще и кластерная система. Вообще имхо, вопрос поставлен не корректно. Дело не в битовом доступе. проблема скорей всего в чем-то другом... |
|||
|
||||
| Impuls1989 |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Верьте или нет, но моделирование не врет. Хотите исходник покажу. По поводу чтения - не совсем так. Прочитать можно только первый бит, а все остальные чередовать: 1010101010101010101010101... А сравнивать действительно нужно. Вот поэтому в ~1,71 раза а не в ~2 раза увеличивается скорость при моделировании.
Не совсем понятен Ваш ответ. Не могли бы немного уточнить.
Операции то с битами, но в памяти переписывается целый байт. Товарищ volatile подробно об этом описал ниже.
Ну, допустим, файловые системы пишутся. Никто не запрещает поковырять уже готовую ФС (благо OpenSource рулит). Так что добраться до контроллера можно, а вот писать отдельные биты, конечно же, нельзя (зачем бы тогда нужен был контроллер). На счет битового доступа: проблема, как раз таки, в нем: хочется изменить бит так, чтобы его соседи не перезаписывались. А вот уже реальность это сделать не позволяет - это да. |
||||||||||
|
|||||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Impuls1989, может конечно не в тему, но возможно вам поможет. Если включить write caching на флеш-драйве, то флешка будет работать на порядок быстрее. По умолчанию кеширование отключено. Попробуйте включить и удивитесь на сколько быстрее станет работать (особенно на мелких файлах). например я включаю это по умолчанию, никаких проблем на разу не было. Главное флешку не выдергивать сразу, а дать время ей записаться (секунд 5-10). |
|||
|
||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Неее... Это не по джедайски Это сообщение отредактировал(а) Impuls1989 - 28.12.2011, 15:50 |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
как же Вы моделировали, если вопрос и заключается в том как писать отдельные биты?
очень хотим |
||||
|
|||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Ну массивы никто еще не отменял. Моделирование в том и заключается, что не нужно реализовывть все по правде. По этому поводу я писал статью на хабре. Там и исходники и комментарии к ним. |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
моделирование не верно, сделайте по другому, определите размер кластера вашей ФС, создайте рандомный файл с заполнением 0 и 1 но с размерностью кластера и на нем тренеруйтесь.
-------------------- |
|||
|
||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Зачем? Системные вызовы read/write небуферизированный I/O. Размер кластера не имеет особого значения. К тому же я проверял на файлах разной размерности. Результаты идентичны. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Почитал статью - у вас неверное представление о работе FLASH памяти (о чем вам там lorc и написал), соответственно ваше моделирование не учитывает реальное железо |
|||
|
||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Ну поэтому я там и написал пр взгляд дилетанта и про то, что у меня ничего не вышло. Но стоит отметить тот момент, что, в принципе, такая запись может быть осуществлена. Да и интересен сам результат: при незначительном усложнении алгоритма записи, значительно увеличилась скорость. А flash нужна была для того, чтобы замерить относительную скорость операций записи и сравнения. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Ваша модель не адекватна реальности (это уже написали). Фактически Вы выяснили, что время передачи зависит от передаваемого объема. Но этот вывод получается математически, тут нечего моделировать. |
|||
|
||||
| Impuls1989 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.2.2011 Репутация: нет Всего: нет |
Не адекватна текущей реальности. Что будет дальше никто не знает. Ведь если есть идея, и идея работает - значит ее можно попытаться осуществить в железе. И на уровне железа такая система будет работать. А именно этого я и пытался добиться. И тут не стоял вопрос: можно ли сделать это на самом деле (хотя это было бы очень здорово) Это сообщение отредактировал(а) Impuls1989 - 12.1.2012, 15:40 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |