Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

malloc / free
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16162
Страница 1 от 2

Автор:  TheWizard [ Нед Сеп 30, 2018 1:31 pm ]
Заглавие:  malloc / free

Код:
extern void *malloc(size_t size) {
    return pvPortMalloc(size);
}

extern void free(void *ptr) {
    vPortFree(ptr);
}

как да се замени правилно std malloc, free.... etc в СОРС кода ( bare-metal... минус линукс )
линкер --wrap-func e ясно... не го ща

гледам STDLIB.H файла:
Код:
void   free(void *);
void   *malloc(size_t);     


проба:
malloc(10); реве че няма heap...... демек търси стандартния malloc

преправих го на:
Код:
void   free(void *) __attribute__ ((weak));
void   *malloc(size_t)  __attribute__ ((weak));


и пей сърце... ама правилно ли е да "хакна" хeдъра с week атрибут
деасемблирам с ИДА-та и сичко си е ОК, липсват стандартните функции, заменени са с моите

Автор:  Реконструктор [ Нед Сеп 30, 2018 1:52 pm ]
Заглавие:  Re: malloc / free

Според гну документацията тоя атрибут е точно за това. Само дето трябва да си напишеш имплементацията.

Автор:  TheWizard [ Нед Сеп 30, 2018 1:59 pm ]
Заглавие:  Re: malloc / free

мдам
махнах моите функции и malloc/free липсва тотално... шибана работа

Автор:  TheWizard [ Нед Сеп 30, 2018 2:07 pm ]
Заглавие:  Re: malloc / free

става въпрос за MPLAB-X XC32
тези имат две библиотеки: std и Legacy
при std:
extern void *malloc (size_t);
Legacy:
void *malloc (size_t);

като има extern се заменят правилно :)
без extern-а си търси библиотеката

Автор:  TheWizard [ Нед Сеп 30, 2018 2:23 pm ]
Заглавие:  Re: malloc / free

то правилния въпрос е как да дефинирам моите функции да са по-мажорни спрямо библиотечните

Автор:  ДедоБоре [ Нед Сеп 30, 2018 3:44 pm ]
Заглавие:  Re: malloc / free

weak атрибута обозначава съответната функция като минорна, ако използва термина ти 'мажорна'. ако се появи друга функция без такъв атрибут, се линква тя. не съм изследвал какво става при две weak функции.

за теб би трябвало да е достатъчно просто на линкера да не му даваш стандартна библиотека, а твоя, в която да са разписани необходимите ти функции.

доста по-сериозен е въпроса как да си напише функции за алокиране и деалокиране, има различни модни тенденции и не може да ти се препоръча нещо, без да се знае спицифичната причина да се откажеш от стандартната библиотека.

Автор:  TheWizard [ Нед Сеп 30, 2018 5:17 pm ]
Заглавие:  Re: malloc / free

Би трябвало, но при липса на функция, компилатора отсвири и стандартната
Ще тествам по-обстойно...

В случая се ползва алокатора на freertos
Просто искам да заместя коректно стандартната... като и други не thread safe

Автор:  woody [ Нед Сеп 30, 2018 7:21 pm ]
Заглавие:  Re: malloc / free

Слагаш ред в линкер скрипта да зарежда твоя обектен файл, "INPUT" май беше (не ми се проверява).
Или линкваш твоята имплементация заедно с другите обектни, и би трябвало да не преравя библиотеката тогава, ако malloc()/free() са в библиотека.

Автор:  TheWizard [ Пон Окт 01, 2018 7:12 am ]
Заглавие:  Re: malloc / free

При използване на опер система reent-a е вързан с TCB и става още по гадно да се компилира друга статична библиотека.
Newlib, та дори и newlib-nano - са "огромни" за ембедед ( не линукс ) приложения а и са пригодени повече за posix
чудя се - що компилират посикс std lib за баре-метал, като се ползва само printf
ako може лесно да се заменят фунции, то те не thread-safe са около 10 иска само да се локнат със семафори

Автор:  Цецо [ Пон Окт 01, 2018 8:17 am ]
Заглавие:  Re: malloc / free

Ами май ще ти е по-лесно да смениш само printf-то, ако е само заради него. Woody имаше една хубава имплементация, ако не ти трябва float разпечатка.

Другото е да си направиш собствена имплементация на защитата със семафори. Можеш например да ги локализираш в статичен масив, ако ги знаеш горе - долу колко са.

Posix-a е убаво нещо, ама ...

Автор:  TheWizard [ Пон Окт 01, 2018 10:58 am ]
Заглавие:  Re: malloc / free

а как да го смена
във newlib е дефиниран с define, за моя сорс undef printf и предефине към thread-safe my_printf_r ще работи, обаче ако сложа няква външна библиотека която ползвa printf то линкера ще търси стандартната фунция (случи ми се веднъж )
в новия xc32 има подръжка на newlib и глей как са дефинирани

Код:
std   : extern int printf(const char *, ...);
legacy: int printf (const char *, ...); // некво наследство от mips, що ли
newlib: int   _EXFUN(printf, (const char *, ...)         #define _EXFUN(name, proto) name proto


extern вика некъде другаде e фунцията но приоритета се пада в библиотеката а не моя printf

единственото читаво "replace" e --wrap_func, но е на ниво линкер и ако има 10 врапа става мазало,
а на ниво компилатор що няма атрибут(мажор)

Автор:  Цецо [ Пон Окт 01, 2018 11:28 am ]
Заглавие:  Re: malloc / free

Аааа ти търсиш универсално решение за чужд код... Моя скромен опит показва, че такова НЯМА.

Каква ще е тая библиотека дето ползва printf??? Като нещо такова се прави грамотно и използваемо от чужди хора, на чужди железа, се оставя кукичка за тия неща. Ако някой ми е изкомпилирал библиотека дето да дири printf, то това нещо явно си е предназначено да се ползва в натив линукс среда, с всичките му там free и malloc благини върху джелезо с мемори мениджмънт и те така.... Не е за дребни контролери.

Аз затова и не харесах nuttx - като искам posix и linux физиономия, просто слагам linux и толкова.

Автор:  TheWizard [ Пон Окт 01, 2018 11:41 am ]
Заглавие:  Re: malloc / free

е сигурно е така ама за стандарт С от миналия век как не добавиха едно читаво пренасочване
тва са 5,6 критични фунции, които като се заместят си става "почти" thread-safe приложение за малки контролери
иначе трябва да компилирам всичкото std

не съм се хванал за Nuttx-a - просто експеримент, там го гледам е сменил цялото std за някакви си 10 mutex-lock/unlock

Автор:  Цецо [ Пон Окт 01, 2018 11:52 am ]
Заглавие:  Re: malloc / free

Еми то щото е ударил дървото, както и ти.

Автор:  miro_atc [ Пон Окт 01, 2018 2:44 pm ]
Заглавие:  Re: malloc / free

TheWizard написа:
не съм се хванал за Nuttx-a - просто експеримент, там го гледам е сменил цялото std за някакви си 10 mutex-lock/unlock


И аз се зачудех как хер Нут ще остави такива проблемчета ;-)

Принципно е така, всеки RTOS си заменя цялото std или не ползва емебедед версии като Newlib... И във всички останали случаи пак така се прави - или сменяш библиотечката изцяло или си ползваш твои функции. Това с "пренасочванията" е лоша идея и въпросът не опира само дали даден компилатор/линкер го може или не. Нали тоя код после трябва и да може да се поддържа ;-)

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/