Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Доступ к коду в программном загрузчике
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
segment
Есть простой программный загрузчик. В нем присутствует шаблонный класс со статическими методами для работы с какой-нибудь периферией. К примеру:
Код
template <class T>
class A
{
public:
    static T read( void );
    static void write( T value );
};

В коде загрузчика используются его методы, к примеру:
Код
...
int var = A<int>::read();
A<int>::write(var);
...

Соответственно эти методы получили свое законное место во flash пространстве бутлоадера.

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

- Как указать чтобы методы этого класса и его члены находились с заданного адреса?
- Как в программе указать, что класс А (статические методы и члены) находятся где-то там во flash?

jorikdima
Цитата(Сега @ Jan 27 2011, 15:35) *
- Как указать чтобы методы этого класса и его члены находились с заданного адреса?
- Как в программе указать, что класс А (статические методы и члены) находятся где-то там во flash?

В памяти будут находиться только реализации методов для конкретных параметров шаблона. Выгода потенциально может быть только если во второй программе используются реализации с теме же параметрами. Получится завязка между бутлодырем и загружаемой программой. Надо ли оно?
Если уж на то пошло, то делайте библиотеку, которая будет располагаться где-то в памяти по статическим адресам. Ей будут пользоваться как бутлодырь так и ПО. Но этот код не будет частью ни того, ни другого ПО. Как сделать такую либу с учетом того, что Вы пользуетесь шаблонами я не знаю sm.gif
segment
Ну вот, к примеру, для специализации A<int> и A<bool> и среды Keil uVision. Просто КАК это сделать? Что нужно указывать и где?
akimych
А это обязательно надо делать на шаблонах?
Даже если отвлечься от шаблонов. Через таблицу указателей или точку входа - это понятно.
А вот если просто есть несколько функций и хочется их вызывать?
Надо как-то сказать линкеру, что есть такие символы и находятся по таким адресам.
Применительно к кейлу для переменных есть атрибут _at, но не для функций.



aaarrr
Цитата(akimych @ Jan 29 2011, 01:06) *
А вот если просто есть несколько функций и хочется их вызывать?
Надо как-то сказать линкеру, что есть такие символы и находятся по таким адресам.
Применительно к кейлу для переменных есть атрибут _at, но не для функций.

Линкеру можно и ничего не говорить, если работать через указатели. Еще есть вариант использовать SWI.
sergeeff
Думается с шаблонами дело не прокатит. Они ведь рассчитаны на генерацию "на лету" и описаны в .h - файлах. Можно их обернуть в обычные функции и уже к ним обращаться через SWI, например, но вся эта конструкция сведет на нет эффективность их применения (в плане быстродействия).
akimych
Я бы так и делал, но Сега видимо хочет другой вариант.
Кстати говоря, линкеру можно сказать, что где расположить.

Цитата
- Как указать чтобы методы этого класса и его члены находились с заданного адреса?

В кейле можно указать для каждого файла, в какие адреса его грузить. Указывается в опциях файла по правой кнопке.
Но толку от этого мало, т.к. никто не мешается расположить эти методы как угодно внутри отведенного пространства, т.е. будет зависеть от настроек.
Либо каждый метод класть в отдельную секцию.
Цитата
- Как в программе указать, что класс А (статические методы и члены) находятся где-то там во flash?

более хитрая задача.

Можно конечно придумать всякие хитрые способы, типа сгенерить по таблице символов исходник, который будет экспортировать нужные символы и код, обеспечивающий вызов родных методов.
Alechek
а не проще сделать типа
в загрузчике:

Код
static vodid FuncA (void);
static vodid FuncB (void);

struct shared_functions {
  void (*FuncA)(void);
  void (*FuncB)(void);
}

#pragma location=".funcvectors"
static const struct shared_functions SharedFunctions = {FuncA, FuncB};


а в приложении

Код
__noinit const struct shared_functions * SharedFunctions = ".funcvectors"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.