Перейти к содержанию
    

HardFault на операциях с double

Компилятор 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

 

Подскажите в чем может быть причина возникновения исключительной ситуации?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на вскидку приходит мысль только о том что линкер неправильную либу libgcc прикручивает... хотя без даблов то работает. попробуйте мою сборку, если эффект тотже будет - помогу найти косяг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня на прошлой сборке (arm-2009q1-161-arm-none-eabi) и на сборках от klen-a с плавучкой порядок, нормально работает.

arm-2010q1-188 скачал, но ещё не пробовал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на вскидку приходит мысль только о том что линкер неправильную либу libgcc прикручивает... хотя без даблов то работает. попробуйте мою сборку, если эффект тотже будет - помогу найти косяг.

 

Попробовал с вашей, тоже вылетает в эксепшен.

 

Вот мой тестовый проектик.

 

LPC13xx_test.rar

 

 

У меня на прошлой сборке (arm-2009q1-161-arm-none-eabi) и на сборках от klen-a с плавучкой порядок, нормально работает.

arm-2010q1-188 скачал, но ещё не пробовал.

 

Можно примерчик какой-нибудь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека.

 

Я вот тоже грешу на стек. Скачал LPCXpresso, она вроде как ориентирована на NXP. Скомпилил ей, и все заработало. Насколько я правильно понял (из makefile) там свои библиотеки используются.

У LPC1311, на котором я экспериментирую, мало ОЗУ, вот наверное и проблемы со стеком, хотя я почти всю ОЗУ под стек отдал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вот тоже грешу на стек. Скачал LPCXpresso, она вроде как ориентирована на NXP. Скомпилил ей, и все заработало. Насколько я правильно понял (из makefile) там свои библиотеки используются.

У LPC1311, на котором я экспериментирую, мало ОЗУ, вот наверное и проблемы со стеком, хотя я почти всю ОЗУ под стек отдал.

 

дайте исходник функции с Вашими вычислениями, я сажу какой глубины стек она дернет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дайте исходник функции с Вашими вычислениями, я сажу какой глубины стек она дернет.

 

Я чуть выше выкладывал свой проектик, но могу и повторить

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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль?

 

Exeption возникает уже на строчки

double  volt = (0.0005) * ((double)from_adc);

 

А здесь нет умножения на ноль. В качестве аргумента функции я ноль не передавал.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль?

Результатом должен быть нуль безо всякого исключения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

я уже думаю что у вас проблемы не с флотами а с иницализацией в crt коде

до кучи покажите ключи оптимизации, вдруг вы умудрились воткнуть ему аппраратную плавучку...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глубина стека потребная для вызова вашей функции - 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на первый взгляд нет косяков, ошибка видимо смешная и тривиальноая, поэтому хрег найдеш :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...