Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как передать управление другому main?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Freeuser
Имеется 2 бинарника, один заливаем в начало флеши, второй в конец. При запуске стартует тот что в начале. А как сделать так, чтобы затем управление передавалось бинарному файлу, который в конце флеши лежит???
aaarrr
Сделать загрузчик, который будет передавать управление кому надо. Т.е. всего 3 "бинарника".

Ну или просто передать управление из первого второму, позаботившись предварительно, чтобы эта передача не вызвала катастрофических последствий (деинициализировать периферию и т.п).
Freeuser
Я неточно изложил вопрос, извиняюсь. 1 - это проект, который можно править в компиляторе, получить бинарный файл, и заливать в начало флешь. а 2 - это именно бинарный файл, исходников его нет. так вот, возможно ли из 1 - го проекта при определенных условиях передать управление второй прошивке?
zltigo
Цитата(Freeuser @ Jan 27 2010, 14:47) *
передать управление второй прошивке?

Легко, это одна команда jmp. Только вот работать та "прошивка" размещенная фиг знает где, а не там, где должна, не будет. Совсем не будет.
Freeuser
А почему не будет???
kosyak©
Если тот бинарник не написан специально для того чтобы работать не зависимо от стартового адреса, тогда точно не будет.
Наверняка, в обычной, среднестатистической программе где либо используются абсолютные адреса функций/констант... абсолютные, т.е. определенные на этапе компиляции, а т.к. вы хотите загружать программу не по ее предполагаемому на этапе компиляции стартовому адресу а черт-те куда, соответсвенно содержимое памяти по таким адресам будет черт-те что smile.gif
Freeuser
Хм...теперь ясно..
А как можно поменять стартовый адрес программы на этапе компиляции? Компилятор кейл.
kosyak©
сделай свой скаттер файл и на вкладке Linker, в настройках проекта укажи его.

вот например
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00201400 0x00000800  {   ; load region size_region
  ER_IROM1 0x00201400 0x00000800  { ; load address = execution address
   *.o (RESET, +First)
   .ANY (+RO)
   .ANY (+RW +ZI)
  }
}

стартовый адрес 0x00201400, в область памяти начиная с 0x00201400 и размером 0x00000800 байт будет "линковаться" вся программа, и код(.ANY (+RO)) и переменные (.ANY (+RW +ZI)). Первым линкер положит секцию RESET (*.o (RESET, +First)), в которой содержится у меня стартап код и вектора сброса и прерываний.
Freeuser
Да, спасибо! Только что сам залез в кейл, и нашел там эти настройки. И если я допустим, создам 2 одинаковых проекта, с разницей лишь в стартовых адресах, и запишу обе программы по своим адресам, то смогу переключаться с одной на другую?
aaarrr
Да. Только область векторов должна быть или универсальная, или храниться в RAM.
Freeuser
Универсальная - то есть одна для двух программ?
aaarrr
Цитата(Freeuser @ Jan 27 2010, 15:53) *
Универсальная - то есть одна для двух программ?

Универсальная - то есть позволяющая передать управление из вектора тем или иным способом, без жестких переходов типа "b handler".
Freeuser
пока не понятно, но разберусь я думаю...спасибо!
Freeuser
в контроллере сейчас работают 2 разных приложения, переключаясь поочередно между собой, оба созданы в кейле, и записаны на разные адреса. и при включении начинает работать 1-е приложение. А для того чтобы грузить при включении сразу второе, нужно направить на него вектор ресет, я так понимаю. А как это сделать в кейле?
Сергей Борщ
Цитата(Freeuser @ Jan 27 2010, 16:43) *
А для того чтобы грузить при включении сразу второе, нужно направить на него вектор ресет, я так понимаю. А как это сделать в кейле?
Это никак нельзя сделать не только в кейле, но и в кристалле. За исключением случая, когда приложения лежат в разных (внутреняя/внешняя) памятях и у процессора есть специальная нога для этого.
В вашем случае первое приложение сразу после старта должно проверять какой-либо признак, и по этому признаку идти дальше или передавать управление на вектор ресета второго приложения.
Freeuser
понятно..спасибо. буду делать как Вы посоветовали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.