dimka76 62 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба Компилятор Sourcery G++ Lite 2010q1-188. Ядро Cortex-M3. При попытке выполнить операции с данными типа double контроллер вылетает в HardFault Exaption. Таже сама программа скомпилированая IAR работает нормально. Ключи компиляции CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) LDFLAGS = -Wl,--gc-sections,[email protected],-cref,-u,Reset_Handler -T link.ld Подскажите в чем может быть причина возникновения исключительной ситуации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба на вскидку приходит мысль только о том что линкер неправильную либу libgcc прикручивает... хотя без даблов то работает. попробуйте мою сборку, если эффект тотже будет - помогу найти косяг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба У меня на прошлой сборке (arm-2009q1-161-arm-none-eabi) и на сборках от klen-a с плавучкой порядок, нормально работает. arm-2010q1-188 скачал, но ещё не пробовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 17 сентября, 2010 Опубликовано 17 сентября, 2010 · Жалоба на вскидку приходит мысль только о том что линкер неправильную либу libgcc прикручивает... хотя без даблов то работает. попробуйте мою сборку, если эффект тотже будет - помогу найти косяг. Попробовал с вашей, тоже вылетает в эксепшен. Вот мой тестовый проектик. LPC13xx_test.rar У меня на прошлой сборке (arm-2009q1-161-arm-none-eabi) и на сборках от klen-a с плавучкой порядок, нормально работает. arm-2010q1-188 скачал, но ещё не пробовал. Можно примерчик какой-нибудь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека. Я вот тоже грешу на стек. Скачал LPCXpresso, она вроде как ориентирована на NXP. Скомпилил ей, и все заработало. Насколько я правильно понял (из makefile) там свои библиотеки используются. У LPC1311, на котором я экспериментирую, мало ОЗУ, вот наверное и проблемы со стеком, хотя я почти всю ОЗУ под стек отдал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба Я вот тоже грешу на стек. Скачал LPCXpresso, она вроде как ориентирована на NXP. Скомпилил ей, и все заработало. Насколько я правильно понял (из makefile) там свои библиотеки используются. У LPC1311, на котором я экспериментирую, мало ОЗУ, вот наверное и проблемы со стеком, хотя я почти всю ОЗУ под стек отдал. дайте исходник функции с Вашими вычислениями, я сажу какой глубины стек она дернет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба дайте исходник функции с Вашими вычислениями, я сажу какой глубины стек она дернет. Я чуть выше выкладывал свой проектик, но могу и повторить int16_t calc_TC_temp( uint32_t from_adc ) { double emf = 1.0; double res = 0; int16_t j; double volt = (0.0005) * ((double)from_adc); for(j=0;j < 10;j++) { res += emf * koeff[j]; emf *= volt; } return (int16_t)res; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль? Exeption возникает уже на строчки double volt = (0.0005) * ((double)from_adc); А здесь нет умножения на ноль. В качестве аргумента функции я ноль не передавал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль? Результатом должен быть нуль безо всякого исключения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба глубина стека потребная для вызова вашей функции - 20 байтов, прогнал на всех значениях для входного параметра, у меня все работает. я уже думаю что у вас проблемы не с флотами а с иницализацией в crt коде до кучи покажите ключи оптимизации, вдруг вы умудрились воткнуть ему аппраратную плавучку... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба глубина стека потребная для вызова вашей функции - 20 байтов, прогнал на всех значениях для входного параметра, у меня все работает. я уже думаю что у вас проблемы не с флотами а с иницализацией в crt коде до кучи покажите ключи оптимизации, вдруг вы умудрились воткнуть ему аппраратную плавучку... OPTIMIZATION = -Os CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) -DSTM32F10X_MD LDFLAGS = -Wl,--gc-sections,[email protected],-cref,-u,Reset_Handler -T STM32.ld #------------------------------------------------------------------------------- # Rules #------------------------------------------------------------------------------- all: clean gccversion $(BIN) $(OBJ) flash $(BIN) $(OBJ): mkdir $@ define RULES C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS)) ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS)) $(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1)) $(CC) $(LDFLAGS) -o $(OUTPUT).elf $$^ $(OBJCOPY) -O binary $(OUTPUT).elf $(OUTPUT).bin $(OBJDUMP) -h -z -S $(OUTPUT).elf > $(OUTPUT).lss $(SIZE) $$^ $(OUTPUT).elf $$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN) $(CC) $(CFLAGS) -D$(1) -c -o $$@ $$< $$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN) $(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$< crt код это sturtup ? Если да, то вот его фрагменты ............................. #define STACK_SIZE 0x00000100 /*!< Stack size (in Words) */ __attribute__ ((section(".co_stack"))) unsigned long pulStack[STACK_SIZE]; ............................... __attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) = { /*----------Core Exceptions-------------------------------------------------*/ (void *)&pulStack[STACK_SIZE-1], /*!< The initial stack pointer */ Reset_Handler, /*!< Reset Handler ................................................................. void Default_Reset_Handler(void) { /* Initialize data and bss */ unsigned long *pulSrc, *pulDest; /* Copy the data segment initializers from flash to SRAM */ pulSrc = &_sidata; for(pulDest = &_sdata; pulDest < &_edata; ) { *(pulDest++) = *(pulSrc++); } /* Zero fill the bss segment. This is done with inline assembly since this will clear the value of pulDest if it is not kept in a register. */ __asm(" ldr r0, =_sbss\n" " ldr r1, =_ebss\n" " mov r2, #0\n" " .thumb_func\n" "zero_loop:\n" " cmp r0, r1\n" " it lt\n" " strlt r2, [r0], #4\n" " blt zero_loop"); /* Setup the microcontroller system. */ SystemInit(); // Настройка PLL /* Call the application's entry point.*/ main(); } Вот как описана секция .co_stack /* stack section */ .co_stack (NOLOAD): { . = ALIGN(8); *(.co_stack .co_stack.*) } > ram Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба на первый взгляд нет косяков, ошибка видимо смешная и тривиальноая, поэтому хрег найдеш :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 22 сентября, 2010 Опубликовано 22 сентября, 2010 · Жалоба Разве под отладчиком нельзя найти место "сваливания"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться