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

 
 
> Функция free в HAL драйверах
Still Enemy
сообщение May 20 2015, 12:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Немного пред истории. Работаю в IAR for ARM 6.5. Приходится частенько мудрить с оптимизацией. Так вот поднимаю я виртуальный com на stm32f105. Сейчас бьюсь с физическим отсоединением usb и передподключением его обратно.
В принципе всё удаётся, но при high оптимизации по размеру, у меня какая то хрень с функцией free, которая в stdlib лежит. Выглядит она вот так:
Код
             __ATTRIBUTES void free(void *);

У меня после не Hard Falut валится(при отключении оптимизации всё норм). Кто-нибудь может объяснить, что это за функция в подробностях. То что она указатель освобождает, я догадываюсь, но вот увидеть подтверждение в гугле или в коде не могу.

Сообщение отредактировал Still Enemy - May 20 2015, 12:36
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 20 2015, 14:23
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Still Enemy @ May 20 2015, 15:32) *
поднимаю я виртуальный com на stm32f105.
Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода.

Цитата(Still Enemy @ May 20 2015, 15:32) *
но вот увидеть подтверждение в гугле или в коде не могу.
Попробуйте другой интернет. Это стандартная функция языка Си, она описана в стандарте и в любом справочнике. http://www.tutorialspoint.com/c_standard_l...nction_free.htm


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение May 21 2015, 05:31
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(Сергей Борщ @ May 20 2015, 18:23) *
Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода.


(Не смог удержаться)

Цитата
Попробуйте другой интернет. Это стандартная функция языка Си, она описана в стандарте и в любом справочнике. http://www.tutorialspoint.com/c_standard_l...nction_free.htm

Хотите удивлю? Я всегда думал, что перед тем как освобождать память, нужно эту память занять с помощью функций malloc или calloc, но(о Боги) я обнаружил, что мой указатель создаётся не динамически, а *уй пойми как. Проследим цепочку событий:
1) Создаётся указатель на void(в стеке или в статической памяти, хз) в структуре
Код
void                    *pClassData;

2) Указатель разыменовывается
Код
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));

Идём по следу функции
Код
#define USBD_malloc               (uint32_t *)USBD_static_malloc

Дальше идём
Код
void *USBD_static_malloc(uint32_t size)
{
  static uint8_t mem[sizeof(USBD_CDC_HandleTypeDef)];
  return mem;
}

Тупо создан массив и возращен указатель на его начало.
3) Указатель освобождается непонятным образом через функцию free:
Код
USBD_free(pdev->pClassData);
    pdev->pClassData = NULL;

По мне так тут достаточно второй строки кода, указанного выше.
Код
#define USBD_free                 USBD_static_free
void USBD_static_free(void *p)
{
  free(p);
}

Объясните мне, как это вяжется?

Цитата(Эдди)
А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено?

Да нет там нихрена на самом деле.

Сообщение отредактировал Still Enemy - May 21 2015, 06:17
Go to the top of the page
 
+Quote Post



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

 


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


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