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

 
 
> Доступ к коду в программном загрузчике, C++, templates, bootloader
segment
сообщение Jan 27 2011, 12:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Есть простой программный загрузчик. В нем присутствует шаблонный класс со статическими методами для работы с какой-нибудь периферией. К примеру:
Код
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?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
jorikdima
сообщение Jan 27 2011, 12:54
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



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

В памяти будут находиться только реализации методов для конкретных параметров шаблона. Выгода потенциально может быть только если во второй программе используются реализации с теме же параметрами. Получится завязка между бутлодырем и загружаемой программой. Надо ли оно?
Если уж на то пошло, то делайте библиотеку, которая будет располагаться где-то в памяти по статическим адресам. Ей будут пользоваться как бутлодырь так и ПО. Но этот код не будет частью ни того, ни другого ПО. Как сделать такую либу с учетом того, что Вы пользуетесь шаблонами я не знаю sm.gif
Go to the top of the page
 
+Quote Post
segment
сообщение Jan 27 2011, 13:22
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Ну вот, к примеру, для специализации A<int> и A<bool> и среды Keil uVision. Просто КАК это сделать? Что нужно указывать и где?
Go to the top of the page
 
+Quote Post
akimych
сообщение Jan 28 2011, 22:06
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073



А это обязательно надо делать на шаблонах?
Даже если отвлечься от шаблонов. Через таблицу указателей или точку входа - это понятно.
А вот если просто есть несколько функций и хочется их вызывать?
Надо как-то сказать линкеру, что есть такие символы и находятся по таким адресам.
Применительно к кейлу для переменных есть атрибут _at, но не для функций.



Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 28 2011, 22:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Линкеру можно и ничего не говорить, если работать через указатели. Еще есть вариант использовать SWI.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 28 2011, 23:36
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Думается с шаблонами дело не прокатит. Они ведь рассчитаны на генерацию "на лету" и описаны в .h - файлах. Можно их обернуть в обычные функции и уже к ним обращаться через SWI, например, но вся эта конструкция сведет на нет эффективность их применения (в плане быстродействия).
Go to the top of the page
 
+Quote Post
akimych
сообщение Jan 28 2011, 23:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073



Я бы так и делал, но Сега видимо хочет другой вариант.
Кстати говоря, линкеру можно сказать, что где расположить.

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

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

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

Можно конечно придумать всякие хитрые способы, типа сгенерить по таблице символов исходник, который будет экспортировать нужные символы и код, обеспечивающий вызов родных методов.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jan 31 2011, 10:09
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



а не проще сделать типа
в загрузчике:

Код
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"
Go to the top of the page
 
+Quote Post

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

 


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


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