Програмная часть: файловые системы: концепцияТрадиционный подход к коду, управляющим файловой системой, подразумевает использование уникальных символических путевых имён для каждого хранимого файла. Это удобно для универсальной операционной системы, но программное обеспечение плейера универсальным не является и к тому же работает в условиях жесткого ограничечения оперативной памяти: процессор ATmega32 имеет всего 2 кб ОЗУ на борту, какого либо внешнего ОЗУ в плейере не предусмотрено. Плейер, работающий с универсальной операционной системой, при воспроизведении нескольких файлов подряд, должен иметь список этих файлов, хранящихся либо в отдельном файле либо составляемый на основании запросов к операционной системе. В такой операционной системе знание имени одного файла не позволяет предсказать имена других файлов, находящихся в данной директории или хотя бы за разумное время найти эти имена путём перебора. Имена соседей могут быть получены только в результате обращения к ОС, причём в большинстве операционных систем выяснить следующий или предыдущий файл можно только полностью запросив и проанализировав текущий каталог. Для составления же списка файлов, расположенных в сложной древовидной структуре, придётся изучить её полностью, что требует как времени так и значительного объёма оперативной памяти для хранения результатов. Что полностью противоречит требованию быстрого запуска плейера. Плейлист (список файлов в виде отдельного файла) хотя и снижает требования к оперативной памяти, однако время на его генерацию (особенно, в условиях медленной файловой системы - опять же по причине малой оперативной памяти) будет весьма значительным. В общем, мы пойдём другим путём. В Orfey'e я отказался от использования в качестве идентификатора файла уникального символьного имени в пользу целочисленного массива. Каждый элемент массива описывает номер элемента очередного каталога, который составляет путевое имя файла. Например: "3.5.4" - третий элемент корневого каталога является подкаталогом, в котором пятый элемент также является подкаталогом, в котором четвёртый элемент является целевым файлом. Отмечу, что эта схема адресации совершенно совместима с традиционной схемой путевых имён и может быть применена для всех файловых систем, которые предполагается реализовать для Orfey'я: FAT, UFS, EXT2. Что это даёт ? Самое главное - возможность за незначительное, конечное число итерраций найти соседей (причем оперируя числами, а не строками): т.е. - в терминах пользовательского интерфейса - перейти к следующему или предыдущему файлу, причём не только в пределах одной директории. Так же свободно можно переходить в любую другую точку иерархии. Несколько упрощенный пример:
Вообще-то говоря, можно было бы реализовать подобный механизм и с использованием символьных имен, но - согласитесь - цифры компактнее и проще в обработке :) Все внутренние операции в плейере происходят с использованием такого формата идентификаторов, для удобства пользователя существует лишь процедура file_Name, которая может для текущего файла вернуть заданную часть символического путевого имени. Технический смысл конкретного значения числа в пути может быть различным: это может быть номер записи в каталоге или её смещение (делённое на размер записи - для номера отводится только 16 бит), причем могут учитываться все записи или же только фактически доступные (не удалённые, не являющиеся служебными, вроде имени тома или расширений LFN). Важно лишь, чтобы номер был уникальным для каждой каталожной записи. Максимальная глубина путевого имени файла (т.е. число элементов массива-имени) выбрана равной 10. Элемент имеет разрядность 16 бит (например, в FAT это позволяет адресовать более 65000 имен формата 8.3 в каждом каталоге). Специализация программного обеспечения плейера также накладывает другие особенности на код поддержки файловой системы:
Програмная часть: файловые системы: оболочка файловых системОболочка файловых систем (файл fs.asm.inc) обеспечивает более высоким уровням програмного обеспечения универсальный механизм доступа к файлам. Её вызовы можно условно разделить на следующие группы:
Большинство функций возвращает признак успешного выполнения операций во флажке C. Некоторые функции могут возвращать расширенный код в переменной fs_errno. Поддержка файловой системы FATФайл fs.FAT.asm.inc. Поддерживаются все три варианта файловой системы: FAT12, FAT16, FAT32. Никаких особенностей нет, если не считать того, что в следствие малого объёма оперативной памяти никакие структуры файловой системы не кешируются. Т.е. даже просто переход к очередному кластеру файла без чтения данных вызовет обращение к накопителю (для анализа таблицы расположения файлов, даже если именно она в данный момент хранится в буфере). Это, однако, для работы плейера совершенно не критично, так как имеющейся производительности хватает с запасом. Параметры загрузочной записи анализируются полностью, код (в отличие от MS-DOS, например) не пытается делать своих предположений относительно корректности значений (как правило, это "умение" MS-DOS'у порой сильно вредило). Нет ограничений на использование не совсем стандартного размера кластера в 64 Кб (используется, например, в FAT16 на разделах 2-4 Гб). Так как имена файлов не анализируются, любые символы в них считаются допустимыми (вы даже можете использовать имена, включающие символы "*", ":", "\", "/"... если сможете их создать ;) ). Процедура file_Name понимает длинные имена файлов (LFN), но будет урезать их слева, если длина превышает 63 знака. Правильно отображаться будут только символы, которые имеют эквиваленты в кодировке КОИ-8. Включая букву "ё". Если файл не имеет длинного имени, короткое имя только дополняется точкой между именем и расширением, суффиксные пробелы не удаляются, какой либо модификации регистра не происходит (т.е. вернутся заглавные буквы). Поддержка файловой системы UFSПока не реализована. Поддержка файловой системы EXT2Пока не реализована. |