我正在寻找一个快速,仅整数算法来找到无符号整数的平方根(整数部分).代码必须在ARM Thumb 2处理器上具有出色的性能.它可以是汇编语言或C代码.
任何提示欢迎.
我有一些相当大的应用程序二进制大小的本机库.我调查了APK拆分,但维护和QAing多个APK不是我想做的事情.
因此,我想使用ndk.abiFilters Gradle属性在我的发布版本风格中排除未使用的体系结构.(调试版本我想单独留下,以便我可以在x86上运行HAXM加速仿真器).
我想在我的发布版本中只有armeabi-v7a和arm64-v8a,但我不确定是否值得担心我正在放弃的其他架构的市场份额.经过大量的回顾,我找不到任何ARMv6(armeabi),MIPS,x86或x86_64的市场份额参考.我的直觉告诉我,后三者几乎不存在,但我不确定ARMv6.
我在一个论坛上找到了这个链接,该论坛上有一系列使用各种架构的手机.某处有更可靠的东西吗?也许有%的用户类似于Android版本的仪表板?
如果我只是为armeabi-v7a和arm64-v8a(或者armeabi,armeabi-v7a和arm64-v8a)构建我的原生库,那么我还有什么别的想念?
在阅读了以下论文后,https://people.freebsd.org/~lstewart/articles/cpumemory.pdf("每个程序员应该了解内存的内容")我想尝试一下作者的测试,即测量效果TLB的最终执行时间.
我正在研究嵌入Cortex-A9的三星Galaxy S3.
根据文件:
我们在L1中有两个用于指令和数据缓存的微TLB(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388e/Chddiifa.html)
主要TLB位于L2(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388e/Chddiifa.html)
Data micro TLB有32个条目(指令微TLB有32或64个条目)
我写了一个小程序,用N个条目分配一个结构数组.每个条目的大小为== 32个字节,因此它适合缓存行.我执行几次读取访问,并测量执行时间.
typedef struct {
int elmt; // sizeof(int) == 4 bytes
char padding[28]; // 4 + 28 = 32B == cache line size
}entry;
volatile entry ** entries = NULL;
//Allocate memory and init to 0
entries = calloc(NB_ENTRIES, sizeof(entry *));
if(entries == NULL) perror("calloc failed"); exit(1);
for(i = 0; i < NB_ENTRIES; i++)
{
entries[i] = mmap(NULL, …Run Code Online (Sandbox Code Playgroud) 在"ARM11TechnicalRefManual"的第1-34节"拇指指令集"下,它说:
"Thumb指令集是最常用的32位ARM指令的子集.Tumb指令长16位,并且具有相应的32位ARM指令,对处理器型号具有相同的影响."
谁可以解释更多关于这个特别是第二句话,并说处理器如何执行它?
微软最近发布了新的Phone 7平台的工具和文档,让那些拥有大型C++代码库的人(比如我)感到沮丧,不再支持本机开发了.虽然我发现有关这一决定被推翻的猜测,但我对此表示怀疑.所以我想通过调整它在C++/CLI下进行编译来使Phone 7可用的代码库是多么可行.当然用户界面部件无法移植,但我不确定其余部分.有人有类似的经历吗?我不是在谈论那些做重度低级的东西的代码 - 但是经常使用模板和智能指针.
我想使用arm-linux-gnueabi-gcc从C构建静态hello世界,而不是使用NDK独立工具链或代码源.
在Ubuntu ......
我做了以下事情:
sudo apt-get install gcc-arm-linux-gnueabi
Run Code Online (Sandbox Code Playgroud)
我创建了一个像这样的hi.c:
#include <stdio.h>
int main(int argc, char** argv) {
printf("hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译它像这样:
arm-linux-gnueabi-gcc -static hi.c -o hi
Run Code Online (Sandbox Code Playgroud)
我在这样的模拟器上运行它:
adb push hi /data/hi
adb shell /data/hi
Run Code Online (Sandbox Code Playgroud)
但是,我得到了这个:
[1] Illegal instruction /data/hi
Run Code Online (Sandbox Code Playgroud)
我忘记了什么步骤?根据过去的经验,这"应该"有效,但我显然搞砸了.
arm-eabi,gnueabi和gnueabi-hf交叉编译器有什么区别.我发现很难选择编译器.是否有针对arm的本机编译器?
我想尝试将Raspberry Pi用于一些不同的低级嵌入式应用程序.唯一的问题是,与可用的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有正在运行的程序中分配CPU时间,并使其对某些实时应用程序不切实际.
我最近了解到,假设你有一个像GRUB一样的bootloader,在x86上运行一个C程序(以内核的形式)只需要很少的实际设置,只需要一个汇编程序来调用main函数和实际的C代码.
有没有办法用Raspberry Pi实现这一目标?这是学习低级ARM编程的好方法,它已经有一些复杂的外围设备(USB,以太网等).
根据ARM IC.
在ARM状态下,PC的值是当前指令的地址加上8个字节.
在Thumb状态:
- 对于B,BL,CBNZ和CBZ指令,PC的值是当前指令的地址加上4个字节.
- 对于使用标签的所有其他指令,PC的值是当前指令的地址加上4个字节,结果的位[1]清零以使其字对齐.
简单地说,PC寄存器的值指向下一条指令后的指令.这是我没有得到的.通常(特别是在x86上)程序计数器寄存器用于指向要执行的下一条指令的地址.
那么,底层的前提是什么?有条件执行,也许?
arm ×10
c ×3
android ×2
android-ndk ×2
embedded ×2
abi ×1
assembly ×1
benchmarking ×1
c++-cli ×1
cortex-a ×1
eabi ×1
gcc ×1
jit ×1
linux ×1
linux-kernel ×1
low-level ×1
native ×1
raspberry-pi ×1
square-root ×1
thumb ×1