|
|
  |
свежак KGP win32/arm/avr/mips/m68k, GNU tools chain |
|
|
|
Jan 11 2013, 16:33
|

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

|
Я тут словил косячог в одном из предыдущих свежаков, конкретнее - 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) этой проблемы нет. Так что имейте в виду.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 31 2013, 23:49
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(klen @ Dec 4 2011, 06:22)  воткните комиллеру опции -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 результат тот же. Кто виноват и что делать?
|
|
|
|
|
Feb 1 2013, 06:38
|

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

|
Цитата(adnega @ Feb 1 2013, 03:49)  Помогите расставить плавающие точки на 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
|
|
|
|
|
Feb 1 2013, 08:20
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(klen @ Feb 1 2013, 10:38)  Если в Вашей задаче не требуется 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> Цитата(_Pasha @ Feb 1 2013, 10:38)  Видимо, корень зла в том, что fpv4-sp-d16 не поддерживает vadd.f64 Там только пересылки 64 битные бывают, остальное fp32 Тут согласен.
|
|
|
|
|
Feb 1 2013, 08:33
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(demiurg_spb @ Feb 1 2013, 12:24)  а так? 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>
|
|
|
|
|
Feb 1 2013, 08:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(_Pasha @ Feb 1 2013, 12:38)  Падажжите. -mfloat-abi=hard пристутствует? Конечно. Вроде все заработало. Указал все типы float, все константы с суффксом f (кроме M_PI). Код теперь генерится красивый (с vmul, vadd). Скорость возросла в долгожданные 11 раз. Но может чуть-чуть волнует вызов "80015b8: f000 f916 bl 80017e8 <sqrtf>" при живом "VSQRT{cond}.F32 Sd, Sm"
|
|
|
|
|
  |
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|