|
|
 |
Ответов
|
Nov 8 2007, 14:25
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Rst7 @ Nov 8 2007, 16:30)  Есть еще способ (без линкера):
((void(*)(void))0x10000000)(); Дык при желании можно не только без линкера обойтись - в принципе можно даже без компилятора.... Правильнее делать то и так, как Сергей Борщ написал.
Сообщение отредактировал Николай Z - Nov 8 2007, 14:25
|
|
|
|
|
Nov 8 2007, 15:09
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Rst7 @ Nov 8 2007, 17:41)  А если этот адрес не константа? В топе был вопрос про известный, фиксированный адрес... В вашем варианте - адрес не константа - надо сперва определить задачу. Вам мало просто прыгнуть на заданный адрес - надо же чтобы там лежали точки входа в программы иначе это не имеет смысла. Уточните Вашу задачу - получите и ответ. А так ничего кроме совета создать указатель функции, кторый вы сами и заполните любым нужным Вам значением, чтобы ее потом вызвать - вы вряд ли что-то услышите в ответ. Первое, что надо определить - а зачем вообще нужно вызывать функцию по некоему переменному адресу? У вас функции ползают по памяти что ли? У меня обычно нет и мне трудно сообразить - зачем мне вообще нужно делать вызовы по неким переменным адресам в общем случае.
|
|
|
|
|
Nov 8 2007, 16:33
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(aaarrr @ Nov 8 2007, 18:25)  Налили воды, однако  По-моему, вариант перехода ((void(*)(void))0x10000000)(); куда как лучше извратов с линкером. Нравится - так используйте... Никто не против... Только Вы быстро сами поймете, что чем меньше в проекте статически распределенных объектов, тем она удобнее и мобилнее и легче носится с одной архитектуры на другую. Это вовсе не вода. Это некоторый опыт, который даже не я собирал, а в общем-то все сообщество программистов от первого компьютера и до ныненшних дней. Статические адреса и распределения памяти - это кажется удобным только в простейших случаях. А с линкером - это как раз никакой не изврат, а можно сказать общее и классическое решение, которое приводит к гораздо меньшим проблемам, чем статическое определение адресов вызываемых функций прямо в коде на С. Сами достаточно быстро в этом убедитесь... И трех лет не пройдет как поймете, что рекомендация данная Вам выше - намного правильнее, чем то, что ам так понравилось... Так что - я ничего не имею против Вашего решения - набивайте себе шишки сами...
Сообщение отредактировал Николай Z - Nov 8 2007, 16:37
|
|
|
|
|
Nov 8 2007, 19:36
|

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

|
Цитата(aaarrr @ Nov 8 2007, 20:49)  Насчет переносимости уже сказали: поменяете компилятор (и трех лет не пройдет, ага  ), и Вам придется искать другое решение. Объясню, почему я пришел к такому решению. Потому что и IAR для AVR и WinAVR на конструкцию с константным указанием генерировали у меня один и тот же код - загрузку в Z и косвенный вызов. Вариант с линкером генерит честный RCALL. Это во-первых. Во-вторых. При портировании того же самого загрузчика с AVR на ARM я поменял константу в файле линкера. Констант там немного и они сгруппированы в одном месте - не нужно искать по всему исходнику. Исходник вообще не трогал - как там было Application(), так и осталось. Перейдя с IAR на WinAVR я нашел как определять символы линкеру (а это позволяет любой нормальный линкер) и снова никаких проблем. К слову, для AVR надо указывать адрес слова, хотя вся остальная адресация что у IAR, что у WinAVR идет побайтно. Что касается IAR для ARM, там тоже вызов через константу компилится во что-то не совсем красивое. Такие пироги.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 8 2007, 23:03
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Сергей Борщ @ Nov 8 2007, 22:36)  Объясню, почему я пришел к такому решению. Потому что и IAR для AVR и WinAVR на конструкцию с константным указанием генерировали у меня один и тот же код - загрузку в Z и косвенный вызов. Вариант с линкером генерит честный RCALL. По-моему, издержек в любом случае будет немного. Не такой уж частый случай. Цитата(Сергей Борщ @ Nov 8 2007, 22:36)  При портировании того же самого загрузчика с AVR на ARM я поменял константу в файле линкера. Констант там немного и они сгруппированы в одном месте - не нужно искать по всему исходнику. Исходник вообще не трогал - как там было Application(), так и осталось. Перейдя с IAR на WinAVR я нашел как определять символы линкеру (а это позволяет любой нормальный линкер) и снова никаких проблем. Ну, #define еще никто не отменял, а в данном случае это будет родной define, а не опция линкера. А если бы Вы переходили на ADS/RVDS, то проблемы бы возникли - не знаю, как протащить там подобную конструкцию, кроме как через symdefs-файл.
|
|
|
|
|
Nov 8 2007, 23:29
|

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

