AHTOXA 18 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба Я тут словил косячог в одном из предыдущих свежаков, конкретнее - 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) этой проблемы нет. Так что имейте в виду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 19 января, 2013 Опубликовано 19 января, 2013 · Жалоба бывает... но мы же джедаи и нас такое не остановит! LTO медленно но верно корабкоется в гору, код уменшается а глюки с отваливаением становятся реже. кстате, у меня тоже волатайл режет нещадно, но это мы знаем что будет побочный эффект в аппаратуре. а он не знает, поэтому лично я ему это прощаю и ручками помогаю сгенерить то что нужно. хотя volaile какбэээээ ...... мож теперь волатильность изменило свое содержание? нада стандартики почитать.. а то часто бывает что сам дурак. век живи век учись :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 20 января, 2013 Опубликовано 20 января, 2013 · Жалоба свежак arm host x86_64 linux http://www.klen.org/Files/DevTools/linux-x..._64-20130120.7z lto еще на 3 процента ужало код.. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 31 января, 2013 Опубликовано 31 января, 2013 · Жалоба в личном писье один из форумчан в связи с проблемами GDB c Pyton поросил пересобрать gdb cо статически влиноваными питонон, по ходу процессо пришлов влинквать SSL и Crypto либы. бинарь для linux x86_64 arm_kgp_eabi_gdb.tar.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sherr 0 31 января, 2013 Опубликовано 31 января, 2013 · Жалоба А под Linux 32 bit что-нибудь (АВР,АРМ) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 31 января, 2013 Опубликовано 31 января, 2013 · Жалоба воткните комиллеру опции -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 результат тот же. Кто виноват и что делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Помогите расставить плавающие точки на 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Писать ручками vadd.f64 d0, d1 не дает, ибо "Error: selected FPU does not support instruction". Видимо, корень зла в том, что fpv4-sp-d16 не поддерживает vadd.f64 :laughing: Там только пересылки 64 битные бывают, остальное fp32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Если в Вашей задаче не требуется 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 Тут согласен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба а так? clat += 0.000001f; Вообще для координат действительно нужен дабл или фиксед-поинт, иначе точности не хватит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Поменял эффекта ноль. Стало еще хуже)) Похоже не везде поменяли. Константам припишите суффикс f: 0.1f. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба а так? 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> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Поменял эффекта ноль. Стало еще хуже)) 8001158: f7ff ff1a bl 8000f90 <__aeabi_f2d> Падажжите. -mfloat-abi=hard пристутствует? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Падажжите. -mfloat-abi=hard пристутствует? Конечно. Вроде все заработало. Указал все типы float, все константы с суффксом f (кроме M_PI). Код теперь генерится красивый (с vmul, vadd). Скорость возросла в долгожданные 11 раз. Но может чуть-чуть волнует вызов "80015b8: f000 f916 bl 80017e8 <sqrtf>" при живом "VSQRT{cond}.F32 Sd, Sm" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба Вроде все заработало. Указал все типы float, все константы с суффксом f (кроме M_PI). Странно то, что в прошлый раз конверсия как-то боком прошла. У меня такого не было, правда, это все не kgp, считайте оффтоп :) vcvt генерится аж бегом на строки типа float a = (float) foo_int; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться