Dron_Gus 2 23 апреля, 2010 Опубликовано 23 апреля, 2010 · Жалоба Пилю менеджер кучи от zltigo. Решил добавить пару сервисных функций для отладки. В частности хочу знать, откуда был вызов на выделение памяти. Для этого как-то нужно выдернуть содержимое регистра LR. В асме не силен. Так что все потуги пока не увенчались успехом. Может кто подскажет обертку/функцию для получения LR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 23 апреля, 2010 Опубликовано 23 апреля, 2010 · Жалоба Может кто подскажет обертку/функцию для получения LR? Компилятор-то как зовут? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 23 апреля, 2010 Опубликовано 23 апреля, 2010 · Жалоба Примерно вот так: inline __attribute__((__always_inline__)) uint32_t get_return_address() { unsigned int ret; __asm__ __volatile__ ("mov %0, LR" : "=r"(ret) ); return ret - 4; } void __attribute__((__noinline__)) print_calee(void) { volatile uint32_t ret = get_return_address(); uart << "called from \t"; uart.put_hex(ret); } void test1(void) { print_calee(); } void test2(void) { print_calee(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 23 апреля, 2010 Опубликовано 23 апреля, 2010 · Жалоба Пилю менеджер кучи от zltigo. Вообще-то проще и уж точно удобнее для отладки, передавать уже готовый указатель на владельца, что и сделано через void *owner в функции void *malloc_z( heap_t *heap, size_t size, int type, void *owner ); При этом у меня владельцем обычно является указатель на TCB задачи. Хотя естественно, можно и хоть указатель на имя подставлять, хоть явно адрес вызывающей подпрограммы , а не вытаскивать его постфактум. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 23 апреля, 2010 Опубликовано 23 апреля, 2010 · Жалоба Примерно вот так:... Вот так лучше: inline __attribute__((__always_inline__)) uint32_t get_return_address() { unsigned int ret; __asm__ __volatile__ ("sub %0, LR, #4" : "=r"(ret) ); return ret; } Вообще-то проще и уж точно удобнее для отладки, передавать уже готовый указатель на владельца Если есть такая возможность, то конечно лучше так. Потому что адрес возврата может испортиться по ходу выполнения malloc (потому приходится его извлекать в самом начале), а параметр уж никуда не денется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorsk 0 24 апреля, 2010 Опубликовано 24 апреля, 2010 · Жалоба Если компилятор от Keil/ARM, то есть интринсик __return_address(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xyzzy 0 24 апреля, 2010 Опубликовано 24 апреля, 2010 · Жалоба Если компилятор от Keil/ARM, то есть интринсик __return_address(). А если gcc, то __builtin_return_address(unsigned in level) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 25 апреля, 2010 Опубликовано 25 апреля, 2010 · Жалоба Спасибо всем! Компиляторы Keil и CrossWorks (GCC). По поводу достаточности указателя на TCB задачи - не всегда достаточно. Во-первых у меня некоторое выделение происходит еще вне задач, потом и в задачах бывает по несколько вызовов. Поэтому найти "неправильный" вызов проще по адресу возврата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 25 апреля, 2010 Опубликовано 25 апреля, 2010 · Жалоба По поводу достаточности указателя на TCB задачи - не всегда достаточно. Вообще-то были предложены и еще другие варианты. Можете вообще хоть указатель на имя файла и номер строки передавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 28 апреля, 2010 Опубликовано 28 апреля, 2010 · Жалоба Спасибо за помощь. Бага найдена. З.Ы. Мало ли кому пригодиться: lwIP имеет свой heap, который несколько больше указанного в настройках MEM_SIZE. Это надо учитывать выделяя эту память malloc'ом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться