Still Enemy 0 20 мая, 2015 Опубликовано 20 мая, 2015 (изменено) · Жалоба Немного пред истории. Работаю в IAR for ARM 6.5. Приходится частенько мудрить с оптимизацией. Так вот поднимаю я виртуальный com на stm32f105. Сейчас бьюсь с физическим отсоединением usb и передподключением его обратно. В принципе всё удаётся, но при high оптимизации по размеру, у меня какая то хрень с функцией free, которая в stdlib лежит. Выглядит она вот так: __ATTRIBUTES void free(void *); У меня после не Hard Falut валится(при отключении оптимизации всё норм). Кто-нибудь может объяснить, что это за функция в подробностях. То что она указатель освобождает, я догадываюсь, но вот увидеть подтверждение в гугле или в коде не могу. Изменено 20 мая, 2015 пользователем Still Enemy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 20 мая, 2015 Опубликовано 20 мая, 2015 · Жалоба А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 20 мая, 2015 Опубликовано 20 мая, 2015 · Жалоба поднимаю я виртуальный com на stm32f105.Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода. но вот увидеть подтверждение в гугле или в коде не могу.Попробуйте другой интернет. Это стандартная функция языка Си, она описана в стандарте и в любом справочнике. http://www.tutorialspoint.com/c_standard_l...nction_free.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Still Enemy 0 21 мая, 2015 Опубликовано 21 мая, 2015 (изменено) · Жалоба Если это код из куба, то там динамическое выделение/освобождение используется всего один раз. И если эту структуру объявить глобальной, а потом только инициализировать указатель на нее - можно сэкономить много кода. (Не смог удержаться) Попробуйте другой интернет. Это стандартная функция языка Си, она описана в стандарте и в любом справочнике. 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? Занятно. И как оно, интересно, устроено? Да нет там нихрена на самом деле. Изменено 21 мая, 2015 пользователем Still Enemy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Объясните мне, как это вяжется?Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Still Enemy 0 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Это называется "говнокод". строка free(p) в USBD_static_free(void *p) явно лишняя. Вероятно попала туда при написании кода методом копипасты. По первому пункту - сделано практически то, что я предлагал, но несколько через Ж. В том коде, который я пытался изучать, здесь был честный системный malloc() со всеми вытекающими накладными расходами. Расскажите, что за код изучали вы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Расскажите, что за код изучали вы?Да тоже какую-то из версий куба для F1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Да нет там нихрена на самом деле. Да уж. Быдлокод тот еще... Говорил я, что 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){} (более убогого кода я придумать не смог) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Без RTOS? Фигасе! Системный. Который в стандартной библиотеке компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Системный. Который в стандартной библиотеке компилятора. malloc? Системный? Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров! Попробуйте скомпилять что-нибудь под STM32, вызывая функцию malloc: gcc тут же ругнется, что нет _sbrk ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 21 мая, 2015 Опубликовано 21 мая, 2015 · Жалоба Не смешите мои тапочки! Не существует "системного" malloc для микроконтроллеров! хммм... Интересно - зачем тогда прописывают сегмент HEAP в правилах линковки для этих самых МК? И даже в свойствах проекта во многих IDE (типа IAR) бывает можно задать размер кучи. Видать это какая-то бессистемная куча... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 7 июня, 2015 Опубликовано 7 июня, 2015 (изменено) · Жалоба А что, в HAL даже есть упрявлялка памятью? Без RTOS? Занятно. И как оно, интересно, устроено? А вы уверены, что там нет RTOS? Я не могу ничего сказать про IAR, но в Keil использование HAL-функций поддержки USB подразумевает использование Keil RTX. Причем в исходниках этого явно не видно, т.е. инициализация RTOS, организация процессов, и т.п. происходит без участия программиста :) Изменено 7 июня, 2015 пользователем Harvester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться