Romanello 0 4 октября, 2007 Опубликовано 4 октября, 2007 · Жалоба BootLoader,API(IAP),типа дисковая ось. Точно, мне нужно создать типа этого. Будет по определленному адресу вызов процедуры, а она в зависимости от параметров будет уже вызывать нужные функции. Так вот эта функция и нужные функции будут компилироваться вместе (поэтому я думаю таблица переходов не нужна, компилятор сам подставит нужные значения), а программу которая будет вызывать эту функцию будет писаться отдельно и соответственно компилироваться тоже будет отдельно, поэтому я и хочу узнать как мне разместить функцию по указанному адресу и как ее вызвать?. Если можно напишите просто пример Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 4 октября, 2007 Опубликовано 4 октября, 2007 · Жалоба Будет по определленному адресу вызов процедуры, а она в зависимости от параметров будет уже вызывать нужные функции.Т.е. то, что линкер мог сделать на этапе компиляции (вызвать сразу нужную функцию), ваша функция будет делать на этапе выполнения. А смысл? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wano 0 4 октября, 2007 Опубликовано 4 октября, 2007 · Жалоба А например если зашить во флэш где-нить в конец к примеру UCOS :) ,а дальше возиться только с графикой. Чего каждый раз ось заливать,когда время тратит.Ну эт я образно конечно тут ляпнул. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shkn 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба Можно поиграться с прагмой, например #pragma userclass (CODE = CODE_FLASH), где FLASH задаешь в настройках проекта закладка ликера. для возврата в исходное значение #pragma userclass (CODE = default) посмотри http://electronix.ru/forum/index.php?showtopic=36070, может наведет на правильную мысль Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iit 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба Пример скаттер файла. FLASH_LOAD 0x00 0x40000 { ROM_EXEC 0x00 0x10000 { startup.o (INIT,+FIRST) ; executed on hard reset *(+RO) } BOOT_EXEC 0x10000 0x10000 { project_set.o(boot_func); В этой области размещается наша функция } RAM 0x40000000 0x4000 { * (+RW, +ZI) ; any remaining code inc C lib. } EEPROM 0xF0000000 UNINIT 0x100 { project_set.o(eeprom_config) } EXRAM 0x81000000 0x200000 { ExtRAM.o (+RW, +ZI) } } В project_set.c //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- #pragma arm section code = "boot_func", rwdata = "boot_func" UINT32 boot_fun(UINT32 code) { if (code != 0) { return 0; } else { return 10; } } #pragma arm section code, rwdata, zidata //----------------------------------------------------------------------------- Выполняем буилд проекта и смотрим в мап-файле boot_fun 0x00010000 ARM Code 28 project_set.o(boot_func) Всех делов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Romanello 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба Спасибо за ответы буду разбираться и пробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virt 0 5 октября, 2007 Опубликовано 5 октября, 2007 (изменено) · Жалоба Все очень просто. Описываеш например как: void (* fptr)(); ну и например void f1 (void) { //Do something } Инициализация делается так: fptr = &f1; Вызывается также как обычная функция: fptr(); можно также передавать и получать параметры: тип (* fptr)(список переменных).... Таким методом вызывать функцию через указатель... Далее можно сделать либо список, либо таблицу указателей. И работать с ними. У меня на таймере так куча задач реализовано. Причем можна добавлять задачу, изменять дискрет выполнения в мсек., включать/выключать, удалять из списка. Функции на выполнение все внешние... Изменено 5 октября, 2007 пользователем VIRt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolayZ 0 5 октября, 2007 Опубликовано 5 октября, 2007 (изменено) · Жалоба Т.е. то, что линкер мог сделать на этапе компиляции (вызвать сразу нужную функцию), ваша функция будет делать на этапе выполнения. А смысл? Вот и я в полном недоумении - зачем это собственно надо... Если хочется - можно конечно задать в линкере фиксированное в памяти расположение секций программы... Но на кой это надо - не понимаю абсолютно... Логичнее поступать прямо наоборот. Изменено 5 октября, 2007 пользователем Николай Z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 28 января, 2008 Опубликовано 28 января, 2008 (изменено) · Жалоба Не стал плодить тем. Пишу в похожую. void (* fptr)(); ну и например void f1 (void) { //Do something } Инициализация делается так: fptr = &f1; Вызывается также как обычная функция: fptr(); Возникла необходимость делать абдейты на процессоре LPC2378 на IAR. Для этого был сделан загрузчик, который находится в неперезаписываемой области Flash. Кроме перепрограммирования оставшейся Flash он еще должен уметь вызывать пару функций из перезаписываемой области. Для этого по фиксированному адресу в перезаписываемой Flash должны находиться указатели на функции, которые могут находиться в коде где угодно (функции типа void func(void)). Прочитал http://electronix.ru/forum/index.php?showt...amp;mode=linear Попробовал разместить void f1 (void) в памяти. Просто вот так работает void start(void) void (* fptr)() = &start; А вот так нет. #pragma location = "MYROM" __root const void (* fptr)() = &start; Помогите пожалуйста победить эту штуку :05: Изменено 28 января, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 30 января, 2008 Опубликовано 30 января, 2008 (изменено) · Жалоба Победил!!! Так как адрес у функции 32-разрядный, преобразовал его в DWORD, а при вызове преобразую обратно. Вот кусок кода: void start(void) { } #pragma location = "CODE" __root const dword StartPointer = (dword)&start; void (* fptr)(); void main(void) { fptr = (void(*)())StartPointer; TargetInit(); fptr(); while(1); } При вызове fptr(), вызывается start(); Изменено 30 января, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться