Указатель функции или таблица перехода

Прежде чем задать вопрос, позвольте мне предоставить некоторые сведения:

Я читал техническую статью, касающуюся Autosar, которая предлагает подход Plug and Play для программных компонентов прикладного уровня. По сути, в статье предлагалось разделить память на отдельные компоненты и запрограммировать /прошить только те компоненты, которые были изменены, а не весь образ программного обеспечения. Это сэкономит время на перепрограммирование во время визита к дилеру. Теперь, поскольку может быть изменение адреса перепрограммируемых функций, это вызовет проблемы, когда эти измененные функции вызываются функциями, которые находятся в другом разделе (разделе памяти). В статье предлагается решение этого подхода с помощью таблицы переходов/перенаправлений, которая находится по фиксированному адресу и содержит адрес обновленной функции.

Теперь позвольте мне перейти к части вопроса:

Я думал об этой проблеме не с точки зрения архитектуры Autosar, а с точки зрения встроенного инженера и думал, что этот подход будет работать, это добавит увеличения пропускной способности. Другой вариант, который, по моему мнению, можно было бы использовать, - это, вероятно, указатели на функции. Но потом я подумал, что в обычном сценарии это компоновщик, который заменяет имя функционального символа его фактическим адресом и, следовательно, сценарий, в котором функция A (которая находится в неизмененном разделе) инициализируется функцией B (которая находится в обновленном разделе и наверное по другому адресу) не получится.

Это, наконец, подводит меня к моим последним вопросам:

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

Я благодарю всех вас, кто был достаточно терпелив, чтобы ответить на такой длинный вопрос. Хотел бы я задать вопрос поменьше.


person sompat    schedule 13.07.2015    source источник
comment
Является ли статья, которую вы читали, общедоступной? Если да, укажите URL-адрес в вопросе.   -  person Jonathan Leffler    schedule 13.07.2015
comment
@Jonathan: Вот ссылка vector.com/portal/medien/cmc /нажмите/Вектор/   -  person sompat    schedule 13.07.2015
comment
Я добавил URL к вопросу. Пожалуйста, сделайте это сами в следующий раз — спасибо.   -  person Jonathan Leffler    schedule 13.07.2015


Ответы (1)


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

В следующем коде я предполагаю, что компонент находится по фиксированному адресу 0xf800 и что адреса функций этого компонента хранятся в начале этой памяти:

// Functions addresses table at 0xf800
// 0xf800 stores the @ of func1 of the component
// 0xf804 @func2
// 0xf808 @func3
// etc.

// Initialization of the pointers to function
// Here each function has a int as parameter and returns an int 
int (*func1)(int) = *((int(**)(int))(0xf800));
int (*func2)(int) = *((int(**)(int))(0xf804));
int (*func3)(int) = *((int(**)(int))(0xf808));

// Use of a pointer to call a function of the component
int result = func1(1234);
person Joël Hecht    schedule 13.07.2015
comment
Спасибо Джоэл. Это в том же духе, о чем я думал. Мое решение состоит в том, чтобы скомпилировать все компоненты вместе так, как мы делаем это сегодня, а затем использовать сценарий и файл сопоставления для исправления правильного адреса функции в фиксированном месте. Таким образом, я также экономлю косвенные затраты. Еще раз спасибо за изучение этого. - person sompat; 15.07.2015