Новый оператор STM32 C++ (CoIDE)

Я новичок в программировании на ARM, использую CoIDE, пытаюсь написать приложение для считывания ШИМ с 8 каналов на C++.

Моя проблема заключается в использовании оператора new; если я напишу:

RxPort rxPort = RxPort(RCC_AHB1Periph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_TIM3, RCC_APB1Periph_TIM3, TIM3, TIM_Channel_1, TIM_IT_CC1, TIM3_IRQn);

он работает нормально, но если я пишу:

RxPort* rxPort1 = new RxPort;
rxPort1->setTimerParameters(RCC_APB1Periph_TIM3, TIM3, TIM_Channel_1, TIM_IT_CC1, TIM3_IRQn);
rxPort1->setGPIOParameters(RCC_AHB1Periph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_TIM3);
rxPort1->init();

программа идет на:

static void Default_Handler(void)
{
    /* Go into an infinite loop. */
    while (1)
    {
    }
}

после первой строки.

Я нашел одну тему на my.st.com here, and tried to add "--specs=nano.specs " в "Misc Controls" в разделе "Link" и "Compile", но ничего не меняется.


person Aleksandr K.    schedule 08.10.2013    source источник
comment
Обычно не может быть подходящей реализации для new() с таким маленьким устройством с ограниченным объемом оперативной памяти. Не знаю об упомянутой вами IDE, но вам следует выяснить, как настроена ваша фактическая цепочка инструментов. Когда вы доберетесь до Default_Handler(), это означает, что вы застряли в каком-то «исключении». Используете ли вы RTOS, если да, то какую?   -  person πάντα ῥεῖ    schedule 09.10.2013
comment
@g-makulik, нет, не знаю. Не могли бы вы помочь мне найти другой путь? Это глобальные переменные или настройка всего в «void main», потому что я не могу заполнить массив объектами в конструкторе, потому что объекты будут уничтожены, когда процедура завершится.   -  person Aleksandr K.    schedule 09.10.2013
comment
Какова ваша (кросс) набор инструментов? ССЗ? (Извините, я не знаю, что будет означать --specs=nano.specs в вашей IDE/Toolchain)   -  person πάντα ῥεῖ    schedule 09.10.2013
comment
@ g-makulik это GNU Tools ARM Embedded arm-none-eabi-gdb   -  person Aleksandr K.    schedule 09.10.2013
comment
Я предполагаю, что предоставленные заглушки newlib/glibc не поддерживают malloc/free   -  person πάντα ῥεῖ    schedule 09.10.2013
comment
arm-none-eabi-gdb — это просто приложение-отладчик BTW. Вы сами создаете набор инструментов или используете готовый?   -  person πάντα ῥεῖ    schedule 09.10.2013
comment
@g-makulik, спасибо, я изменю тип массива с указателя на объект и заполню его void main().   -  person Aleksandr K.    schedule 09.10.2013
comment
только что скачал с официального сайта. Да, это gcc   -  person Aleksandr K.    schedule 09.10.2013
comment
Вкратце: просто избегайте использования new() в своих реализациях, потому что это явно не поддерживается для вашей среды.   -  person πάντα ῥεῖ    schedule 09.10.2013
comment
Я понял. Большое спасибо.   -  person Aleksandr K.    schedule 09.10.2013
comment
См. этот пост в блоге для примера того, как можно реализовать заглушку newlib malloc: michaldemin.wordpress.com/2010/03/09/   -  person Étienne    schedule 15.10.2013


Ответы (2)


Для поддержки операций new/delete и malloc/free в GCC с библиотекой C newlib вы должны реализовать заглушку системных вызовов _sbrk_r() и выделить область памяти для кучи. Обычно последнее делается с помощью скрипта компоновщика, но вы также можете просто выделить большой статический массив. Однако сценарий интеллектуального компоновщика можно написать так, чтобы куча автоматически использовала всю доступную память после выделения статического объекта и системного стека.

Пример реализации sbrk_r() (а также другие заглушки системных вызовов для поддержки библиотечных функций, таких как потоковый ввод-вывод) можно найти на Сайт Билла Гатлиффа. Если вы используете CoOS или любую другую многозадачную ОС или исполнительную систему и собираетесь выделять ресурсы из нескольких потоков, вам также потребуется реализовать __malloc_lock() и __malloc_unlock().

Ваш код оказался в Default_Handler, потому что new требуется для создания исключения в случае сбоя, а у вас не было явного блока try/catch. Если вы предпочитаете семантику в стиле malloc() и просто возвращаете null в случае ошибки, вы можете использовать new (std::nothrow).

person Clifford    schedule 15.10.2013

По-видимому, ваши активные заглушки newlib в инструментальной цепочке GCC не поддерживают использование низкоуровневого динамического распределения памяти (malloc(), free() и т. д.). Использование new() или delete() для привязок C++ может вызвать обработчик исключения по умолчанию во время выполнения.

Детали зависят от заглушек newlib, поставляемых с вашей конфигурацией. Обратите внимание, что вы можете переопределить функции-заглушки своими собственными реализациями.

В этой статье вы найдете несколько полезных дополнительных советов: Создание кросс-инструментальной цепочки GCC 4.7.1 ARM на Suse 12.2

person πάντα ῥεῖ    schedule 08.10.2013