Перейти к содержанию
    

Как в Keil для ARM указать точное расположение процедуры в памяти FLASH

BootLoader,API(IAP),типа дисковая ось.

 

Точно, мне нужно создать типа этого. Будет по определленному адресу вызов процедуры, а она в зависимости от параметров будет уже вызывать нужные функции. Так вот эта функция и нужные функции будут компилироваться вместе (поэтому я думаю таблица переходов не нужна, компилятор сам подставит нужные значения), а программу которая будет вызывать эту функцию будет писаться отдельно и соответственно компилироваться тоже будет отдельно, поэтому я и хочу узнать как мне разместить функцию по указанному адресу и как ее вызвать?. Если можно напишите просто пример

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Будет по определленному адресу вызов процедуры, а она в зависимости от параметров будет уже вызывать нужные функции.
Т.е. то, что линкер мог сделать на этапе компиляции (вызвать сразу нужную функцию), ваша функция будет делать на этапе выполнения. А смысл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А например если зашить во флэш где-нить в конец к примеру UCOS :) ,а дальше возиться только с графикой. Чего каждый раз ось заливать,когда время тратит.Ну эт я образно конечно тут ляпнул.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно поиграться с прагмой, например

#pragma userclass (CODE = CODE_FLASH), где FLASH задаешь в настройках проекта закладка ликера.

 

для возврата в исходное значение

#pragma userclass (CODE = default)

 

посмотри http://electronix.ru/forum/index.php?showtopic=36070, может наведет на правильную мысль

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример скаттер файла.

 

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)

 

Всех делов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все очень просто. Описываеш например как:

 

void (* fptr)();

 

ну и например

 

void f1 (void) {

//Do something

}

 

Инициализация делается так:

 

fptr = &f1;

 

Вызывается также как обычная функция:

 

fptr();

 

можно также передавать и получать параметры:

тип (* fptr)(список переменных)....

 

Таким методом вызывать функцию через указатель...

Далее можно сделать либо список, либо таблицу указателей. И работать с ними.

У меня на таймере так куча задач реализовано. Причем можна добавлять задачу, изменять дискрет выполнения в мсек., включать/выключать, удалять из списка. Функции на выполнение все внешние...

Изменено пользователем VIRt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. то, что линкер мог сделать на этапе компиляции (вызвать сразу нужную функцию), ваша функция будет делать на этапе выполнения. А смысл?

 

Вот и я в полном недоумении - зачем это собственно надо... Если хочется - можно конечно задать в линкере фиксированное в памяти расположение секций программы... Но на кой это надо - не понимаю абсолютно...

Логичнее поступать прямо наоборот.

Изменено пользователем Николай Z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не стал плодить тем. Пишу в похожую.

 

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:

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Победил!!! Так как адрес у функции 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();

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...