pvvx
Активный участник сообщества
Но сегодня нет исходников BootLoader-а.
BootLoader загружается из ROM-BIOS и находится в начале Flash (см. RTL871x Flash Memory Map).
У BL существует несколько веток старта (см. RTL8710AF - загрузчик в ROM-BIOS).
Указатель на процедуру стандартной загрузки с Flash находится первым в таблице BL. Другие указатели обычно содержат на одну и ту-же ссылку на процедуру старта используемую для отладки запуска кода из RAM, минуя загрузку из Flash.
Какие ныне проблемы с BL:
Область загрузки BL в RAM используется некоторыми процедурами из ROM-BIOS.
К примеру, содержит в своем теле по фиксированным адресам данные для ROM-BIOS (хотя-бы громадную структуру _reent *rtl_impure_ptr + _reent impure_data от общей либы СИ) и если они затерты и не восстановлены, то получите крах системы SDK в lib_rtlstd.a (процедуры rtl_printf и т.д.).
Расстановку переменных, задействованных в ROM-BIOS и находящихся в теле BL уже составил. Но пока не нашел как сделать линковку в GCC с такими условиями:
Возьмем, в качестве примера, тот-же указатель rtl_impure_ptr на структуру impure_data. Макрос инициализации есть стандартных исходниках либ GCC.
#include <reent.h>
struct _reent __attribute__((section(".libc.reent"))) impure_data = _REENT_INIT(impure_data);
С помощью __attribute__((section(".libc.reent"))) мы задали область линковки для этого блока. Он может находится где угодно в RAM - ROM-BIOS лезет к нему через указатель и у нас с ним проблем нет.
Теперь нам надо создать указатель на эту структуру, но положить практически посередине (!) тела BootLoader-a, чтобы абсолютный адрес у него был 0x10001c60.
Как это указать линковщику и в кодах СИ, чтобы данные и коды в BL обходили его?
Делать дыру в несколько килобайт ради него в сегменте BL, как это делает Ameba нет никакого желания. Прилинковать все данные от ROM-BIOS мы тоже не можем - нету куска с новыми процедурами расположенными в хвосте ROM. rom.a - это только первая редакция маски ROM, за ней дописали ещё вторую версию и все чипы с ней.
См. отличия export-rom_v02.txt и export-rom_v03.txt. Часть раздробленных кусков обновления есть в rom_v01.nodbg.a (найдете сами). Исходников BL нет, т.к. нет правильного скрипта *.ld для GCC, а имеющиеся собираются в IAR с линковкой rom_v0x.a, а не указываются export-rom_v0x.txt в *.ld... Но и там выходят лишние килобайты, пропадает RAM из-за неиспользования (причуды линковки - на некоторые данные и процедуры есть ссылки из ROM-BIOS и других либ из которых собирался текущий BL, а ему они не требуются, т.к. вообще не используется. Далее стартует загрузчик SDK и дублирует эти данные и процедуры в новых местах RAM. Т.е. пропадает от 8-ми кило неиспользуемой RAM точно, хотя часть загрузчика затем затирается и используется как добавка к HEAP. В эти 8-мь кило влезет flasher по UART и т.д.).
BootLoader загружается из ROM-BIOS и находится в начале Flash (см. RTL871x Flash Memory Map).
У BL существует несколько веток старта (см. RTL8710AF - загрузчик в ROM-BIOS).
Указатель на процедуру стандартной загрузки с Flash находится первым в таблице BL. Другие указатели обычно содержат на одну и ту-же ссылку на процедуру старта используемую для отладки запуска кода из RAM, минуя загрузку из Flash.
Какие ныне проблемы с BL:
Область загрузки BL в RAM используется некоторыми процедурами из ROM-BIOS.
К примеру, содержит в своем теле по фиксированным адресам данные для ROM-BIOS (хотя-бы громадную структуру _reent *rtl_impure_ptr + _reent impure_data от общей либы СИ) и если они затерты и не восстановлены, то получите крах системы SDK в lib_rtlstd.a (процедуры rtl_printf и т.д.).
Расстановку переменных, задействованных в ROM-BIOS и находящихся в теле BL уже составил. Но пока не нашел как сделать линковку в GCC с такими условиями:
Возьмем, в качестве примера, тот-же указатель rtl_impure_ptr на структуру impure_data. Макрос инициализации есть стандартных исходниках либ GCC.
#include <reent.h>
struct _reent __attribute__((section(".libc.reent"))) impure_data = _REENT_INIT(impure_data);
С помощью __attribute__((section(".libc.reent"))) мы задали область линковки для этого блока. Он может находится где угодно в RAM - ROM-BIOS лезет к нему через указатель и у нас с ним проблем нет.
Теперь нам надо создать указатель на эту структуру, но положить практически посередине (!) тела BootLoader-a, чтобы абсолютный адрес у него был 0x10001c60.
Как это указать линковщику и в кодах СИ, чтобы данные и коды в BL обходили его?
Делать дыру в несколько килобайт ради него в сегменте BL, как это делает Ameba нет никакого желания. Прилинковать все данные от ROM-BIOS мы тоже не можем - нету куска с новыми процедурами расположенными в хвосте ROM. rom.a - это только первая редакция маски ROM, за ней дописали ещё вторую версию и все чипы с ней.
См. отличия export-rom_v02.txt и export-rom_v03.txt. Часть раздробленных кусков обновления есть в rom_v01.nodbg.a (найдете сами). Исходников BL нет, т.к. нет правильного скрипта *.ld для GCC, а имеющиеся собираются в IAR с линковкой rom_v0x.a, а не указываются export-rom_v0x.txt в *.ld... Но и там выходят лишние килобайты, пропадает RAM из-за неиспользования (причуды линковки - на некоторые данные и процедуры есть ссылки из ROM-BIOS и других либ из которых собирался текущий BL, а ему они не требуются, т.к. вообще не используется. Далее стартует загрузчик SDK и дублирует эти данные и процедуры в новых местах RAM. Т.е. пропадает от 8-ми кило неиспользуемой RAM точно, хотя часть загрузчика затем затирается и используется как добавка к HEAP. В эти 8-мь кило влезет flasher по UART и т.д.).
Последнее редактирование: