Я новичок в программировании 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 Вот, и попытался добавить «—specs = nano.specs» к «Misc Controls» в разделах «Link» и «Compile», но ничего не изменилось.
Очевидно, ваши активные заглушки newlib для цепочки инструментов GCC не поддерживают использование низкоуровневого динамического выделения памяти (malloc()
,free()
, так далее.). Использование new()
или же delete()
для C ++ привязки могут вызывать обработчик исключений по умолчанию во время выполнения.
Детали зависят от заглушек newlib, предоставленных в вашей конфигурации. Обратите внимание, что вы можете переопределить функции-заглушки своими собственными реализациями.
В этой статье вы найдете несколько полезных дополнительных советов: Сборка GCC 4.7.1 ARM Cross Toolchain на Suse 12.2
Для поддержки new / delete и malloc / free в GCC с затем библиотекой newlib C вы должны реализовать _sbrk_r()
заглушка системных вызовов и выделение области памяти для кучи. Обычно последнее выполняется через скрипт компоновщика, но вы также можете просто выделить большой статический массив. Однако сценарий интеллектуального компоновщика может быть написан так, чтобы куча автоматически использовала всю доступную память после статического объекта и выделения системного стека.
Пример sbrk_r()
реализацию (а также другие заглушки syscall для поддержки библиотечных функций, таких как потоковый ввод / вывод) можно найти на Сайт Билла Гэтлиффа. Если вы используете CoOS или любую другую многозадачную операционную систему или исполнительную систему и собираетесь выделять ресурсы из нескольких потоков, вам также потребуется реализовать __malloc_lock()
а также __malloc_unlock()
тоже.
Ваш код оказался в Default_Handler
так как new
требуется, чтобы выдать исключение, когда оно терпит неудачу, и у вас не было явного try
/catch
блок. Если бы вы предпочли malloc()
семантика стиля и просто вернуть ноль при неудаче, вы можете использовать new (std::nothrow)
.