我正在使用以下代码:
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char **argv) {
char *auyvy = malloc(640 * 480 * 2);
char *ay8 = malloc(640 * 480);
int fd = open("input.uyvy", O_RDONLY);
if (fd >= 0) {
read(fd, auyvy, 640 * 480 * 2);
close(fd);
}
__uyvy_luma_extract(640, 480, auyvy, 640 * 2, ay8, 640);
fd = open("output.y8", O_RDWR | O_CREAT);
if (fd >= 0) {
write(fd, ay8, 640 * 480);
close(fd);
}
}
Run Code Online (Sandbox Code Playgroud)
另外两个文件:https : //github.com/emrainey/DVP/blob/master/libraries/public/yuv/__uyvy_luma_extract.S https://github.com/emrainey/DVP/blob/master/libraries/public /yuv/yuv.inc
我用"gcc -g convert.c __uyvy_luma_extract.S -mfpu = neon"编译
奇怪的是,程序在转换过程中崩溃了.知道我做错了什么吗?
*FIRST EDIT* 我已经上传了一个包含各种文件的zip文件,因此可以在ARM平台上轻松复制:http://www.gentil.com/tmp/convert.zip
*第二次编辑* 我更新了不正确的汇编文件链接.
*第三次编辑* gdb给出以下内容:
Starting program: /home/ai/convert/convert
Program received signal SIGSEGV, Segmentation fault.
0x00008036 in ?? ()
(gdb) bt
#0 0x00008036 in ?? ()
#1 0x000084f2 in __uyvy_luma_extract () at __uyvy_luma_extract.S:38
#2 0x000084f2 in __uyvy_luma_extract () at __uyvy_luma_extract.S:38
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)
哦,这是一个很好的.
如果使用-marm构建但使用-mthumb断开,它可以正常工作.Ubuntu和Android可能有不同的默认值.
它在Thumb模式下中断的原因是汇编函数(总是非Thumb)缺少符号的类型规范,因此链接器不知道它需要使用BLX指令从Thumb代码调用它.执行程序时,因此在Thumb状态下错误地调用汇编函数.当解释为Thumb指令时,此函数的第一个半字0x47ff BLX pc对于不可预测的行为是无效的.显然,Cortex内核只是以明显的方式执行它,即切换到ARM状态,分支到PC值(Thumb状态下的当前指令+4),并将下一个(Thumb)指令地址存储在LR中,从而给出简单地忽略了STM指令的外观.
修复是将此行添加到程序集文件中:
.type __uyvy_luma_extract, STT_FUNC
Run Code Online (Sandbox Code Playgroud)