CrossWorks + MT-Link (а также J-Link) повышение скорости загрузки на примере LPC2xxx http://upload.caxapa.ru/cw_and_mtlink_speed_up.zip
Я тут добился повышения скорости загрузки флэша с
~3,9kB/s до примерно 25kB/s обогнав раза в полтора
виглер (с ним ~16,5kB/s)
Способ состоит из 2-х этапов
1. Перевод способа загрузки флэша на загрузку через RAM.
2. Подмена jlinkarm.dll на обёрточную
Перевод способа загрузки флэша на загрузку через RAM.
В CW есть 2 способа работы с loader-ом
- Через ARM debug comms channel (По дефолту для большинства процев)
- Через буфер в RAM.
Для большинства процев работа идёт через ARM debug comms channel
как более быстрый (что не всегда так :) )
Переделать загрузчик на "буфер в RAM" очень просто, в CW для этого всё есть.
Я для этого создал отдельный загрузчик LoaderRam.exe
1. Копируем CW_HOME\targets\свой проц_контора\Loader.hzp
в CW_HOME\targets\свой проц_контора\LoaderRam.hzp
В этом файле
- заменяем все "loader_comm.c" на "loader_ram.c"
- заменяем все "Loader_MemoryMap.xml" на "LoaderRam_MemoryMap.xml"
- заменяем все "Loader.exe" на "LoaderRam.exe"
Ну и по желанию имя проекта можно изменить, я заменил
"Philips LPC210X Loader" на "Philips LPC210X LoaderRam"
2. Копируем CW_HOME\targets\свой проц_контора\Loader_MemoryMap.xml
в CW_HOME\targets\свой проц_контора\LoaderRam_MemoryMap.xml
В этом файле добавляем секцию в RAM ".comm_buffer" например так:
размер по рекомендации хелпа CW на loader чем больше тем лучше,
но в сумме с самим loader-ом он не должен превышать размера RAM проца
(или любого проца из семейства для универсальности).
Ну и
меняем на
3. Запускаем CW
Открываем в нём CW_HOME\targets\свой проц_контора\LoaderRam.hzp
Компилим. Должен появиться файл CW_HOME\targets\свой проц_контора\Release\LoaderRam.exe
4. Открываем в CW свой проект
В опциях своего проекта Progect Option -> Target устанавливаем
Loader File Path в $(StudioDir)/targets/свой проц_контора/Release/LoaderRam.exe
Loader File Type в "Ram Loader"
Пробуем зашить и... программирование должно пройти, но скорость ~3kB/s :(
Как оказалось потому что CW при записи флэша грузит данные в RAM ARM-а
не блоками а по одному слову! (хотя например сам loader в RAM закидывают
целым блоком)
Поэтому едем далее...
Подмена jlinkarm.dll на обёрточную
1. Переименовываем CW_HOME\bin\jlinkarm.dll в JLinkARM_orig.dll
2. Копируем в CW_HOME\bin\ обёрточную jlinkarm.dll (в архиве по ссылке)
И... вуаля! ~25kB/s
Наслаждайтесь! (С) Масяня :)
В архиве по ссылке пример всего перечисленного для LPC2ххх
Для других процев всё легко переделывается.
Моя обёрточная jlinkarm.dll писалась наскоряк в VS .NET 2003
возможно у Вас не прокатят какиенить зависимости и т.д.
Поэтому полезно её перекомпилять у себя, к тому же если проц
не LPC видимо надо поправить jwrapper.cpp, изменив константы:
#define RAM_RANGE_START_ADDR 0x40000000
#define RAM_RANGE_END_ADDR 0x4FFFFFFF
PS Используя описанный метод Вы действуете на свой страх и риск
PPS Дальнейшая модернизация приветствуется
PPPS Владельцы оригинальных J-Link-ов, давите на Segger - чё за фигня! :)
Почему JLINKARM_WriteDCC() такой медленный!
Владельцы лицензионного CW, давите на них! Почему пословно
пишут в RAM при программировании флэша через J-Link!