Перейти к содержанию
    

Функция free в HAL драйверах

Немного пред истории. Работаю в IAR for ARM 6.5. Приходится частенько мудрить с оптимизацией. Так вот поднимаю я виртуальный com на stm32f105. Сейчас бьюсь с физическим отсоединением usb и передподключением его обратно.

В принципе всё удаётся, но при high оптимизации по размеру, у меня какая то хрень с функцией free, которая в stdlib лежит. Выглядит она вот так:

             __ATTRIBUTES void free(void *);

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

Изменено пользователем Still Enemy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поднимаю я виртуальный com на stm32f105.
Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода.

Dl7jsL-Pt9Q.jpg

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

 

Попробуйте другой интернет. Это стандартная функция языка Си, она описана в стандарте и в любом справочнике. 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объясните мне, как это вяжется?
Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами.

Расскажите, что за код изучали вы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расскажите, что за код изучали вы?
Да тоже какую-то из версий куба для F1

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да уж. Быдлокод тот еще...

Говорил я, что HAL по быдлокожести не хуже SPL!

 

Пользуйтесь opencm3, она хотя бы свободная и можно пулл-реквесты авторам слать.

 

честный системный malloc() со всеми вытекающими накладными расходами.

Без RTOS?

Фигасе!

А можно исходники _sbrk и/или mmap посмотреть? Мне аж интересно стало, как там память выделяют...

Хотя, подозреваю, что и там такой же быдлокод. Что-нибудь вроде

uint8_t a_lot_of_memory[100500];
void *lastptr = (void*)a_lot_of_memory
void *malloc(size_t N){
  void *ptr = a_lot_of_memory;
  lastptr += N;
  return ptr;
}
void free(void *ptr){}

(более убогого кода я придумать не смог)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без RTOS?

Фигасе!

Системный. Который в стандартной библиотеке компилятора.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Системный. Который в стандартной библиотеке компилятора.

malloc? Системный?

Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров!

Попробуйте скомпилять что-нибудь под STM32, вызывая функцию malloc: gcc тут же ругнется, что нет _sbrk !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров!

хммм... Интересно - зачем тогда прописывают сегмент HEAP в правилах линковки для этих самых МК?

И даже в свойствах проекта во многих IDE (типа IAR) бывает можно задать размер кучи.

Видать это какая-то бессистемная куча... :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А вы уверены, что там нет RTOS? Я не могу ничего сказать про IAR, но в Keil использование HAL-функций поддержки USB подразумевает использование Keil RTX. Причем в исходниках этого явно не видно, т.е. инициализация RTOS, организация процессов, и т.п. происходит без участия программиста :)

Изменено пользователем Harvester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...