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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как в Keil для ARM указать точное расположение процедуры в памяти FLASH
Romanello
сообщение Oct 4 2007, 12:39
Сообщение #16


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

Группа: Свой
Сообщений: 138
Регистрация: 10-03-05
Пользователь №: 3 204



Цитата(bodja74 @ Oct 4 2007, 14:52) *
BootLoader,API(IAP),типа дисковая ось.


Точно, мне нужно создать типа этого. Будет по определленному адресу вызов процедуры, а она в зависимости от параметров будет уже вызывать нужные функции. Так вот эта функция и нужные функции будут компилироваться вместе (поэтому я думаю таблица переходов не нужна, компилятор сам подставит нужные значения), а программу которая будет вызывать эту функцию будет писаться отдельно и соответственно компилироваться тоже будет отдельно, поэтому я и хочу узнать как мне разместить функцию по указанному адресу и как ее вызвать?. Если можно напишите просто пример
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 4 2007, 13:02
Сообщение #17


Гуру
******

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



Цитата(Romanello @ Oct 4 2007, 15:39) *
Будет по определленному адресу вызов процедуры, а она в зависимости от параметров будет уже вызывать нужные функции.
Т.е. то, что линкер мог сделать на этапе компиляции (вызвать сразу нужную функцию), ваша функция будет делать на этапе выполнения. А смысл?


--------------------
На любой вопрос даю любой ответ
"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
Wano
сообщение Oct 4 2007, 17:58
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



А например если зашить во флэш где-нить в конец к примеру UCOS smile.gif ,а дальше возиться только с графикой. Чего каждый раз ось заливать,когда время тратит.Ну эт я образно конечно тут ляпнул.
Go to the top of the page
 
+Quote Post
Shkn
сообщение Oct 5 2007, 04:52
Сообщение #19


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 28-08-07
Пользователь №: 30 105



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

для возврата в исходное значение
#pragma userclass (CODE = default)

посмотри http://electronix.ru/forum/index.php?showtopic=36070, может наведет на правильную мысль
Go to the top of the page
 
+Quote Post
iit
сообщение Oct 5 2007, 05:35
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 8-11-04
Из: Томск
Пользователь №: 1 070



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

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)

Всех делов.
Go to the top of the page
 
+Quote Post
Romanello
сообщение Oct 5 2007, 07:03
Сообщение #21


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

Группа: Свой
Сообщений: 138
Регистрация: 10-03-05
Пользователь №: 3 204



Спасибо за ответы буду разбираться и пробовать.
Go to the top of the page
 
+Quote Post
VIRt
сообщение Oct 5 2007, 10:45
Сообщение #22


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 28-03-06
Пользователь №: 15 573



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

void (* fptr)();

ну и например

void f1 (void) {
//Do something
}

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

fptr = &f1;

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

fptr();

можно также передавать и получать параметры:
тип (* fptr)(список переменных)....

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

Сообщение отредактировал VIRt - Oct 5 2007, 10:56
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Oct 5 2007, 11:00
Сообщение #23


Местный
***

Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930



Цитата(Сергей Борщ @ Oct 4 2007, 17:02) *
Т.е. то, что линкер мог сделать на этапе компиляции (вызвать сразу нужную функцию), ваша функция будет делать на этапе выполнения. А смысл?


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

Сообщение отредактировал Николай Z - Oct 5 2007, 11:01
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Jan 28 2008, 15:38
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



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

Цитата(VIRt @ Oct 5 2007, 13:45) *
[code]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.gif

Сообщение отредактировал Vitaliy_ARM - Jan 28 2008, 15:46


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Jan 30 2008, 22:20
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Победил!!! Так как адрес у функции 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 - Jan 30 2008, 22:21


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post

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

 


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


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