inventor 0 10 августа, 2021 Опубликовано 10 августа, 2021 · Жалоба у меня есть loader, который умеет перепрошивать внутреннюю flash новой программой, вот такой вопрос возник, часть программы является библиотекой со своими функциями и прочими вещами. есть ли возможность сделать так, чтобы перепрошивать не всю программу, а только эту библиотеку? для этого как то нужно ее разместить на заранее выбранных адресах flash и в случае изменения библиотеки прошивать тогда не всю программу вместе с ней, а только ее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 августа, 2021 Опубликовано 10 августа, 2021 · Жалоба 25 минут назад, inventor сказал: и в случае изменения библиотеки прошивать тогда не всю программу вместе с ней, а только ее. А смысл? Сделать можно по-всякому, но зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 10 августа, 2021 Опубликовано 10 августа, 2021 · Жалоба потому что прошивка всего может занимать до получаса. удаленно делается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 августа, 2021 Опубликовано 10 августа, 2021 · Жалоба Наверное всё-таки не "прошивка", а "загрузка"? И в корректно построенном ПО, загрузка новой прошивки может вестись не прерывая работу рабочего ПО, в фоне. В отдельную область памяти. И только после загрузки всей прошивки: перезагрузка и запуск бутлоадера, прошивающего полученную прошивку во флешь программ. Можно конечно и разделить: компилить библиотеку как отдельную программу. С таблицей экспорта функций/данных. Вызов функций библиотеки - через эту таблицу экспорта. Регион размещения задаётся через конфиг-файл линкёра. Но граблей огребёте - однозначно. Из-за несовместимости "библиотеки" и остального кода. Поэтому это не решение, а костыль. Решение - см. выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 11 августа, 2021 Опубликовано 11 августа, 2021 · Жалоба я понимаю так, мне нужно сделать внешний кусок кода, сделать указатели на функции, привязать данные к определенным адресам и вызывать эти "внешние" функции. типа: 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 файл не будет производится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a_electronic 0 1 сентября, 2021 Опубликовано 1 сентября, 2021 · Жалоба 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...) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 1 сентября, 2021 Опубликовано 1 сентября, 2021 · Жалоба 11.08.2021 в 11:13, inventor сказал: как определить на какой адресе эти функции будут расположены? Почитайте тут. В вашем случае, собственно, загрузчика не будет. Будет просто проект, содержащий все нужные вам функции. И константную структуру из указателей на них, размещённую по фиксированному адресу во флеш-памяти, а не в ОЗУ, как предлагается в этой статье. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 1 сентября, 2021 Опубликовано 1 сентября, 2021 · Жалоба Спасиб! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 1 сентября, 2021 Опубликовано 1 сентября, 2021 · Жалоба в файле 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться