我想isnan()在NEON内在函数中使用功能.Below是我的代码:input1,input2和输出类型为float.这些值从输入图像/帧的ROI更新.(图像处理示例)
for(x = 0;x<ht;x++){
for(y = 0;y<width;y++){
float a = (input1[x + (y * width)]);
float b = (input2[x + (y * width)]);
// check for division by zero
output = 0.0f;
if (!(isnan(a) | isnan(b) | (b == 0)))
{
output[x + (y * width)] = a / b;
}
}
Run Code Online (Sandbox Code Playgroud)
}
通过使用牛顿Raphson方法,我试图通过使用氖内在进行除法.但是我无法获得任何内在函数.isnan我得到了 __builtin_isnan()这不是一个内在函数.我怎么能isnan用于float32x4_t a和float32x4_t b
我有一个带有两个不同CPU ABI的android系统 - armeabi-v7a and x64.为此,我必须构建应用程序代码以使其正常工作.我的应用程序(用c语言)无论如何都不会运行任何一个平台.或者是否有任何常见的工具链,我可以用它来构建相同的工具链.在arm-EABI-GCC?
我正在尝试将最初为x86架构编写的代码移植到arm.
最初它是为msvc/win32开发的,代码中有很多错误,所以可能有UB.
当使用gcc编译时,代码正在使用x86,但是它有不同的行为.它似乎丢失了数组中的一些数据,武器开关不起作用.它影响了服务器和客户端库.
应用程序是单线程的,因此不是同步问题.
默认情况下,char在arm上是无符号的,所以我添加-fsigned-char到编译器标志,但它没有解决问题.arm和x86 c代码之间还有什么区别?
我尝试使用gcc和clang在arm上编译代码并且没有区别,因此它不是编译器错误.
PS我使用gcc-4.9(而不是4.8)编译了x86的代码,并得到了相同的行为.之后,我结合了两个编译器,发现问题出在net_encode.c中.
到那时,塞巴斯蒂安骑士发现了这一点
iValue /= pField->multiplier;
iValue *= pField->multiplier;
当iValue为整数且pField-> multiplier == 1.0f时,有时会更改整数值.
可以通过在乘法之前添加检查pField-> multiplier!= 1.0f来修复它.
我试图通过编写同样的霓虹内在函数来击败"memcpy"函数.以下是我的逻辑:
uint8_t* m_input; //Size as 400 x300
uint8_t* m_output; //Size as 400 x300
//not mentioning the complete code base for memory creat
memcpy(m_output, m_input, sizeof(m_output[0]) * 300* 400);
Run Code Online (Sandbox Code Playgroud)
氖:
int32_t ht_index,wd_index;
uint8x16_t vector8x16_image;
for(int32_t htI =0;htI < m_roiHeight;htI++){
ht_index = htI * m_roiWidth ;
for(int32_t wdI = 0;wdI < m_roiWidth;wdI+=16){
wd_index = ht_index + wdI;
vector8x16_image = vld1q_u8(m_input);
vst1q_u8(&m_output[wd_index],vector8x16_image);
}
}
Run Code Online (Sandbox Code Playgroud)
我在imx6硬件上多次验证了这些结果.
结果:
Memcpy :0.039 milisec
neon memcpy: 0.02841 milisec
Run Code Online (Sandbox Code Playgroud)
我读了一些没有预先说明的说明,我们不能打败MEMCPY.
如果是,那么我的代码如何给出这些结果.是对还是错
我目前正在研究LPC3141开发板.我试图关闭一个GPIO引脚,同时让其他GPIO引脚处于相同的状态.我的问题是我可以单独打开它们,但是当我想关闭一个坑时,它会进行"总线重置"并将它们全部关闭.当我使用位移时,我无法弄清楚为什么它会重置所有这些.以下是我的代码示例:
#define PINS (*((volatile unsigned int *)0x130031C0))
#define MODE0 (*((volatile unsigned int *)0x130031D0))
#define MODE0_SET (*((volatile unsigned int *)0x130031D4))
#define MODE0_RESET (*((volatile unsigned int *)0x130031D8))
#define MODE1 (*((volatile unsigned int *)0x130031E0))
#define MODE1_SET (*((volatile unsigned int *)0x130031E4))
#define MODE1_RESET (*((volatile unsigned int *)0x130031E8))
void delay (void);
void c_entry(void){
//Prg gpio pins (glej user manual str 312-318
//Bit manipulation (spremenim samo 1 bit v registru inne celega)
MODE1 = MODE1 | (0x1 << 6);
MODE1 = MODE1 | (0x1 << 8); …Run Code Online (Sandbox Code Playgroud) 我有一个uint64变量,通常只需要高或低32位访问.我使用的是32位ARM Cortex M0,为了提高速度,我试图将uint64变量与C中的两个uint32变量重叠,使用匿名结构,希望避免指针算法访问成员.
我正在尝试做什么?可能是使用命名联合同样快,但现在我只是感兴趣,如果它可以没有.以下内容无法成功编译:
#include <stdint.h>
volatile union {
uint64_t ab;
struct { uint32_t a, b; };
};
int main(void)
{
a = 1;
};
Run Code Online (Sandbox Code Playgroud) 我在C中制作了一个冒泡排序程序,并检查了它的汇编列表文件.但我无法得到for循环的位置.你能让我知道for循环和if语句在哪里?
#include<stdio.h>
int main()
{
int arr[5]={2,4,5,6,1};
int i,j,tmp;
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
if(arr[j]>arr[j+1])
{
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
for(i=0;i<5;i++){
printf(" %d",arr[i]);
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里是汇编列表文件.
; generated by ARM C Compiler, ADS1.2 [Build 848]
; commandline [-O1 -browseinfo "0xff
" -S -g+ -fk -J:cw:]
CODE32
AREA ||.text||, CODE, READONLY
main PROC
|L1.0|
STMFD sp!,{r4,lr}
SUB sp,sp,#0x18
MOV r2,#0x14
LDR r1,|L1.148|
ADD r0,sp,#4
BL __rt_memcpy_w
MOV r12,#0
|L1.28|
MOV r0,#0
|L1.32|
ADD r1,sp,#4
ADD r2,sp,#4
ADD …Run Code Online (Sandbox Code Playgroud) 在函数的结尾,我看到了很多类似以下的指令:
.long 0xXXXXXXXX ; unknown opcode
Run Code Online (Sandbox Code Playgroud)
他们代表什么?
如注册字段描述中所示.例如:
[47:0] BADDR [47:x]转换表基址,位[47:x].位[x-1:0]为res0.
我的Tiva C控制器有问题很奇怪,我想要一些帮助,基本上它在一条sprintf线上崩溃,没有明显的理由这样做.我的应用程序只是一个智能玩具,可以通过蓝牙在各种模式下进行控制.对于模式,我们使用有限状态机代码并读取玩具的当前加速度仅用于监控,并且每隔一段时间使用周期性定时器发送它,每隔几秒产生一次周期性中断以更新值.促进
现在,加速度的读取是通过一个简单的函数读取完成,直到尝试将该读数存储在字符串中,并且程序只是抛出一个硬故障.这个功能(读取加速度)在玩具车的所有其他模式下都能正常工作,除了这种新模式它始终崩溃并抛出硬故障错误.我目前的想法是,它可能是由于太多的函数调用所以堆栈已满,但我怎么知道堆栈是否已满?
这是它崩溃的线:
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的sprintf存储从加速轴读出的值x,y和z为什么发生这种情况的任何想法然后存储在加速度变量?
这也是定时器处理程序里面keil的故障报告我用来调用一个ReadAccel()函数,我做的函数除了最近的一个以外的所有模式都有效,所以我想我会把函数放在定时器处理程序里面的函数中来节省一点从堆栈,但它仍然给出了一个严重的错误

如果有人可以重定向我如何判断这是否是一个堆栈完全错误我会非常感激,因为我认为这是它的本质.
void TIMER2A_Handler(void)
{
char acceleration[22];
RawX_Axis1=ReadAccelX();
X_Axis1 = RawX_Axis1 * 0.00390625+0.35;
RawY_Axis1=ReadAccelY();
Y_Axis1 = RawY_Axis1 * 0.00390625+0.08;
RawZ_Axis1=ReadAccelZ();
Z_Axis1 = (RawY_Axis1 * 0.00390625)+1.08;
sprintf(acceleration,"x%.2f y%.2f z%.2f",X_Axis1,Y_Axis1,Z_Axis1);
UARTSend(UART3_BASE,acceleration);
UARTCharPut(UART3_BASE,'\n');
TIMER2_RIS_R = 0xFFFFFFFF;
TIMER2_ICR_R = 0xFFFFFFFF;
}
Run Code Online (Sandbox Code Playgroud)