|
Цитата(aaarrr @ Nov 9 2007, 01:03)  По-моему, издержек в любом случае будет немного. Не такой уж частый случай. Да. Но если без напряжения можно сделать лучше - почему бы и да? А не пытаюсь никого отговаривать. Просто мне так кажется логичнее - функция располагается в другом модуле, адрес ее фиксированный, на мой взгляд проставлять в код адрес такой функции скорее задача линкера. Да и прозрачнее как-то код смотрится - объявлена функция, явно указано, что она внешняя, и вызов. Аналогично можно объявлять и функции с параметрами, причем указывать фиктивные самодокументирующие имена параметров. Кстати, вызов IAP у LPC таким образом тоже красиво получается: Код // (Philips) Status Codes enum iap_status_t { CMD_SUCCESS, INVALID_CMD, SRC_ADDR_ERROR, DST_ADDR_ERROR, SRC_ADDR_NOT_MAPPED, DST_ADDR_NOT_MAPPED, COUNT_ERROR, INVALID_SECTOR, SECTOR_NOT_BLANK, SECTOR_NOT_PREPARED, COMPARE_ERROR, BUSY, PARAM_ERROR, ADDR_ERROR, ADDR_NOT_MAPPED, CMD_LOCKED, INVALID_CODE, INVALID_BAUD_RATE, INVALID_STOP_BIT, CODE_READ_PROT_ENABLED, MAX_ERROR };
enum iap_cmd_t { PREPARE = 50, COPY, ERASE, BLANK_CHECK, GET_PART_ID, GET_BOOT_VER, COMPARE, SIZE_ALIGN = 0xFFFFFFFF };
#pragma pack (push,4) struct iap_command_t { iap_cmd_t Command; uint32_t Param[4]; }; struct iap_result_t { iap_status_t Status; uint32_t Result[4]; }; #pragma pack (pop) extern "C" __thumb void IAP(iap_command_t *params, iap_result_t *result); /* in .xcl: // IAP routine, thumb code -DIAP=7FFFFFF1 */ . Цитата(aaarrr @ Nov 9 2007, 01:03)  Ну, #define еще никто не отменял, а в данном случае это будет родной define, а не опция линкера. Не спорю - можно и так. Ненаказуемо  Цитата(aaarrr @ Nov 9 2007, 01:03)  А если бы Вы переходили на ADS/RVDS, то проблемы бы возникли - не знаю, как протащить там подобную конструкцию, кроме как через symdefs-файл. Возможность-то наверняка есть, просто мы о ней (пока) не знаем. Хотя бы и через файл. P.S. Мнения четко разделились на два подхода. Вот пришел бы кто-нибудь умный, вроде ReAl, и растолковал ограничения и правильность каждого решения.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 9 2007, 02:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Сергей Борщ @ Nov 9 2007, 02:29)  Да. Но если без напряжения можно сделать лучше - почему бы и да? Чем лучше? ИМХО, задание левых символов для линкера - это изврат. Особенно, если имеешь дело с полудюжиной разных архитектур и, соответственно, разных линкеров. Цитата(Сергей Борщ @ Nov 9 2007, 02:29)  Аналогично можно объявлять и функции с параметрами, причем указывать фиктивные самодокументирующие имена параметров. То же самое легко делается дефайном: Код #define func(x, y) ((int(*)(int, int))0x10000000)((x), (y)) И объявить функцию в любом виде можно. Цитата(Сергей Борщ @ Nov 9 2007, 02:29)  Не спорю - можно и так. Ненаказуемо  Возможность-то наверняка есть, просто мы о ней (пока) не знаем. Хотя бы и через файл. Нет там такой возможности - только через symdefs, который в обычной жизни не нужен.
|
|
|
|
Сообщений в этой теме
VladislavS EWARM. Cделать переход по известному адресу? Nov 8 2007, 12:56 Сергей Борщ Цитата(VladislavS @ Nov 8 2007, 14:56) EW... Nov 8 2007, 13:03 VladislavS Спасибо. Сработало. Как все просто когда знаешь... Nov 8 2007, 13:23    Rst7 Цитата(Николай Z @ Nov 8 2007, 17:09) В т... Nov 8 2007, 15:23     VladislavS Цитата(Rst7 @ Nov 8 2007, 18:23) Представ... Nov 8 2007, 20:01          singlskv Цитата(Сергей Борщ @ Nov 9 2007, 02:29) P... Nov 9 2007, 00:24           Николай Z Цитата(aaarrr @ Nov 9 2007, 05:22) ИМХО, ... Nov 9 2007, 09:56 VladislavS Если делать на классическом С, то что-то типа того... Nov 9 2007, 07:09 Rst7 Цитата(Николай Z @ Nov 9 2007, 11:56) Мог... Nov 9 2007, 11:23 Николай Z Цитата(Rst7 @ Nov 9 2007, 14:23) Давайте,... Nov 9 2007, 11:44  Rst7 Цитата(Николай Z @ Nov 9 2007, 13:44) А в... Nov 9 2007, 12:12   Николай Z Цитата(Rst7 @ Nov 9 2007, 15:12) Мне нрав... Nov 9 2007, 13:26    Rst7 Цитата(Николай Z @ Nov 9 2007, 15:26) Нра... Nov 9 2007, 13:30   Николай Z Цитата(Rst7 @ Nov 9 2007, 16:30) Видимо я... Nov 9 2007, 13:39 Rst7 Цитата(Николай Z @ Nov 9 2007, 15:39) Я н... Nov 9 2007, 13:46 Николай Z Цитата(Rst7 @ Nov 9 2007, 16:46) А теперь... Nov 9 2007, 16:23 zltigo Да расшумелись .
В общем случае несомненно (для ме... Nov 9 2007, 14:48 VladislavS Да ладно вам на пустом месте ругаться... Чтобы ник... Nov 9 2007, 17:53 Николай Z Цитата(VladislavS @ Nov 9 2007, 20:53) Да... Nov 9 2007, 20:27 VladislavS А меня вот заинтересовал вопрос перемещаемости код... Nov 10 2007, 05:56 Николай Z Цитата(VladislavS @ Nov 10 2007, 08:56) А... Nov 10 2007, 08:59 Сергей Борщ Цитата(VladislavS @ Nov 10 2007, 07:56) А... Nov 10 2007, 10:43  Николай Z Цитата(Сергей Борщ @ Nov 10 2007, 13:43) ... Nov 10 2007, 11:52   Сергей Борщ Цитата(Николай Z @ Nov 10 2007, 13:52) Я ... Nov 10 2007, 12:51    Николай Z Цитата(Сергей Борщ @ Nov 10 2007, 15:51) ... Nov 11 2007, 08:33  zltigo Цитата(Сергей Борщ @ Nov 10 2007, 12:43) ... Nov 10 2007, 13:04 Rst7 Особых проблем с изготовлением перемещаемого кода ... Nov 12 2007, 06:36 Николай Z Цитата(Rst7 @ Nov 12 2007, 09:36) Особых ... Nov 13 2007, 09:37 zltigo Цитата(Rst7 @ Nov 12 2007, 08:36) Особых ... Nov 13 2007, 09:51  Николай Z Цитата(zltigo @ Nov 13 2007, 12:51) Знани... Nov 13 2007, 12:30   zltigo Цитата(Николай Z @ Nov 13 2007, 14:30) Да... Nov 13 2007, 12:49    Николай Z Цитата(zltigo @ Nov 13 2007, 15:49) Ну в ... Nov 14 2007, 09:23 Rst7 ЦитатаА мы тут уже кинулись зачем-то разрешать зад... Nov 14 2007, 06:57 alexander55 Цитата(Rst7 @ Nov 14 2007, 09:57) А тут н... Nov 14 2007, 07:14 VladislavS Не, вопрос я задал вполне конкретный и получил отв... Nov 15 2007, 20:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|