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

Я тут словил косячог в одном из предыдущих свежаков, конкретнее - 20120426.

(arm-kgp-eabi-gcc (Klen's GNU package (KGP) for ARM/elf platform) 4.8.0 20120422 (experimental)).

Вот в такой функции:

void testRXNE(SPI_TypeDef* spi)
{
    CS::On();
    spi->DR = 0xAA;
    while (!(spi->SR & SPI_SR_RXNE));
    spi->DR;
    spi->DR = 0xAA;                           // <==== (1)
    while (!(spi->SR & SPI_SR_RXNE));
    spi->DR;
    CS::Off();
}

компилятор (g++) выбросил строку, помеченную (1)

При этом DR - волатильный член структуры.

Вот дизассемблер:

08000cac <testRXNE(SPI_TypeDef*)>:
8000cac:   f44f 6380   mov.w   r3, #1024  ; 0x400
8000cb0:   f2c4 0302   movt    r3, #16386 ; 0x4002
8000cb4:   f04f 5280   mov.w   r2, #268435456 ; 0x10000000
8000cb8:   619a        str r2, [r3, #24]
8000cba:   23aa        movs    r3, #170   ; 0xaa
8000cbc:   8183        strh    r3, [r0, #12]
8000cbe:   8903        ldrh    r3, [r0, #8]
8000cc0:   07da        lsls    r2, r3, #31
8000cc2:   d5fc        bpl.n   8000cbe <testRXNE(SPI_TypeDef*)+0x12>
8000cc4:   8983        ldrh    r3, [r0, #12]
8000cc6:   8903        ldrh    r3, [r0, #8]
8000cc8:   07db        lsls    r3, r3, #31
8000cca:   d5fc        bpl.n   8000cc6 <testRXNE(SPI_TypeDef*)+0x1a>
8000ccc:   f44f 6380   mov.w   r3, #1024  ; 0x400
8000cd0:   f2c4 0302   movt    r3, #16386 ; 0x4002
8000cd4:   8982        ldrh    r2, [r0, #12]
8000cd6:   f44f 5280   mov.w   r2, #4096  ; 0x1000
8000cda:   619a        str r2, [r3, #24]
8000cdc:   4770        bx  lr
8000cde:   bf00        nop

В более свежем свежаке (20121125) этой проблемы нет. Так что имейте в виду.

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


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

бывает... но мы же джедаи и нас такое не остановит!

LTO медленно но верно корабкоется в гору, код уменшается а глюки с отваливаением становятся реже.

 

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

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


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

 

свежак arm host x86_64 linux

http://www.klen.org/Files/DevTools/linux-x..._64-20130120.7z

lto еще на 3 процента ужало код.. :)

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


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

в личном писье один из форумчан в связи с проблемами GDB c Pyton поросил пересобрать gdb cо статически влиноваными питонон, по ходу процессо пришлов влинквать SSL и Crypto либы. бинарь для linux x86_64

arm_kgp_eabi_gdb.tar.7z

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


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

воткните комиллеру опции -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard

будет генерится код для fpu, в сборке под cortex-m4f все протянуто (libgcc,libc,libm)

 

с нетерпением жду результов

 

следующий свежак будет 'мои релизом', поэтому хочется его оотестить в хвос и в гриву. будет особыс спросбом собраны libgcc и libc(newlib) чтоб гарантировать чоб в бинарь неприлазило вско гадость.

Помогите расставить плавающие точки на i))

 

Собираю тестовый проект с плавающей точкой, и вроде все работает, но жутко медленно.

Фактически не используются инструкции FPU, кроме vmov, vldr, vstr.

Сложение двух переменных типа double выливается в код с вызовом __adddf3 (эмуляция плавучки?)

 8001a0a:    ed9f 1b21     vldr    d1, [pc, #132]; 8001a90 <main+0x210>
8001a0e:    ed9d 0b06     vldr    d0, [sp, #24]
8001a12:    f7ff fac1     bl    8000f98 <__adddf3>
8001a16:    ed8d 0b06     vstr    d0, [sp, #24]

Писать ручками vadd.f64 d0, d1 не дает, ибо "Error: selected FPU does not support instruction".

При использовании "простенькой" арифметики из math.h код разрастается на 10КБ.

 

Тестю на этом: gcc version 4.8.0 20121121 (experimental) (Klen's GNU package (KGP) for ARM/elf platform)

В последней сборке под linux_64 результат тот же.

 

Кто виноват и что делать?

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


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

Помогите расставить плавающие точки на i))

....

Писать ручками vadd.f64 d0, d1 не дает, ибо "Error: selected FPU does not support instruction".

При использовании "простенькой" арифметики из math.h код разрастается на 10КБ.

 

Кто виноват и что делать?

 

Должен Вас сильно огорчить. Отвечаю по существу

1. Виноваты Вы.

2. Ничего не поделаеш.

 

Вся проблема в том что Вы пытаетесь скормит процессору флоты двойной точности, которые он знать не знает. данное фпу умеет оперировать только с флотами одинарнной точности (float).

Если в Вашей задаче не требуется double, то просто поменяйте тип на float у всех операндов. Также надо вызывать float версии мат функций из math.h cos(x) -> cosf(x) и тд.

 

http://infocenter.arm.com/help/topic/com.a...c/BEHJADED.html

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


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

Писать ручками vadd.f64 d0, d1 не дает, ибо "Error: selected FPU does not support instruction".

Видимо, корень зла в том, что fpv4-sp-d16 не поддерживает vadd.f64 :laughing:

Там только пересылки 64 битные бывают, остальное fp32

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


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

Если в Вашей задаче не требуется double, то просто поменяйте тип на float у всех операндов. Также надо вызывать float версии мат функций из math.h cos(x) -> cosf(x) и тд.

Поменял эффекта ноль. Стало еще хуже))

float lat, clat, lon, clon;
clat += 0.000001;

8001154:    ee18 0a10     vmov    r0, s16
8001158:    f7ff ff1a     bl    8000f90 <__aeabi_f2d>
800115c:    a314          add    r3, pc, #80; (adr r3, 80011b0 <main+0xd8>)
800115e:    e9d3 2300     ldrd    r2, r3, [r3]
8001162:    f7ff fdb7     bl    8000cd4 <__adddf3>
8001166:    f7ff ff67     bl    8001038 <__aeabi_d2f>

 

Видимо, корень зла в том, что fpv4-sp-d16 не поддерживает vadd.f64 :laughing:

Там только пересылки 64 битные бывают, остальное fp32

Тут согласен.

 

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


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

а так?

clat += 0.000001f;

 

Вообще для координат действительно нужен дабл или фиксед-поинт, иначе точности не хватит...

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


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

Поменял эффекта ноль. Стало еще хуже))

Похоже не везде поменяли. Константам припишите суффикс f: 0.1f.

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


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

а так?

clat += 0.000001f;

 

Вообще для координат действительно нужен дабл или фиксед-поинт, иначе точности не хватит...

 

Нихт арбайтн:

clat += 0.000001f;
8001150:    a313          add    r3, pc, #76; (adr r3, 80011a0 <main+0xc8>)
8001152:    e9d3 2300     ldrd    r2, r3, [r3]
8001156:    4620          mov    r0, r4
8001158:    4629          mov    r1, r5
800115a:    f7ff fdbb     bl    8000cd4 <__adddf3>

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


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

Поменял эффекта ноль. Стало еще хуже))

 8001158:    f7ff ff1a     bl    8000f90 <__aeabi_f2d>

Падажжите. -mfloat-abi=hard пристутствует?

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


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

Падажжите. -mfloat-abi=hard пристутствует?

Конечно.

 

Вроде все заработало.

Указал все типы float, все константы с суффксом f (кроме M_PI).

Код теперь генерится красивый (с vmul, vadd).

Скорость возросла в долгожданные 11 раз.

Но может чуть-чуть волнует вызов "80015b8: f000 f916 bl 80017e8 <sqrtf>" при живом "VSQRT{cond}.F32 Sd, Sm"

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


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

Вроде все заработало.

Указал все типы float, все константы с суффксом f (кроме M_PI).

Странно то, что в прошлый раз конверсия как-то боком прошла. У меня такого не было, правда, это все не kgp, считайте оффтоп :)

vcvt генерится аж бегом на строки типа float a = (float) foo_int;

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


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

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

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

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

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

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

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

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

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

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