реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> HardFault на операциях с double
dimka76
сообщение Sep 16 2010, 10:25
Сообщение #1


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


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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 16 2010, 16:18
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



на вскидку приходит мысль только о том что линкер неправильную либу libgcc прикручивает... хотя без даблов то работает. попробуйте мою сборку, если эффект тотже будет - помогу найти косяг.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 16 2010, 17:02
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dimka76
сообщение Sep 17 2010, 05:03
Сообщение #4


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 скачал, но ещё не пробовал.


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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 18 2010, 14:45
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Sep 20 2010, 05:29
Сообщение #6


developer
****

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



Цитата(klen @ Sep 18 2010, 18:45) *
а со стеком все впорядке,? плавющая запятая реализована програмно и функции могут требовать много стека.


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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 20 2010, 09:33
Сообщение #7


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(dimka76 @ Sep 20 2010, 09:29) *
Я вот тоже грешу на стек. Скачал LPCXpresso, она вроде как ориентирована на NXP. Скомпилил ей, и все заработало. Насколько я правильно понял (из makefile) там свои библиотеки используются.
У LPC1311, на котором я экспериментирую, мало ОЗУ, вот наверное и проблемы со стеком, хотя я почти всю ОЗУ под стек отдал.


дайте исходник функции с Вашими вычислениями, я сажу какой глубины стек она дернет.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Sep 20 2010, 09:42
Сообщение #8


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



--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 20 2010, 16:20
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль?
Go to the top of the page
 
+Quote Post
dimka76
сообщение Sep 21 2010, 04:50
Сообщение #10


developer
****

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



Цитата(_Pasha @ Sep 20 2010, 20:20) *
Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль?


Exeption возникает уже на строчки
Код
double  volt = (0.0005) * ((double)from_adc);


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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 21 2010, 07:00
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



QUOTE (_Pasha @ Sep 20 2010, 19:20) *
Дима, в пылу предположений забыл спросить, нет ли какой-то бяки, связанной с плавучим умножением на нуль?

Результатом должен быть нуль безо всякого исключения.
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 21 2010, 11:38
Сообщение #12


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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

я уже думаю что у вас проблемы не с флотами а с иницализацией в crt коде
до кучи покажите ключи оптимизации, вдруг вы умудрились воткнуть ему аппраратную плавучку...
Go to the top of the page
 
+Quote Post
dimka76
сообщение Sep 21 2010, 12:08
Сообщение #13


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




--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 21 2010, 19:33
Сообщение #14


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



на первый взгляд нет косяков, ошибка видимо смешная и тривиальноая, поэтому хрег найдеш smile.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 22 2010, 04:28
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Разве под отладчиком нельзя найти место "сваливания"?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 09:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016