Blackfin: поддержка компрессии zlib потока загрузки |
![]() |
Добавил(а) microsin | |||||||||||||||
Утилита загрузчика VisualDSP++ (loader utility [3]) предоставляет для процессоров Blackfin ADSP-BF531, ADSP-BF532, ADSP-BF533, ADSP-BF534, ADSP-BF536, ADSP-BF537 генерацию файла образа загрузки (boot stream), сжатого механизмом компрессии на основе библиотеки zLib [2]. Компрессия zLib поддерживается сторонней динамически связываемой библиотекой zLib1.dll. Дополнительная информация по этой библиотеке доступна на сайте zlib.net. Здесь приведен перевод раздела "ADSP-BF531/BF532/BF533/BF534/BF536/BF537 Processor Compression Support" из документации [1] компании Analog Devices. DLL-файл zLib1.dll входит в комплект поставки среды разработки VisualDSP++ (находится в папке System каталога установки VisualDSP++). Библиотечные функции выполняют процедуры компрессии и декомпрессии потока загрузки (boot stream), когда при запуске утилиты загрузчика выбраны соответствующие опции. Исполняемые файлы инициализации со встроенным механизмом декомпрессии в процессе загрузки должны выполнить распаковку сжатого boot stream. Исполняемые файлы по умолчанию с функциями декомпрессии поставляются совместно с VisualDSP++. Опция командной строки -compression указывает утилите загрузчика [3] выполнить компрессию boot stream. VisualDSP++ также предоставляет управление этой опцией в разделе Load окна настройки свойств проекта (пример см. рис. 3-27). Рис. 3-27. Страничка Project: Load: Compression свойств проекта процессоров ADSP-BF537. Утилита загрузки выполняет 2 шага для компрессии boot stream. Сначала утилита генерирует boot stream обычным способом (собирает блоки данных загрузки, подробное описание см. в [4, 5]), после чего применяет компрессию полученного boot stream. Инициализация с декомпрессией выполняется в обратном порядке: сначала загрузчик распаковывает сжатый boot stream, после чего загружает код и данные в сегменты памяти как обычно из распакованного образа загрузки. Утилита загрузчика сжимает boot stream по принципу .dxe-за-.dxe. Для каждого входного файла .dxe утилита сжимает код и данные вместе, включая весь код и данные из любых связанных файлов оверлея (.ovl) и файлов общей памяти (shared memory, .sm). [Сжатые потоки] Рис. 3-21 иллюстрирует базовую структуру файла загрузки с сжатыми потоками.
Рис. 3-21. Файл загрузки со сжатыми потоками. Код инициализации находится наверху этого файла загрузки. Когда запускается процесс загрузки сначала в процессор загружается и запускается код инициализации. Как только выполнился код инициализации, остальная часть потока будет распакована процессором. Код инициализации вызовет подпрограмму декомпрессии, чтобы выполнить распаковку потока загрузки, и затем записывает распакованный поток в память процессора таким же способом, как это делает обычное ядро загрузки (boot kernel), когда оно встречается со сжатым потоком. На последнем шаге код инициализации запускает Boot ROM, указывая ему место нахождения распакованного boot stream, и загрузка продолжается обычным образом. На рис. 3-22 показана структура сжатого блока.
Рис. 3-22. Compressed Block. [Заголовки сжатого блока] Сжатый поток всегда имеет заголовок, за которым идет полезная нагрузка - сжатый поток данных загрузки. Рис. 3-23 показывает структуру заголовка сжатого блока загрузки.
Рис. 3-23. Compressed Block Header. Первые 16 бит заголовка сжатого блока содержит счетчик дополнения байт сжатого потока загрузки. "Дополненный поток" означает, что утилита загрузки всегда дополняет количество байт результирующего потока загрузки, полученного на выходе системы компрессии, до четного количества байт. Т. е. утилита загрузки округляет вверх счетчик байт выходного сжатого потока до следующего большего четного числа. Эта 16-битная ячейка содержит счетчик дополнения, т. е. здесь будет либо 0x0000, либо 0x0001. Следующие 16 бит заголовка сжатого блока содержат размер окна компрессии, используемого алгоритмом компрессии. Это значение показателя степени двойки в диапазоне 8..15, со значением по умолчанию 9, т. е. если 2 возвести в степень этого числа, то получится размер окна компрессии. В реализации Blackfin декомпрессор является частью инициализационных файлов (см. ниже "Декомпрессия файлов инициализации"). Эти файлы по умолчанию содержать сборку декомпрессора с размером окна 9 (512 байт). Таким образом, если Вы выбираете размер окна компрессии не по умолчанию (слайдером "Compression Window Size" закладки Compression в разделе настроек Load диалога Project Options сжимаемого приложения), то декомпрессор должен быть пересобран с новым выбранным размером окна (как это делается, см. врезку выше). Последние 16 бит заголовка сжатого блока содержат слово флагов. Единственное возможное назначение флага компрессии показано на рис. 3-24. Рис. 3-24. Слово флагов (Flag Word) заголовка сжатого блока (Compressed Block Header). [Не сжатые потоки] Сжатый поток (показанный на рис. 3-21) файла загрузки включает не сжатые потоки. Не сжатые потоки включают коды приложения, которые конфликтовали в областях памяти с блоками инициализации, и последний блок. Не сжатый поток находится только в последнем блоке, если в сжимаемом приложении не было конфликтующего кода. Последний блок может иметь нулевой счетчик байт, он показывает коду инициализации конец приложения пользователя. [Загрузка сжатых потоков] На рис. 3-25 показана последовательность загрузки образа со сжатыми потоками. Файл образа загрузки предварительно сохраняется в памяти FLASH. 1. Boot ROM начинает обрабатывать образ загрузки, находящийся начале FLASH. Код Boot ROM прочитает заголовок кода инициализации и загрузит его. 2. Boot ROM запустит на выполнение загруженный код инициализации. 3. (A) Код инициализации сканирует заголовок на наличие любых сжатых потоков (см. структуру флага компрессии на рис. 3-24). Код распаковывает потоки в окно декомпрессии (по частям) и запускает ядро инициализации в распакованных данных. (B) Ядро инициализации загрузит данные в различные области памяти точно так же, как это делает Boot ROM. 4. Код инициализации настраивает запуск Boot ROM, чтобы загрузить не сжатые блоки и последний блок (в котором установлен флаг FINAL в слове флага заголовка блока). Код Boot ROM загружает последние полезные данные, перезаписывая при этом любые области, которые использовались кодом инициализации. Из-за установленного флага FINAL в заголовке код Boot ROM делает прыжок на EVT1 (0xFFA0 0000 для процессоров ADSP-BF533/BF534/BF536/BF537/BF538 и ADSP-BF539, 0xFFA0 8000 для процессоров ADSP-BF531/BF532), чтобы запустить на выполнение код приложения пользователя. [Декомпрессия файлов инициализации] Как указывалось выше, файл инициализации .dxe с поддержкой декомпрессии должен использоваться, когда генерируется файл образа загрузки со сжатыми потоками. Этот файл .dxe содержит в себе встроенную систему декомпрессии для распаковки сжатых потоков из этого образа загрузки. Рис. 3-25. Последовательность загрузки с обработкой сжатого потока загрузки ADSP-BF531/BF532/BF533/BF534/BF536/BF537. Файл инициализации .dxe с поддержкой декомпрессии может быть указан в разделе свойств загрузчика Load диалога Project Options приложения пользователя, или опцией командной строки -init filename.dxe для утилиты загрузки [4]. В комплект поставки VisualDSP++ включены файлы инициализации по умолчанию с поддержкой декомпрессии, которые будут использоваться, если не выбран никакой другой файл инициализации. Файлы инициализации .dxe по умолчанию с поддержкой декомпрессии сохранены в папке Blackfin\ldr\zlib, находящейся в каталоге инсталляции VisualDSP++. Все эти файлы .dxe по умолчанию собраны с поддержкой окна компрессии 9 (512 байт). Чтобы использовать другой размер окна компрессии, Вам понадобится пересобрать свой собственный инициализационный файл декомпрессии. Как это делается, см. в файле readme.txt, находящемся в папке Blackfin\ldr\zlib\src каталога установки VisualDSP++, или см. врезку "Изменение окна компрессии zlib". Размер окна может быть изменен слайдером "Compression Window Size" закладки Compression в разделе настроек Load диалога Project Options сжимаемого приложения, или опцией командной строки -compressWS # утилиты загрузки. Допустимый диапазон настройки размера окна компрессии находится в диапазоне от 8 до 15. [Ссылки] 1. VisualDSP++ 5.0 Loader and Utilities Manual site:analog.com. |