Tag:

malloc什么时候在裸机环境中返回NULL?

交流内存模型如下: +——–+ Last Address of RAM | Stack | | | | | v | +——–+ RAM | | | | +——–+ | ^ | | | | | Heap | +——–+ | ZI | +——–+ | RW | +========+ First Address of RAM 堆栈和堆空间以相反的方向增加。 它们在中间会相互重叠。 所以我的问题是: 在裸机环境中,malloc何时返回NULL? 在裸机环境中,如何防止堆栈与堆重叠?

ARM GCC生成函数序言

我提到ARM工具链可以生成不同的函数序言。 实际上,我看到了两个完全不同的function序言的obj文件(vmlinux): 第一种情况看起来像: push {some registers maybe, fp, lr} (lr ommited in leaf function) 第二种情况看起来像: push {some registers maybe, fp, sp, lr, pc} (i can confuse the order) 所以当我看到第二个推动额外的pc和sp。 另外我在崩溃实用程序(kdump项目)中看到了一些注释,内核堆栈框架应该有格式{…,fp,sp,lr,pc}让我更加困惑,因为我看到在某些情况下它不是真正。 1.)我是否正确需要一些gcc额外的标志来推动额外的pc和sp在functionprolog? 如果是的话他们是什么? 2.)这是用来做什么的? 基本上,据我所知,我可以只用FP和LR展开堆栈,为什么我需要这个额外的值? 3.)如果这个事情与编译标志没有任何关系 – 我怎么能强制生成这个扩展函数prolog,又是什么目的? 谢谢。

将ARM asm反编译回C

几年前我编写了一个很好的ARM汇编程序,多年来它在其设计的ARM嵌入式系统上完美地完成了它的工作。 现在,现在是将它移植到非ARM系统的时候了,我想知道是否有工具或某种方法来获取我原来的ARM汇编源并从中获取一个rudimentory C文件。 我可以在几天内自己做,但是有一个起点会很好。 如果应用程序或方法是免费的,那就更好了:) 有什么建议?

如何在ARM处理器上检测冷启动与热启动?

我正在寻找一种方法来确定ARM处理器是从冷启动(即初始上电)到热启动(即没有实际功率损耗的复位断言)启动。 具体来说,我正在使用ARM968内核,将使用C或汇编进行确定,我将使用该确定,因此某些操作仅在初始上电时运行,而不是在后续复位时运行。 在之前的项目中,我利用外部电路(例如FPGA)来检测不同的启动方案,但在这种情况下,我仅限于ARM内核。

gcc内联ARM程序集中的`ldm / stm`

我正在尝试使用内联汇编创建一个ldm ( stm )指令,但是在表达操作数​​方面存在问题(特别是:它们的顺序)。 一件微不足道的事 void *ptr; unsigned int a; unsigned int b; __asm__(“ldm %0!,{%1,%2}” : “+&r”(ptr), “=r”(a), “=r”(b)); 不起作用,因为它可能会将r1和b放入r0 : ldm ip!, {r1, r0} ldm期望寄存器按升序排列(因为它们ldm编码)所以我需要一种方法来说明用于a的寄存器低于b的寄存器。 一个简单的方法是固定分配寄存器: register unsigned int a asm(“r0”); register unsigned int b asm(“r1”); __asm__(“ldm %0!,{%1,%2}” : “+&r”(ptr), “=r”(a), “=r”(b)); 但这会消除很多灵活性,并可能使生成的代码不是最佳的。 gcc(4.8)是否支持ldm/stm特殊约束? 或者,有更好的方法来解决这个问题(例如一些__builtin函数)? 编辑: 因为有建议使用“更高级别”的结构……我想解决的问题是32位32位字的打包(例如输入是8个字,输出是5个字)。 伪代码是 asm(“ldm %[in]!,{ %[a],%[b],%[c],%[d] }” …) asm(“ldm […]

如何在arm平台上调试随机数据中止问题

随着基于ARM的项目的开发,我们随机获取数据,也就是当我们使用它时,我们得到数据中止中断。 但是当我们使用r14或r13检查寄存器映射时,数据中止并不总是在同一点,即使检查函数回调。 无论如何,我可以准确地获取有关数据中止的根本原因的信息吗? 我已经尝试了ref 2,但是当我捕获有关中断的数据时却无法得到相同的结果。 相关ARM数据中止错误exception调试 ARM:如何分析 数据中止exception

如何在Xcode LLVM中编写关于LOOP的内联汇编代码?

我正在研究内联assembly。 我想在Xcode 4 LLVM 3.0编译器下在iPhone中编写一个简单的例程。 我成功编写了基本的内联汇编代码。 例子: int sub(int a, int b) { int c; asm (“sub %0, %1, %2” : “=r” (c) : “r” (a), “r” (b)); return c; } 我在stackoverflow.com找到它并且它工作得很好。 但是,我不知道如何编写有关LOOP的代码。 我需要汇编代码 void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity) { for(int i=0; i<numPixels; i++) { dst[i] = src[i] + […]

快速ARM NEON memcpy

我想在ARMv7核心上复制图像。 天真的实现是每行调用memcpy。 for(i = 0; i < h; i++) { memcpy(d, s, w); s += sp; d += dp; } 我知道以下内容 d, dp, s, sp, w 都是32字节对齐,所以我的下一个(仍然非常天真)实现是沿着的 for (int i = 0; i < h; i++) { uint8_t* dst = d; const uint8_t* src = s; int remaining = w; asm volatile ( "1: \n" […]

我们可以优化代码以降低功耗吗?

是否有任何优化代码的技术,以确保较低的功耗。架构是ARM.language是C.

arm皮质a9交叉编译奇怪的浮点行为

我试图将一个更大的应用程序从x86移植到arm cortex a9,但是当交叉编译应用程序时,我得到了像modf这样的浮点函数的奇怪分段错误,其他libc ++函数似乎只是处理浮动错误,但不会崩溃(见下文)。 所以我尝试了这个小测试程序,它也可以触发错误。 测试程序的输出(见下文)应该certificate我的问题。 #include int main(int argc, char *argv[]) { double x = 80; double y = 0; std::cout << x << "\t" << y << std::endl; return 0; } 编译在arm cortex a9: @tegra$ g++ -Wall test.cpp -o test_nativ @tegra$ ./test_nativ 80 0 交叉编译 @x86$ arm-cortex_a9-linux-gnueabi-g++ test.cpp -o test_cc @tegra$ ./test_cc 0 […]