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

 
 
> STM32F100 и проблемы с FPU, Не понятно как настроить FPU
Evgeniy Lipunov
сообщение Apr 24 2014, 04:36
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 1-07-08
Из: Челябинск
Пользователь №: 38 668



Добрый день уважаемые форумчане.

Разбираюсь с STM32F100RB, а именно с STM32VLDISCOVERY. Воспользовался портом RTOS взятым тут: https://bitbucket.org/KilleRMill/stm32f107vc_freertos_gcc
Использую Eclipse. импортировал проект, к уарту прикрутил 1-wire DS18B20, попробовал сделать несколько задач, синхронизацию между ними - все шикарно, все работает как нужно.

Как только коснулся использования float, встал и не могу третий день сдвинуться с места.
К примеру, хотел сохранить полученное значение температуры следующим образом:
Код
float temp;
uint8_t scratchpad[9];
...
temp = *(int16_t*)(scratchpad) / 16.0;
...

вроде все просто и понятно. Но при заливке и попытке отладки, программа перестает работать.

однако, если сделать так
Код
float temp,tempmul=16.0;
uint8_t scratchpad[9];
...
temp = *(int16_t*)(scratchpad) / tempmul;
...


то все работает.
Странно, подумал я, и забил на некоторое время.
Дальше больше - выяснилось, что при попытке сравнить две переменные типа float я получаю практически идентичный эффект:
Код
float f1=2.0,f2=3.0;
...
if (f1>f2) vTaskDelay(100); // либо любое другое действие, не важно
...

просто вставив это в код программы, я получаю "кирпич".
На сколько я понял, иногда перестают работать прерывания (при этом в задачах freeRTOS'a жизнь вертится), иногда все встает непонятным образом.

Перепробовал кучу комбинаций -mfpu=XXXX -msoft-float -mfloat-abi=ХХХХ без видимого эффекта.

Для меня вообще не понятная проблема. Прошу помощи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Evgeniy Lipunov
сообщение Apr 24 2014, 08:47
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 1-07-08
Из: Челябинск
Пользователь №: 38 668



Код
ENTRY(Reset_Handler)

MEMORY
{
  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 128K
  RAM   (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
}

_estack = ORIGIN(RAM) + LENGTH(RAM);

MIN_HEAP_SIZE = 0;
MIN_STACK_SIZE = 256;

SECTIONS
{
  /* Interrupt vector table */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
  } >FLASH

  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    /* Code */
    *(.text)
    *(.text*)
    /* Constants */
    *(.rodata)
    *(.rodata*)
    /* ARM->Thumb and Thumb->ARM glue code */
    *(.glue_7)
    *(.glue_7t)
    KEEP (*(.init))
    KEEP (*(.fini))
    . = ALIGN(4);
    _etext = .;
  } >FLASH

  .ARM.extab :
  {
    *(.ARM.extab* .gnu.linkonce.armextab.*)
  } >FLASH

  .ARM :
  {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } >FLASH

  .ARM.attributes :
  {
    *(.ARM.attributes)
  } > FLASH

  .preinit_array :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH

  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH

  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  _sidata = .;

  /* Initialized data */
  .data : AT ( _sidata )
  {
    . = ALIGN(4);
    _sdata = .;   /* create a global symbol at data start */
    *(.data)
    *(.data*)

    . = ALIGN(4);
    _edata = .;   /* define a global symbol at data end */
  } >RAM

  /* Uninitialized data */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .;    /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;    /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  PROVIDE(end = _ebss);
  PROVIDE(_end = _ebss);

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    . = . + MIN_HEAP_SIZE;
    . = . + MIN_STACK_SIZE;
    . = ALIGN(4);
  } >RAM

  /DISCARD/ :
  {
    libc.a(*)
    libm.a(*)
    libgcc.a(*)
  }
}


ALIGN(4)? =)
Go to the top of the page
 
+Quote Post



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

 


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


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