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

У меня после не Hard Falut валится(при отключении оптимизации всё норм). Кто-нибудь может объяснить, что это за функция в подробностях. То что она указатель освобождает, я догадываюсь, но вот увидеть подтверждение в гугле или в коде не могу.
Эдди
А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено?
Сергей Борщ
Цитата(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
Still Enemy
Цитата(Сергей Борщ @ 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, 08:31) *
Объясните мне, как это вяжется?
Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами.
Still Enemy
Цитата(Сергей Борщ @ May 21 2015, 14:17) *
Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами.

Расскажите, что за код изучали вы?
Сергей Борщ
Цитата(Still Enemy @ May 21 2015, 13:32) *
Расскажите, что за код изучали вы?
Да тоже какую-то из версий куба для F1
Эдди
Цитата(Still Enemy @ May 21 2015, 08:31) *
Да нет там нихрена на самом деле.

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

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

Цитата(Сергей Борщ @ May 21 2015, 13:17) *
честный системный 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){}

(более убогого кода я придумать не смог)
Сергей Борщ
Цитата(Эдди @ May 21 2015, 14:50) *
Без RTOS?
Фигасе!
Системный. Который в стандартной библиотеке компилятора.
Эдди
Цитата(Сергей Борщ @ May 21 2015, 14:59) *
Системный. Который в стандартной библиотеке компилятора.

malloc? Системный?
Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров!
Попробуйте скомпилять что-нибудь под STM32, вызывая функцию malloc: gcc тут же ругнется, что нет _sbrk !
jcxz
Цитата(Эдди @ May 21 2015, 19:51) *
Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров!

хммм... Интересно - зачем тогда прописывают сегмент HEAP в правилах линковки для этих самых МК?
И даже в свойствах проекта во многих IDE (типа IAR) бывает можно задать размер кучи.
Видать это какая-то бессистемная куча... biggrin.gif
Harvester
Цитата(Эдди @ May 20 2015, 15:53) *
А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено?

А вы уверены, что там нет RTOS? Я не могу ничего сказать про IAR, но в Keil использование HAL-функций поддержки USB подразумевает использование Keil RTX. Причем в исходниках этого явно не видно, т.е. инициализация RTOS, организация процессов, и т.п. происходит без участия программиста sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.