|
Функция free в HAL драйверах |
|
|
|
May 20 2015, 12:32
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 11)
|
May 20 2015, 14:23
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 21 2015, 05:31
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 21 2015, 10:32
|
Участник

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

|
Цитата(Сергей Борщ @ May 21 2015, 14:17)  Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами. Расскажите, что за код изучали вы?
|
|
|
|
|
May 21 2015, 11:50
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(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, 13:51
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(Сергей Борщ @ May 21 2015, 14:59)  Системный. Который в стандартной библиотеке компилятора. malloc? Системный? Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров! Попробуйте скомпилять что-нибудь под STM32, вызывая функцию malloc: gcc тут же ругнется, что нет _sbrk !
|
|
|
|
|
Jun 7 2015, 09:54
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(Эдди @ May 20 2015, 15:53)  А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено? А вы уверены, что там нет RTOS? Я не могу ничего сказать про IAR, но в Keil использование HAL-функций поддержки USB подразумевает использование Keil RTX. Причем в исходниках этого явно не видно, т.е. инициализация RTOS, организация процессов, и т.п. происходит без участия программиста
Сообщение отредактировал Harvester - Jun 7 2015, 09:56
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|