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

 
 
 
Reply to this topicStart new topic
> Получить адресс возврата на cortex
Dron_Gus
сообщение Apr 23 2010, 13:45
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Пилю менеджер кучи от zltigo. Решил добавить пару сервисных функций для отладки. В частности хочу знать, откуда был вызов на выделение памяти. Для этого как-то нужно выдернуть содержимое регистра LR. В асме не силен. Так что все потуги пока не увенчались успехом. Может кто подскажет обертку/функцию для получения LR?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 23 2010, 16:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Dron_Gus @ Apr 23 2010, 18:00) *
Может кто подскажет обертку/функцию для получения LR?

Компилятор-то как зовут?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 23 2010, 16:21
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Примерно вот так:
Код
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();
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 23 2010, 16:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dron_Gus @ Apr 23 2010, 16:00) *
Пилю менеджер кучи от zltigo.

Вообще-то проще и уж точно удобнее для отладки, передавать уже готовый указатель на владельца, что и сделано через void *owner в функции void *malloc_z( heap_t *heap, size_t size, int type, void *owner );
При этом у меня владельцем обычно является указатель на TCB задачи. Хотя естественно, можно и хоть указатель на имя подставлять, хоть явно адрес вызывающей подпрограммы , а не вытаскивать его постфактум.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 23 2010, 17:57
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(AHTOXA @ Apr 23 2010, 22:36) *
Примерно вот так:...

Вот так лучше:
Код
inline __attribute__((__always_inline__)) uint32_t get_return_address()
{
    unsigned int ret;
    __asm__ __volatile__ ("sub   %0, LR, #4" : "=r"(ret) );
    return ret;
}


Цитата(zltigo @ Apr 23 2010, 23:11) *
Вообще-то проще и уж точно удобнее для отладки, передавать уже готовый указатель на владельца


Если есть такая возможность, то конечно лучше так. Потому что адрес возврата может испортиться по ходу выполнения malloc (потому приходится его извлекать в самом начале), а параметр уж никуда не денется.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
igorsk
сообщение Apr 24 2010, 00:45
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 22-03-10
Пользователь №: 56 131



Если компилятор от Keil/ARM, то есть интринсик __return_address().
Go to the top of the page
 
+Quote Post
xyzzy
сообщение Apr 24 2010, 05:15
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 95
Регистрация: 10-04-05
Пользователь №: 4 003



Цитата(igorsk @ Apr 23 2010, 18:00) *
Если компилятор от Keil/ARM, то есть интринсик __return_address().


А если gcc, то __builtin_return_address(unsigned in level)


--------------------
--xyzzy
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Apr 25 2010, 09:52
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Спасибо всем! Компиляторы Keil и CrossWorks (GCC).
По поводу достаточности указателя на TCB задачи - не всегда достаточно. Во-первых у меня некоторое выделение происходит еще вне задач, потом и в задачах бывает по несколько вызовов. Поэтому найти "неправильный" вызов проще по адресу возврата.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 25 2010, 11:53
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dron_Gus @ Apr 25 2010, 12:07) *
По поводу достаточности указателя на TCB задачи - не всегда достаточно.

Вообще-то были предложены и еще другие варианты. Можете вообще хоть указатель на имя файла и номер строки передавать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Apr 28 2010, 06:49
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Спасибо за помощь. Бага найдена.

З.Ы. Мало ли кому пригодиться: lwIP имеет свой heap, который несколько больше указанного в настройках MEM_SIZE. Это надо учитывать выделяя эту память malloc'ом.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 19:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016