реклама на сайте
подробности

 
 
> как передать управление другому main?
Freeuser
сообщение Jan 27 2010, 11:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Имеется 2 бинарника, один заливаем в начало флеши, второй в конец. При запуске стартует тот что в начале. А как сделать так, чтобы затем управление передавалось бинарному файлу, который в конце флеши лежит???
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
aaarrr
сообщение Jan 27 2010, 11:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Сделать загрузчик, который будет передавать управление кому надо. Т.е. всего 3 "бинарника".

Ну или просто передать управление из первого второму, позаботившись предварительно, чтобы эта передача не вызвала катастрофических последствий (деинициализировать периферию и т.п).
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 11:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Я неточно изложил вопрос, извиняюсь. 1 - это проект, который можно править в компиляторе, получить бинарный файл, и заливать в начало флешь. а 2 - это именно бинарный файл, исходников его нет. так вот, возможно ли из 1 - го проекта при определенных условиях передать управление второй прошивке?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 27 2010, 11:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Freeuser @ Jan 27 2010, 14:47) *
передать управление второй прошивке?

Легко, это одна команда jmp. Только вот работать та "прошивка" размещенная фиг знает где, а не там, где должна, не будет. Совсем не будет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 11:56
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



А почему не будет???
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Jan 27 2010, 12:19
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Если тот бинарник не написан специально для того чтобы работать не зависимо от стартового адреса, тогда точно не будет.
Наверняка, в обычной, среднестатистической программе где либо используются абсолютные адреса функций/констант... абсолютные, т.е. определенные на этапе компиляции, а т.к. вы хотите загружать программу не по ее предполагаемому на этапе компиляции стартовому адресу а черт-те куда, соответсвенно содержимое памяти по таким адресам будет черт-те что smile.gif
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 12:25
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Хм...теперь ясно..
А как можно поменять стартовый адрес программы на этапе компиляции? Компилятор кейл.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Jan 27 2010, 12:37
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



сделай свой скаттер файл и на вкладке 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)), в которой содержится у меня стартап код и вектора сброса и прерываний.
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 12:46
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Да, спасибо! Только что сам залез в кейл, и нашел там эти настройки. И если я допустим, создам 2 одинаковых проекта, с разницей лишь в стартовых адресах, и запишу обе программы по своим адресам, то смогу переключаться с одной на другую?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 27 2010, 12:49
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да. Только область векторов должна быть или универсальная, или храниться в RAM.
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 12:53
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Универсальная - то есть одна для двух программ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 27 2010, 12:58
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Freeuser @ Jan 27 2010, 15:53) *
Универсальная - то есть одна для двух программ?

Универсальная - то есть позволяющая передать управление из вектора тем или иным способом, без жестких переходов типа "b handler".
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 13:15
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



пока не понятно, но разберусь я думаю...спасибо!
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 27 2010, 14:43
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



в контроллере сейчас работают 2 разных приложения, переключаясь поочередно между собой, оба созданы в кейле, и записаны на разные адреса. и при включении начинает работать 1-е приложение. А для того чтобы грузить при включении сразу второе, нужно направить на него вектор ресет, я так понимаю. А как это сделать в кейле?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2010, 15:56
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Jan 28 2010, 07:21
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



понятно..спасибо. буду делать как Вы посоветовали.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016