Author |
Message |
Written on: 30. 11. 2010 [09:41]
|
fido_max
Maxim Kochetkov
Contributor
registered since: 28.10.2010
Posts: 129
|
Уже пару недель JavaLikeCalc работает как часы на моей платке. Куда можно поделиться исходником доделанного модуля?
|
Written on: 30. 11. 2010 [10:10]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"fido_max" wrote:
Уже пару недель JavaLikeCalc работает как часы на моей платке. Куда можно поделиться исходником доделанного модуля?
Сюда и вложите, а я заберу.
Learn, learn and learn better than work, work and work.
|
Written on: 30. 11. 2010 [12:18]
|
fido_max
Maxim Kochetkov
Contributor
registered since: 28.10.2010
Posts: 129
|
пожалуйста
Attachment
freefunc.h (File type: text/x-chdr, Size: 13 kilobytes) — 713 downloads
freefunc.cpp (File type: text/x-c++src, Size: 79.53 kilobytes) — 684 downloads
|
Written on: 30. 11. 2010 [17:57]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"fido_max" wrote:
пожалуйста
Спасибо.
В ближайшее время планирую собрать сборочное chroot окружение на своём Nokia N800, потестировать различные способы решения этой проблемы и затем включу решение в репозиторий.
Learn, learn and learn better than work, work and work.
|
Written on: 03. 12. 2010 [19:21]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Оказывается этой проблемы на современных ARM нет. Думаю именно по этому Алмаз в этом обсуждении и не участвует. :)
Во всяком случае на моём Nokia N800 с ARMv6 она не проявляется.
Имею тестовую программку:
char val[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
printf("Value val[8] = %x\n",val[1]);
printf("Value val[16] = %x\n",*(uint16_t*)(val+1));
printf("Value val[32] = %x\n",*(uint32_t*)(val+1));
Результатом её исполнения является то-же, что и на x86, а именно:
Value val[8] = 11
Value val[16] = 2211
Value val[32] = 44332211
Однако функцию для не выравненного чтения я добавлю. Думаю её сделать так как в ядре Linux функция get_unaligned().
Перед этим, в тестовую программку, я добавлю реализацию get_unaligned() путём копирования, как сделали Вы, и посредством __attribute__((packed)), как я предлагал. Оба способа отражены в ядре Linux.
Потестирую их на производительность и вышлю Вам для проверки на вашем оборудовании.
После этого оптимальную реализацию включу в OpenSCADA.
Learn, learn and learn better than work, work and work.
|
Written on: 04. 12. 2010 [23:07]
|
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
|
Скомпилировал и успокоился. :D Проверил - такой же вылет при пуске ява-программ. Пробую скомпилировать с предоставленными файлами... С исправлениями - работает.
[This article was edited 1 times, at last 05.12.2010 at 02:28.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Written on: 05. 12. 2010 [12:58]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Выкладываю обещанную тестовую программку. Собирать просто "g++ arm_test.cpp".
Теперь мои результаты:
"AMDAthlonX2" wrote:
Bytes order check
Value l = 12345678h
Value c[0] = 78h
Value c[1] = 56h
Value c[2] = 34h
Value c[3] = 12h
Little-Endian, typical for x86.
Align check
Value val{8}[1] = 11
Direct casting val{16}+1 = 2211
Direct casting val{32}+0 = 33221100
Direct casting val{32}+1 = 44332211
Direct casting val{32}+2 = 55443322
Direct casting val{32}+3 = 66554433
Direct casting time for 32bit 10000 integers: 0.326 ms
Unaligned read by copy val{32}+0 = 33221100
Unaligned read by copy val{32}+1 = 44332211
Unaligned read by copy val{32}+2 = 55443322
Unaligned read by copy val{32}+3 = 66554433
Unaligned read by copy time for 32bit 10000 integers: 0.765 ms
Unaligned read by attribute casting val{32}+0 = 33221100
Unaligned read by attribute casting val{32}+1 = 44332211
Unaligned read by attribute casting val{32}+2 = 55443322
Unaligned read by attribute casting val{32}+3 = 66554433
Unaligned read by attribute casting time for 32bit 10000 integers: 0.338 ms
"NokiaN800" wrote:
Bytes order check
Value l = 12345678h
Value c[0] = 78h
Value c[1] = 56h
Value c[2] = 34h
Value c[3] = 12h
Little-Endian, typical for x86.
Align check
Value val{8}[1] = 11
Direct casting val{16}+1 = 2211
Direct casting val{32}+0 = 33221100
Direct casting val{32}+1 = 44332211
Direct casting val{32}+2 = 55443322
Direct casting val{32}+3 = 66554433
Direct casting time for 32bit 10000 integers: 1.923 ms
Unaligned read by copy val{32}+0 = 33221100
Unaligned read by copy val{32}+1 = 44332211
Unaligned read by copy val{32}+2 = 55443322
Unaligned read by copy val{32}+3 = 66554433
Unaligned read by copy time for 32bit 10000 integers: 5.706 ms
Unaligned read by attribute casting val{32}+0 = 33221100
Unaligned read by attribute casting val{32}+1 = 44332211
Unaligned read by attribute casting val{32}+2 = 55443322
Unaligned read by attribute casting val{32}+3 = 66554433
Unaligned read by attribute casting time for 32bit 10000 integers: 2.258 ms
"QEMU" wrote:
Bytes order check
Value l = 12345678h
Value c[0] = 78h
Value c[1] = 56h
Value c[2] = 34h
Value c[3] = 12h
Little-Endian, typical for x86.
Align check
Value val{8}[1] = 11
Direct casting val{16}+1 = 2211
Direct casting val{32}+0 = 33221100
Direct casting val{32}+1 = 44332211
Direct casting val{32}+2 = 55443322
Direct casting val{32}+3 = 66554433
Direct casting time for 32bit 10000 integers: 2.278 ms
Unaligned read by copy val{32}+0 = 33221100
Unaligned read by copy val{32}+1 = 44332211
Unaligned read by copy val{32}+2 = 55443322
Unaligned read by copy val{32}+3 = 66554433
Unaligned read by copy time for 32bit 10000 integers: 5.886 ms
Unaligned read by attribute casting val{32}+0 = 33221100
Unaligned read by attribute casting val{32}+1 = 44332211
Unaligned read by attribute casting val{32}+2 = 55443322
Unaligned read by attribute casting val{32}+3 = 66554433
Unaligned read by attribute casting time for 32bit 10000 integers: 2.251 ms
Как можно видеть, во всех случаях с ARM у меня изначально нет этой проблемы. Возможно это особенность компилятора. Я использовал порт Сизифа ALTLinux на ARM с компилятором gcc4.4-c++-4.4.5-alt1
Также видно, что наиболее эффективный способ не выравненного чтения с использованием атрибута "__attribute__((packed))".
Ожидаю протоколов от Вас!
Learn, learn and learn better than work, work and work.
Attachment
arm_test.cpp (File type: text/x-c++src, Size: 2.43 kilobytes) — 646 downloads
|
Written on: 05. 12. 2010 [13:30]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Похоже, что причина того, что у меня нет проблемы выравнивания в этом:
В ARM есть два ABI: EABI (Embeded ABI)
и OABI (Old/Obsoleted ABI). Собирать под OABI сейчас не целесообразно,
ибо со временем он отомрёт. Портов полноразмерных дистрибутивов
под EABI не так много (официального пота Debian, к примеру, ещё нету),
следовательно придёться ходить по минам, но это того стоит ;)
Так вот, порт ALTLinux основан на EABI. Взято здесь: http://www.altlinux.org/Ports/arm/Experience
Learn, learn and learn better than work, work and work.
|
Written on: 05. 12. 2010 [14:45]
|
almaz
Almaz Karimov
Contributor
Topic creator
registered since: 25.09.2008
Posts: 516
|
debian:/home# g++ --ver
Using built-in specs.
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --disable-libssp --disable-sjlj-exceptions --enable-checking=release --build=arm-linux-gnueabi --host=arm-linux-gnueabi --target=arm-linux-gnueabi
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1)"Sheeva Plug" wrote: Bytes order check
Value l = 12345678h
Value c[0] = 78h
Value c[1] = 56h
Value c[2] = 34h
Value c[3] = 12h
Little-Endian, typical for x86.
Align check
Value val{8}[1] = 11
Direct casting val{16}+1 = 1100
Direct casting val{32}+0 = 33221100
Direct casting val{32}+1 = 332211
Direct casting val{32}+2 = 11003322
Direct casting val{32}+3 = 22110033
Direct casting time for 32bit 10000 integers: 0.753 ms
Unaligned read by copy val{32}+0 = 33221100
Unaligned read by copy val{32}+1 = 44332211
Unaligned read by copy val{32}+2 = 55443322
Unaligned read by copy val{32}+3 = 66554433
Unaligned read by copy time for 32bit 10000 integers: 1.628 ms
Unaligned read by attribute casting val{32}+0 = 33221100
Unaligned read by attribute casting val{32}+1 = 44332211
Unaligned read by attribute casting val{32}+2 = 55443322
Unaligned read by attribute casting val{32}+3 = 66554433
Unaligned read by attribute casting time for 32bit 10000 integers: 0.839 ms
[This article was edited 2 times, at last 05.12.2010 at 14:58.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Written on: 05. 12. 2010 [17:49]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
Спасибо
"almaz" wrote:
debian:/home# g++ --ver
Using built-in specs.
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --disable-libssp --disable-sjlj-exceptions --enable-checking=release --build=arm-linux-gnueabi --host=arm-linux-gnueabi --target=arm-linux-gnueabi
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1)
Вот мой "g++ -v":
Using built-in specs.
Target: arm-alt-linux-gnueabi
Configured with: ../configure --host=arm-alt-linux-gnueabi --build=arm-alt-linux-gnueabi --target=arm-alt-linux-gnueabi --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/libexec --localstatedir=/var/lib --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --without-included-gettext --program-suffix=-4.4 --with-slibdir=/lib --with-bugurl=http://bugzilla.altlinux.org --enable-bootstrap --enable-shared --enable-__cxa_atexit --enable-threads=posix --enable-checking=release --with-system-zlib --without-included-gettext --enable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,java --enable-java-awt=gtk --disable-plugin --with-native-libdir=/usr/lib/gcj-4.4 --with-ecj-jar=/usr/share/java/ecj.jar --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.4-1.5.0.0/jre --enable-libgcj-multifile --disable-libjava-multilib --enable-java-maintainer-mode --disable-sjlj-exceptions
Thread model: posix
gcc version 4.4.5 20101001 (ALT Linux 4.4.5-alt1) (GCC)
Никаких особых отличий не обнаружил, кроме версии.
Learn, learn and learn better than work, work and work.
|