Tag: arm

更改函数指针的地址值

我在C中有以下代码: int addInt(int n, int m) { return n + m; } int (*functionPtr)(int, int); functionPtr = &addInt; functionPtr是一个函数指针,它指向函数addInt的特定地址。 我想改变它的1位值,但我无法弄清楚如何。 假设functionPtr在最后一个语句之后指向0xABC0 (假设一个16位地址)。 我想将其值更改为0xABC1 。 我试图将值与0x1进行OR运算,但我猜操作数转换有问题: functionPtr = &addInt | 0x00000001; // addresses are of 32 bits 我知道乱搞指针是有风险的,但我必须更改地址的LSB才能进入ARM Cortex-M4 MCU的Thumb状态。

C全局匿名结构/联合

我有一个uint64变量,通常只需要高或低32位访问。 我使用的是32位ARM Cortex M0,为了提高速度,我试图将uint64变量与C中的两个uint32变量重叠,使用匿名结构,希望避免指针算法访问成员。 我正在尝试做什么? 可能是使用命名联合同样快,但现在我只是感兴趣,如果它可以没有。 以下内容无法成功编译: http://goo.gl/ejx37y #include volatile union { uint64_t ab; struct { uint32_t a, b; }; }; int main(void) { a = 1; };

霓虹灯比较

根据Neon文档: 如果对于通道的比较为真,则该通道中的结果将所有位设置为1。 如果通道的比较为假,则所有位都设置为零。 返回类型是无符号整数类型。 我写了一小段代码来检查这个,我观察结果为0和-1而不是0和1.任何人都可以告诉我这背后的原因吗? 码: float c1[4] = {12.0f,12.0f,12.0f,12.0f}; float c2[4] = {13.0f,12.0f,9.0f,12.0f}; float32x4_t t1,t2; uint32x4_t rq; t1 = vld1q_f32(c1); t2 = vld1q_f32(c2); rq = vceqq_f32(t1,t2); printf(“start\n”); for( int i = 0;i < 4; i++){ printf("%d\n",rq[i]); } printf("end\n"); 结果: start 0 -1 0 -1 end

边框检查图像处理

我想在处理图像处理中的任何滤镜时注意边界条件。我正在外推边框并创建新边界。例如,我有4×3输入: //Input int image[4][3] = 1 2 3 4 2 4 6 8 3 6 9 12 //Output int extensionimage[6][5] = 1 1 2 3 4 4 1 1 2 3 4 4 2 2 4 6 8 8 3 3 6 9 12 12 3 3 6 9 12 12 我的代码: #include #include #include […]

未处理的exception0xC0000008:在动态重新编译器中指定了无效的句柄

