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

Перепрошивка части программы

у меня есть loader, который умеет перепрошивать внутреннюю flash новой программой,

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

есть ли возможность сделать так, чтобы перепрошивать не всю программу, а только эту библиотеку?

для этого как то нужно ее разместить на заранее выбранных адресах flash и в случае изменения библиотеки

прошивать тогда не всю программу вместе с ней, а только ее.

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


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

25 минут назад, inventor сказал:

и в случае изменения библиотеки

прошивать тогда не всю программу вместе с ней, а только ее.

А смысл?

Сделать можно по-всякому, но зачем?

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


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

потому что прошивка всего может занимать до получаса.

удаленно делается

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


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

Наверное всё-таки не "прошивка", а "загрузка"?

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

 

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

Регион размещения задаётся через конфиг-файл линкёра.

Но граблей огребёте - однозначно. Из-за несовместимости "библиотеки" и остального кода. Поэтому это не решение, а костыль. Решение - см. выше.

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


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

я понимаю так, мне нужно сделать внешний кусок кода, сделать указатели на функции, привязать данные к определенным адресам

и вызывать эти "внешние" функции.

типа: 

pragma default_function_attributes = @ "MY_FUNC"
static int test(int a, int b)
{
  return a + b;
}
#pragma default_function_attributes =


typedef int (fptr)(int, int);


int main(void)
{
    int c;
    fptr *myfunc = (fptr*)0x08080001;
    
    c = myfunc(5,6);

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

и как определить на какой адресе эти функции будут расположены? ведь если сделать этот бинарник map файл не будет производится?

 

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


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

On 8/11/2021 at 11:13 AM, inventor said:

 

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

и как определить на какой адресе эти функции будут расположены? ведь если сделать этот бинарник map файл не будет производится?

 

Это лучше оформить как внешнюю либу по типу .dll, разместив ее в отдельных секторах флеша. Либу должна содержать таблицу экспортируемых функций, размещенную по определенному фиксированному адресу линкерным скриптом
   
.my_lib_funcs 0x......:
   {
       . = ALIGN(4);
    KEEP(*(.my_lib_funcs))
    . = ALIGN(4);   
   } >FLASH

В коде либы определить таблицу указателей на функции.

#define _MY_LIB_FUNC    __attribute__ ((section(".my_lib_funcs")))

const _MY_LIB_FUNC BOOT_FS MyLibFunc = {Func1, Func1, ....., NULL};

Скомпилированный код перегнать в бинарник objcopy с ключом -O binary. Полученный бинарник можно удаленно зашить куда угодно в пределах разумного.

В основном софте ваяем раздел импорта.

Хидер, в котором пототипы и фиксированные указатели.

typedef void (*pFunc1)(......);
typedef void (*pFunc2)(......);
typedef void (*pFunc3)(......);
....

#define _myFync1(x, y...)    ((pFunc1)0xaddr_table)(x, y...)
#define _myFync2(x, y...)    ((pFunc2)0xaddr_table+4)(x, y...)
#define _myFync3(x, y...)    ((pFunc3)0xaddr_table+8)(x, y...)

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


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

11.08.2021 в 11:13, inventor сказал:

как определить на какой адресе эти функции будут расположены?

Почитайте тут. В вашем случае, собственно, загрузчика не будет. Будет просто проект, содержащий все нужные вам функции. И константную структуру из указателей на них, размещённую по фиксированному адресу во флеш-памяти, а не в ОЗУ, как предлагается в этой статье.

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


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

в файле bl_export.c

//-----------------------------------------------------------------------------
//	APPLICATION
//-----------------------------------------------------------------------------
#ifndef IS_BOOTLOADER
const volatile sBL_EXPORT	bl_export __attribute__((used, section(".bl_export")));

//-----------------------------------------------------------------------------
//	BOOTLOADER
//-----------------------------------------------------------------------------
#else // IS_BOOTLOADER

const sBL_EXPORT bl_export_func __attribute__((used, section(".bl_export"))) =
{
	&set_pin,			// bl_set_pin
	&get_pin,			// bl_get_pin
};

#endif // IS_BOOTLOADER

в файле bl_export.h

//-----------------------------------------------------------------------------
// Описание типов функций
//-----------------------------------------------------------------------------
typedef void t_bl_set_pin(const WORD pin, const BYTE value);
typedef int t_bl_get_pin(const WORD pin);

//-----------------------------------------------------------------------------
//	typedef struct sBL_EXPORT
//-----------------------------------------------------------------------------
typedef struct sBL_EXPORT
{
	t_bl_set_pin		*bl_set_pin;
	t_bl_get_pin		*bl_get_pin;
};

в приложении

bl_export.bl_set_pin(WORKLED_PIN, wl_state? 1 : 0);

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

MEMORY
{
	RAM (xrw)		: ORIGIN = 0x20000000, LENGTH = 32K
	FLASH (rx)		: ORIGIN = 0x08000000, LENGTH = 16K - 240 - 16
	BL_EXPORT(rw!x)		: ORIGIN = 0x08003F00, LENGTH = 240
}

SECTIONS
{
  .bl_export :
  {
    KEEP(*(.bl_export));
  } >BL_EXPORT
}

скрипт линкера приложения

MEMORY
{
	RAM (xrw)		: ORIGIN = 0x20000000, LENGTH = 32K
	BOOTLOADER (rx)		: ORIGIN = 0x08000000, LENGTH = 16K - 240 - 16
	BL_EXPORT(rw!x)		: ORIGIN = 0x08003F00, LENGTH = 240
}

SECTIONS
{
  .bl_export (NOLOAD) :
  {
    KEEP(*(.bl_export));
  } >BL_EXPORT
}

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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