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

 
 
 
Reply to this topicStart new topic
> new и delete в IAR (ARM)
0x435641
сообщение Mar 19 2013, 05:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 26-07-12
Пользователь №: 72 908



столкнулся со странными вылетаниями программы в swi_handler и data_handler
в проекте активно используется динамическая память, Ethernet, USB
долгими мучительными копаниями удалось найти причину - параллельное выполнение сабжевых операторов, которые используются как в основном цикле, так и в прерываниях

на данный момент решил вопрос отключением прерываний, если new и delete вызываются вне прерывания

в нете не нашел инфы по спицифике использования этих операторов в IAR

если кто-то обладает знаниями - просьба поделиться
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Mar 19 2013, 06:56
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Насчет iar - не знаю, gcc - newlib под bare metal содержит нереентерабельные malloc/free (на которых основаны new/delete)

У тебя вероятно то же самое.

Как вариант, можешь переопределить глобальные new и delete (как обычные, так и для массивов) и лочить прерывания перед вызовом malloc/free.

Возможно, в iar есть готовые заглушки, переопределив которые можно добиться реентерабельности
Go to the top of the page
 
+Quote Post
0x435641
сообщение Mar 19 2013, 07:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 26-07-12
Пользователь №: 72 908



Цитата(Непомнящий Евгений @ Mar 19 2013, 13:56) *
Насчет iar - не знаю, gcc - newlib под bare metal содержит нереентерабельные malloc/free (на которых основаны new/delete)

У тебя вероятно то же самое.

Как вариант, можешь переопределить глобальные new и delete (как обычные, так и для массивов) и лочить прерывания перед вызовом malloc/free.

Возможно, в iar есть готовые заглушки, переопределив которые можно добиться реентерабельности


это вероятные догадки... хотелось бы документального подтверждения
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Mar 19 2013, 07:28
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



читай доку sm.gif
к иару кстати исходники библиотек прилагаются, посмотри их
Go to the top of the page
 
+Quote Post
KSN
сообщение Mar 19 2013, 07:29
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Почитайте "IAR C/C++ Compiler Compiling and Linking", там и про new и про delete есть. Использование динамического выделения памяти в прервываниях - не лучший вариант с позиции оптимизации. Лучше избегать этого.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 19 2013, 09:04
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
это вероятные догадки... хотелось бы документального подтверждения

На странице 390 мануала все написано, что эти функции не реентерабельны. Защищайте их сами семафорами или мутексами ну или свой менагер.

Цитата
REENTRANCY
A function that can be simultaneously invoked in the main application and in any
number of interrupts is reentrant. A library function that uses statically allocated data is
therefore not reentrant.
Most parts of the DLIB library are reentrant, but the following functions and parts are
not reentrant because they need static data:
● Heap functions—malloc, free, realloc, calloc, and the C++ operators new
and delete
● Locale functions—localeconv, setlocale
● Multibyte functions—mbrlen, mbrtowc, mbsrtowc, mbtowc, wcrtomb,
wcsrtomb, wctomb
● Rand functions—rand, srand
● Time functions—asctime, localtime, gmtime, mktime
● The miscellaneous functions atexit, strerror, strtok
● Functions that use files or the heap in some way. This includes printf, sprintf,
scanf, sscanf, getchar, and putchar.
Functions that can set errno are not reentrant, because an errno value resulting from
one of these functions can be destroyed by a subsequent use of the function before it is
read. This applies to math and string conversion functions, among others.
Remedies for this are:
● Do not use non-reentrant functions in interrupt service routines
Go to the top of the page
 
+Quote Post
0x435641
сообщение Mar 19 2013, 09:27
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 26-07-12
Пользователь №: 72 908



нашел, спасибо за наводку!

выходит при вызове sprintf так же нужно запрещать прерывания(если в них присутствуют new/delete) ???
или здесь имеется ввиду параллельный вызов sprintf из основного потока и прерывания?

Сообщение отредактировал 0x435641 - Mar 19 2013, 10:03
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Mar 19 2013, 10:25
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



ты не должен вызывать new/delete (malloc/free) прямо или опосредованно одновременно из нескольких потоков. Если ты так делаешь - добавляй средства синхронизации - к примеру запрещай прерывания
Go to the top of the page
 
+Quote Post
0x435641
сообщение Mar 19 2013, 10:30
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 26-07-12
Пользователь №: 72 908



>выходит при вызове sprintf так же нужно запрещать прерывания(если в них присутствуют new/delete) ???
>или здесь имеется ввиду параллельный вызов sprintf из основного потока и прерывания?

меня интересует сейчас конкретно sprintf. он в основном потоке. я могу в прерывании пользовать new/delete, или тоже синхронизация нужна? в потрохах sprintf не ковырялся
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 19 2013, 11:06
Сообщение #10


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



для new/delete синхронизация нужна полюбому, и для sprintf нужна если он вызывается с нескольких мест (задач или прерываний) он может не долько динамичсескую использоватьи татическую тоже дак что new/delete сам посибе и sprintf тоже.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 8 2013, 05:33
Сообщение #11


Гуру
******

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



sprintf не использует динамическую память - не надо фантазий.
Но использует много стека, так что использовать его в ISR-ах, имхо, - моветон.
Да и вообще имхо - надо всегда стараться избегать динамической памяти в эмбеддед.

Цитата(MALLOY2 @ Mar 19 2013, 17:06) *
для new/delete синхронизация нужна полюбому, и для sprintf нужна если он вызывается с нескольких мест (задач или прерываний) он может не долько динамичсескую использоватьи татическую тоже дак что new/delete сам посибе и sprintf тоже.
Тоже фантазии. sprintf не использует ни динамическую ни статическую память, все хранит в автоматической, т.е. - полностью реерентерабелен. Но объём на стеке использует большой.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:31
Рейтинг@Mail.ru


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