代码是MIPS-> ARM动态重新编译器。 在运行recompile_function()多次之后,它会在下面代码的条件子句中崩溃,尽管在早期的函数运行期间它可以运行这行代码而没有任何问题。 void recompile_function(){ //recompilation code …… if (out > (u_char *)((u_char *)base_addr + (1 << TARGET_SIZE_2) – MAX_OUTPUT_BLOCK_SIZE – JUMP_TABLE_SIZE)) out = (u_char *)base_addr; // other code …… } 变量输出是用于编写重新编译代码的指针。 base_addr始终指向已分配内存空间的原始开始。 每次写入指令时,变量输出进行4个字节,而base_addr保持不变。 extern char extra_memory[33554432]; #define BASE_ADDR ((int)(&extra_memory)) void *base_addr; u_char *out; void new_dynarec_init() { protect_readwrite(); base_addr = ((int)(&extra_memory)); out = (u_char *)base_addr; […]

如何在编译器中启用内在函数?

谁能解释一下:如何在c代码中启用内在函数? 我想在armv5TE中使用特殊的dsp指令 考虑qadd指令,当我使用汇编程序方法时它很好用,如下所示: inline int function_qadd(int a, int b) { __asm__ ( “qadd %0, %1, %2” : “=r” (a) : “r” (a), “r” (b)); return a; } 但是当我尝试使用__qadd内在而不是像这样的asm: int add_result = __qadd(5,10); LOGI(“qadd=’%d'”, add_result); 我收到了错误: 错误:未定义引用’__qadd’ 我做错了什么,如何在c代码中启用内在函数? 更新: 我有ndk android-ndk-r8c (windows版),它默认为GCC 4.6 : GCC 4.6编译器仍然是默认的, 除了我在android.mk中明确指定 NDK_TOOLCHAIN_VERSION=4.6 我的编译器标志是: LOCAL_CFLAGS += -std=c99 -ffast-math -march=armv5te -mfpu=vfp -mfloat-abi=softfp […]

如何在android中使用arm_acle C语言扩展

有许多使用arm neon intrinsics for android的例子,ndk甚至有一个例子。 我已经得到了没有问题的工作。 Arm还提供ACLE(Arm C语言扩展),但我可以通过示例找到几乎没有的东西。 arm文档本身仅建议包含arm_acle.h头文件,但是我仍然会出错。 谷歌几乎没有提供任何援助:)同时,搜索arm社区委员会的结果也很少。 人们不使用acle,而是选择内联汇编吗? 当我参与arm_acle.h并尝试使用__ssat()调用时,我必须进一步定义一个指令__ARM_FEATURE_CRC32,并在构建时得到错误“错误:’__ builtin_arm_qadd’未在此范围内声明” 标头看起来不包含任何依赖项,文档列表没有特定的链接依赖项。 任何建议? 还是我忽略了一些基本的东西? 附加信息:我的目标arch是armv7-a-neon,在构建时在make文件中正确检测到。 然后我进一步定义“-mfloat-abi = softfp -mfpu = neon -march = armv7”,但无济于事。 如果我撤消我的额外调试定义,我只是得到“错误:#error”ACLE内在支持未启用。“(霓虹灯支持和检测成功)搜索我的代码库,arm_acle.h头文件仅用于clang 主机工具,而arm_neon.h存在于几个预编译工具臂目录中。 正如我所说,arm_neon工作检测工作正常,运行正常,这是arm_acle组件不起作用。 搜索http://androidxref.com等在线存储库似乎表明只支持霓虹灯?

是否可以在运行时在M0 +上设置ISR处理程序

我的SAMD21 ARM M0 +有一个“默认”resetVectors.c文件。 它有一些看起来像: __attribute__ ((section(“.vectors”))) const DeviceVectors exception_table = { … }; 在其中定义不同的处理程序存根的位置。 出于测试目的,我想使用其中一个未使用的外设IRQ。 默认情况下,未使用的设置为NULL地址。 我已向自己certificate我可以修改该文件,并在编译时更改我未使用的IRQ(21)以触发处理程序。 但是,是否可以在编译时间之外完成此操作? 我观察到该表似乎是基于偏移0.所以我尝试了这个: DeviceVectors *table = 0x0000000; table->pvReserved21 = PV21Handler; 但这只是挂板。 是否有动态方式在运行时分配处理程序?

使用GNU ToolChain在Windows命令行上运行ARM / C.

因此,当我问一个关于在IDE中运行此代码的类似问题时,您可能会认出我。 最后我得到的建议是我应该学会从命令行一起运行它们。 因此我接受了建议并安装了来自Codesourcery Lite MentorGraphics的GNU工具链(不确定这是否有意义)。 我能做的命令就像是 > arm-none-eabi-gcc -o main main.c -T script 但是,我很难找到我应该如何使用这些命令。 我试过了 > arm-none-eabi-gcc -o main (my c filename).c -T (my ARM filename).s 但是我从ARM文件中得到了语法错误。 然后我试着去做 > arm-none-eabi-gcc -o main (my c filename).c 但由于外部“add2”,这不起作用 > arm-none-eabi-as add2.s 这给我一个文件“a.out”,但我不知道那是做什么的。 这是我的代码: 臂 .global add2 add2: stmfd sp!, {v1-v6, lr} @ ‘standard’ entry, save registers on […]

在bcm2836上使用GPIO

我正在为我的RPI2 OS编写GPIO驱动程序。 我正在冲浪很长时间,但我发现只有linux数据。 我应该怎么做这样的function void gpio_set(int pin); void gpio_clr(int pin); 在C中为司机。 或者,也许它可以通过内联汇编来完成?