|
HardFault на операциях с double |
|
|
|
Sep 16 2010, 10:25
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Компилятор Sourcery G++ Lite 2010q1-188. Ядро Cortex-M3. При попытке выполнить операции с данными типа double контроллер вылетает в HardFault Exaption. Таже сама программа скомпилированая IAR работает нормально. Ключи компиляции Код CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) LDFLAGS = -Wl,--gc-sections,-Map=$@.map,-cref,-u,Reset_Handler -T link.ld Подскажите в чем может быть причина возникновения исключительной ситуации?
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 17 2010, 05:03
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(klen @ Sep 16 2010, 20:18)  на вскидку приходит мысль только о том что линкер неправильную либу libgcc прикручивает... хотя без даблов то работает. попробуйте мою сборку, если эффект тотже будет - помогу найти косяг. Попробовал с вашей, тоже вылетает в эксепшен. Вот мой тестовый проектик.
LPC13xx_test.rar ( 25.89 килобайт )
Кол-во скачиваний: 82Цитата(AHTOXA @ Sep 16 2010, 21:02)  У меня на прошлой сборке (arm-2009q1-161-arm-none-eabi) и на сборках от klen-a с плавучкой порядок, нормально работает. arm-2010q1-188 скачал, но ещё не пробовал. Можно примерчик какой-нибудь.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 20 2010, 05:29
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(klen @ Sep 18 2010, 18:45)  а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека. Я вот тоже грешу на стек. Скачал LPCXpresso, она вроде как ориентирована на NXP. Скомпилил ей, и все заработало. Насколько я правильно понял (из makefile) там свои библиотеки используются. У LPC1311, на котором я экспериментирую, мало ОЗУ, вот наверное и проблемы со стеком, хотя я почти всю ОЗУ под стек отдал.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 20 2010, 09:42
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(klen @ Sep 20 2010, 13:33)  дайте исходник функции с Вашими вычислениями, я сажу какой глубины стек она дернет. Я чуть выше выкладывал свой проектик, но могу и повторить Код 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; }
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 21 2010, 04:50
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(_Pasha @ Sep 20 2010, 20:20)  Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль? Exeption возникает уже на строчки Код double volt = (0.0005) * ((double)from_adc); А здесь нет умножения на ноль. В качестве аргумента функции я ноль не передавал.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 21 2010, 12:08
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(klen @ Sep 21 2010, 15:38)  глубина стека потребная для вызова вашей функции - 20 байтов, прогнал на всех значениях для входного параметра, у меня все работает.
я уже думаю что у вас проблемы не с флотами а с иницализацией в crt коде до кучи покажите ключи оптимизации, вдруг вы умудрились воткнуть ему аппраратную плавучку... Код OPTIMIZATION = -Os CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) -DSTM32F10X_MD LDFLAGS = -Wl,--gc-sections,-Map=$@.map,-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
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|