我最近在使用Assembly编程时遇到了ARM Cortex-A8的奇怪行为.每当我MOV进入R4,我的程序崩溃(下面的堆栈转储)
10-14 09:48:43.117: INFO/DEBUG(3048): Build fingerprint: 'google/soju/crespo:2.3.6/GRK39F/189904:user/release-keys'
10-14 09:48:43.121: INFO/DEBUG(3048): pid: 7082, tid: 7082 >>> neontests <<<
10-14 09:48:43.121: INFO/DEBUG(3048): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000001
10-14 09:48:43.125: INFO/DEBUG(3048): r0 00000001 r1 afa025b6 r2 00000000 r3 bec77051
10-14 09:48:43.128: INFO/DEBUG(3048): r4 00000001 r5 bec7704c r6 00000001 r7 00000004
10-14 09:48:43.128: INFO/DEBUG(3048): r8 00000005 r9 00000000 10 4214cca4 fp 800a5368
10-14 09:48:43.128: INFO/DEBUG(3048): ip afa03110 sp bec77010 lr afa0133b pc afd37b42 cpsr 60000030
10-14 09:48:43.132: …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要从RGB转换图像的iOS应用程序 - > BGRA相当快.如果可能的话,我想使用NEON内在函数.有没有比简单分配组件更快的方法?
void neonPermuteRGBtoBGRA(unsigned char* src, unsigned char* dst, int numPix)
{
numPix /= 8; //process 8 pixels at a time
uint8x8_t alpha = vdup_n_u8 (0xff);
for (int i=0; i<numPix; i++)
{
uint8x8x3_t rgb = vld3_u8 (src);
uint8x8x4_t bgra;
bgra.val[0] = rgb.val[2]; //these lines are slow
bgra.val[1] = rgb.val[1]; //these lines are slow
bgra.val[2] = rgb.val[0]; //these lines are slow
bgra.val[3] = alpha;
vst4_u8(dst, bgra);
src += 8*3;
dst += 8*4;
}
}
Run Code Online (Sandbox Code Playgroud) 这是参考问题: Intrinsics中Neon的校验和代码实现
打开链接中列出的子问题作为单独的个别问题.因为多个问题不被要求作为单个线程的一部分.
无论如何回答这个问题:
可以ARM和NEON(中的ARM Cortex-A8架构来说的),实际上是在并行工作?我怎样才能做到这一点?
有人可以指向我或分享一些使用ARM-NEON的互操作的示例实现(伪代码/算法/代码,而不是理论实现论文或会谈)吗?(使用intrinsics或inline-asm的实现都可以.)
我正在使用基于ARM cortex-A8的S5PV210
当我声明这样的中断例程时:
void isr_routine(void) __attribute__ ((interrupt ("IRQ")));
Run Code Online (Sandbox Code Playgroud)
并像这样编译
arm-linux-gcc -c -march=armv7-a -fpie -fno-builtin $< -o $@
Run Code Online (Sandbox Code Playgroud)
我知道gcc会通过推送一些寄存器为我切换上下文.在我知道这一点之前,我手动完成了.所以我很好奇gcc是如何做到的.拆解后,我找到了如下代码
PUSH {r0-r4,r11,r12,lr}
Run Code Online (Sandbox Code Playgroud)
这与我关于如何切换上下文的概念背道而驰.在Arm cortex-A8官方文档中,明确表示r0-r12由用户模式和IRQ模式共享.但是用户模式中的lr独立于IRQ模式.所以,我曾经像这样切换上下文
PUSH {r0-r12}
Run Code Online (Sandbox Code Playgroud)
可以吗?为什么gcc推送lr注册,为什么gcc不推r5-r10 rigsters?
就ARM Cortex-A8而言,当NEON执行其指令时,ARM模块是等待还是继续运行?这种同步是如何实现的?如果ARM和NEON正在处理相同的数据/代码段,ARM和NEON内核如何同步?
我正在为ARM Cortex A9处理器编写裸机代码(无操作系统).
我需要读取一个只能在管理员模式下访问的寄存器(多处理器关联寄存器,MPIDR).
当我处于用户模式并尝试执行以下指令(进入管理程序模式)时,调试器没有任何反应.
MSR CPSR_C, #0x13
Run Code Online (Sandbox Code Playgroud)
如果我尝试读取MPIDR寄存器,我的程序将进入未定义模式
请你知道我错过了什么吗?
当我使用调试器窗口,并强制CPSR寄存器的五个第一位到b10011,它工作,我去主管.
Mali OpenCL SDK允许在Mali GPU上执行opencl代码.
是否可以使用Mali OpenCL SDK在ARM CPU(Cortex-a7)上执行OpenCL代码?
我想获得ARM Cortex a8的协处理器寄存器的物理地址,比如c9-用户使能寄存器(USEREN).
我怎么才能得到它 ?
谢谢 !!
我想找出一个 32x4 向量中四个值中的最大值。
我有一个类型的向量float32x4_t:
float32x4_t maxR = {10.21,10.25,23.5,24.86} //FOR EXAMPLE
Run Code Online (Sandbox Code Playgroud)
我想在这四个中找出最大值(10.21,10.25,23.5,24.86),有没有这样做的说明?
我正在考虑使用vpmax_f32内在函数,但得出的结论是这是错误的,因为返回类型float32x2_t再次是向量类型。那么,谁能告诉我这个操作的方法吗?
我很难搞清楚如何告诉Android在我的本机C代码中使用Cortex-A8上的VFP进行浮点运算.我知道我需要设置的编译器标志.问题是我在哪里做?有人可以指导我完成整个过程吗?
我正在使用Eclipse.我使用Cygwin来运行ndk-build.我的程序有效,所以我肯定得到了程序.问题是我告诉Android使用VFP的位置(在哪个文件中)?命令是这样的CFLAGS += -mfpu=vfp.当我将此代码插入Android.mk时,没有任何反应.