我所看到的理由是,我们说Android中的"Bastardizing"Java字节码就是性能.(我怀疑还有另一个原因.)然而,通过更改字节码,他们没有像Jazelle那样制造硬件加速技术,从而降低了移动Java平台的可用性能?
我知道目标平台是基于ARM的移动平台,这似乎与我相反.虽然它可能会让你在其他CPU架构上获得更好的性能,但它似乎在ARM和Jazelle的面前唾弃.
它对Java性能有什么样的定量影响?
它实际上是否提高了性能,如果是这样的话?
对其他平台有什么影响?(即x86,mips,yadda,yadda,yadda ...)
为什么嵌入式平台开发人员不断尝试C++ exceptions从他们的用户中删除使用SDKs?
例如,Bada SDK为异常使用建议以下解决方法,它看起来格外难看:
result
MyApp::InitTimer()
{
result r = E_SUCCESS;
_pTimer = new Timer;
r = _pTimer->Construct(*this);
if (IsFailed(r))
{
goto CATCH;
}
_pTimer->Start(1000);
if (IsFailed(r))
{
goto CATCH;
}
return r;
CATCH:
return r;
}
Run Code Online (Sandbox Code Playgroud)
这种行为的原因是什么?
据我所知,ARM编译器完全支持C++ exceptions,实际上这不是问题.还有什么?是例外的使用和unwindings上的开销ARM平台真的有那么大花很多时间做这样的解决方法?
也许其他我不知道的东西?
谢谢.
我已经尝试了几天来编译一个本机ARM Android二进制文件,它将使用终端应用程序在我的手机上执行.我想生成与手机上安装的标准Posix二进制文件相同类型的二进制文件,如ls,mkdir等.我已经在Mac OS X下载了Android NDK,并且能够无错误地编译简单的ELF二进制文件.但是,当我将它们转移到手机时,它们总是会出现段错误.也就是说,在GCC中使用-static编译时会出现段错误.如果我不使用-static,他们会抱怨没有链接等等.简单来说,它们不起作用.
我的假设是它们没有正确链接到Android标准C库.即使我将我的二进制文件与NDK提供的libc链接,它们仍然无法正常工作.我读到Android使用Bionic C库,并尝试下载它的源代码,但我不知道如何从它构建一个库(它似乎是所有ARM程序集).
手机上的Android C库是否与Android NDK提供的库不同?包含在NDK中的那个不允许我编译我可以通过终端执行的本机二进制文件吗?非常感谢任何指导!
更新:
我终于在Mac OS X上使用GCC 4.7.0了解它.我下载了Bionic标头,然后使用Android NDK附带的C库编译了一个动态链接的二进制文件.我能够使用手机的C lib(二进制为33K)获得一个测试应用程序在手机上工作.我还尝试静态链接NDK的C库,这也很有用.
为了使这一切正常工作,我必须将-nostdlib传递给GCC,然后手动将crtbegin_dynamic.o和crtend_android.o添加到GCC的命令行.它的工作原理如下:
$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
Run Code Online (Sandbox Code Playgroud)
对于静态二进制文件,请使用"crtbegin_static.o".这在crtbegin_dynamic.S/crtbegin_static.S源中进行了解释.
对于这个实验,我只使用普通的'ol GCC 4.7.0和Binutils 2.22.我还使用newlib编译了GCC,但我实际上并没有将我的ARM二进制文件与newlib链接起来.我强迫GCC/ld直接链接到随Android NDK提供的libc,或者在动态二进制文件的情况下,链接到手机上的libc.
我在Mac OS X上为ARM目标编译了GCC和newlib.但是,libc.a是用-fshort-enums编译的,我不希望这样,因为当我为ARM编译东西时,我使用-fno-short-enums.这当然是冲突:
ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
Run Code Online (Sandbox Code Playgroud)
每当我尝试运行"你好,世界!" 可执行文件,它是段错误的.这可能是原因吗?
这是我用来编译hello.c的命令:
arm-eabi-gcc \
hello.c -o hello \
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \
-v -nostdinc -nostdlib -static \
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \
-I/Users/user/gcc-arm-install/arm-eabi/include \
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \
-L/Users/user/gcc-arm-install/arm-eabi/lib \
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \
-lm -lc -lgcc
Run Code Online (Sandbox Code Playgroud)
更新:
好吧,我想我已经将问题缩小到newlib的libc和启动文件(crt0.o)的组合.我尝试使用libc.a和来自Android NDK的启动文件使用GCC 4.7.0编译测试应用程序,并且在编译静态时在手机上工作.事实上,即使ld再次抱怨使用"可变大小的枚举"(即,不使用-fno-short-enums编译其他所有内容),它仍然有效.所以,我关于-fno-short-enums是我之前崩溃的二进制文件的罪魁祸首的假设是不正确的. …
我正在使用visual studio 2012 beta和我的桌面(win32)程序在ARM架构中编译得很好.
升级到visual studio 2012 RC后,编译器无法正常工作并发出以下错误:
"不支持为ARM平台编译桌面应用程序"
我在这个http://connect.microsoft.com/VisualStudio/feedback/details/745580/arm-configuration-doesnt-work上发现了一个论坛帖子
微软是否真的切断了ARM上的win32开发是否正确?在VS2012测试版中编译只是一个侥幸?
我正在使用一个名为i.MX515的基于ARM Cortex-A8的处理器.有Linux Ubuntu 9.10发行版.我正在运行一个用C编写的非常大的应用程序,我正在利用gettimeofday();函数来衡量我的应用程序所需的时间.
main()
{
gettimeofday(start);
....
....
....
gettimeofday(end);
}
Run Code Online (Sandbox Code Playgroud)
这个方法足以让我看看我的应用程序块占用了多少时间.但是,现在,我正在尝试使用gettimeofday()计算时间的方法彻底优化我的代码,我看到连续运行之间有很多波动(在我的优化之前和之后运行),所以我不能确定实际执行时间,从而影响我的改进.
谁能告诉我应该怎么做?
如果通过访问循环计数器(在ARM网站上为Cortex-M3建议的想法),任何人都可以向我指出一些代码,它给出了我在Cortex-A8上访问定时器寄存器时必须遵循的步骤吗?
如果这种方法不是很准确,那么请提出一些替代方案.
谢谢
跟进1:在Code Sorcery上编写了以下程序,生成了可执行文件,当我尝试在主板上运行时,我得到了 - 非法指令消息:(
static inline unsigned int get_cyclecount (void)
{
unsigned int value;
// Read CCNT Register
asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
return value;
}
static inline void init_perfcounters (int32_t do_reset, int32_t enable_divider)
{
// in general enable all counters (including cycle counter)
int32_t value = 1;
// …Run Code Online (Sandbox Code Playgroud) 我对ARM编程很新.我注意到有几种架构,如ARMv4,ARMv5,ARMv6等.这些架构有什么区别?他们有不同的指令集或行为吗?
最重要的是,如果我为ARMv6编译一些C代码,它会在ARMv5上运行吗?在ARMv6上运行的ARMv5代码怎么样?或者,如果我编写内核汇编代码,我只需要担心区别吗?
在维基百科上阅读"ARM架构"并发现以下声明:
寄存器R0-R7在所有CPU模式下都是相同的; 他们永远不会存钱.
除系统模式外,R13和R14在所有特权CPU模式下进行存储.
寄存器是什么意思?
我在x86 ubuntu机器上为raspberry pi ARM目标编写了一些代码.我正在使用gcc-linaro-armhf工具链.我能够在pi上交叉编译并运行一些独立的程序.现在,我想将我的代码链接到外部库,如ncurses.我怎样才能做到这一点.
我应该将我的程序与主机上现有的ncurses lib链接,然后在ARM上运行吗?(我认为这不会起作用)我是否需要为arm获取lib的源代码或预构建版本,将其放入我的lib路径然后编译?
在这种情况下,最佳做法是什么?
我也想知道它如何用于c stdlib.在我的程序中,我使用了stdio函数,它在交叉编译后工作,没有做任何特殊的事情.我刚刚在makefile中为我的arm gcc提供了路径.所以,我想知道,它是如何得到正确的标准头文件和库?