Freeuser
Jan 27 2010, 11:31
Имеется 2 бинарника, один заливаем в начало флеши, второй в конец. При запуске стартует тот что в начале. А как сделать так, чтобы затем управление передавалось бинарному файлу, который в конце флеши лежит???
aaarrr
Jan 27 2010, 11:40
Сделать загрузчик, который будет передавать управление кому надо. Т.е. всего 3 "бинарника".
Ну или просто передать управление из первого второму, позаботившись предварительно, чтобы эта передача не вызвала катастрофических последствий (деинициализировать периферию и т.п).
Freeuser
Jan 27 2010, 11:47
Я неточно изложил вопрос, извиняюсь. 1 - это проект, который можно править в компиляторе, получить бинарный файл, и заливать в начало флешь. а 2 - это именно бинарный файл, исходников его нет. так вот, возможно ли из 1 - го проекта при определенных условиях передать управление второй прошивке?
zltigo
Jan 27 2010, 11:52
Цитата(Freeuser @ Jan 27 2010, 14:47)

передать управление второй прошивке?
Легко, это одна команда jmp. Только вот работать та "прошивка" размещенная фиг знает где, а не там, где должна, не будет. Совсем не будет.
Freeuser
Jan 27 2010, 11:56
А почему не будет???
kosyak©
Jan 27 2010, 12:19
Если тот бинарник не написан специально для того чтобы работать не зависимо от стартового адреса, тогда точно не будет.
Наверняка, в обычной, среднестатистической программе где либо используются абсолютные адреса функций/констант... абсолютные, т.е. определенные на этапе компиляции, а т.к. вы хотите загружать программу не по ее предполагаемому на этапе компиляции стартовому адресу а черт-те куда, соответсвенно содержимое памяти по таким адресам будет черт-те что
Freeuser
Jan 27 2010, 12:25
Хм...теперь ясно..
А как можно поменять стартовый адрес программы на этапе компиляции? Компилятор кейл.
kosyak©
Jan 27 2010, 12:37
сделай свой скаттер файл и на вкладке 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
Jan 27 2010, 12:46
Да, спасибо! Только что сам залез в кейл, и нашел там эти настройки. И если я допустим, создам 2 одинаковых проекта, с разницей лишь в стартовых адресах, и запишу обе программы по своим адресам, то смогу переключаться с одной на другую?
aaarrr
Jan 27 2010, 12:49
Да. Только область векторов должна быть или универсальная, или храниться в RAM.
Freeuser
Jan 27 2010, 12:53
Универсальная - то есть одна для двух программ?
aaarrr
Jan 27 2010, 12:58
Цитата(Freeuser @ Jan 27 2010, 15:53)

Универсальная - то есть одна для двух программ?
Универсальная - то есть позволяющая передать управление из вектора тем или иным способом, без жестких переходов типа "b handler".
Freeuser
Jan 27 2010, 13:15
пока не понятно, но разберусь я думаю...спасибо!
Freeuser
Jan 27 2010, 14:43
в контроллере сейчас работают 2 разных приложения, переключаясь поочередно между собой, оба созданы в кейле, и записаны на разные адреса. и при включении начинает работать 1-е приложение. А для того чтобы грузить при включении сразу второе, нужно направить на него вектор ресет, я так понимаю. А как это сделать в кейле?
Сергей Борщ
Jan 27 2010, 15:56
Цитата(Freeuser @ Jan 27 2010, 16:43)

А для того чтобы грузить при включении сразу второе, нужно направить на него вектор ресет, я так понимаю. А как это сделать в кейле?
Это никак нельзя сделать не только в кейле, но и в кристалле. За исключением случая, когда приложения лежат в разных (внутреняя/внешняя) памятях и у процессора есть специальная нога для этого.
В вашем случае первое приложение сразу после старта должно проверять какой-либо признак, и по этому признаку идти дальше или передавать управление на вектор ресета второго приложения.
Freeuser
Jan 28 2010, 07:21
понятно..спасибо. буду делать как Вы посоветовали.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.