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

 
 
> Функция 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
Ответов (1 - 11)
Эдди
сообщение May 20 2015, 12:53
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 20 2015, 14:23
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #4


Участник
*

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


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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, 10:32
Сообщение #6


Участник
*

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



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

Расскажите, что за код изучали вы?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2015, 11:30
Сообщение #7


Гуру
******

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



Цитата(Still Enemy @ May 21 2015, 13:32) *
Расскажите, что за код изучали вы?
Да тоже какую-то из версий куба для F1


--------------------
На любой вопрос даю любой ответ
"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
Эдди
сообщение May 21 2015, 11:50
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 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){}

(более убогого кода я придумать не смог)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2015, 11:59
Сообщение #9


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
Эдди
сообщение May 21 2015, 13:51
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



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

malloc? Системный?
Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров!
Попробуйте скомпилять что-нибудь под STM32, вызывая функцию malloc: gcc тут же ругнется, что нет _sbrk !
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 21 2015, 16:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Эдди @ May 21 2015, 19:51) *
Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров!

хммм... Интересно - зачем тогда прописывают сегмент HEAP в правилах линковки для этих самых МК?
И даже в свойствах проекта во многих IDE (типа IAR) бывает можно задать размер кучи.
Видать это какая-то бессистемная куча... biggrin.gif
Go to the top of the page
 
+Quote Post
Harvester
сообщение Jun 7 2015, 09:54
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



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

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

Сообщение отредактировал Harvester - Jun 7 2015, 09:56


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

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

 


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


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