在编译一些代码时,我注意到在-O0和-O1之间创建的汇编程序存在很大差异.我想要启动启用/禁用优化,直到我发现导致汇编程序发生某些变化的原因.
如果我使用-fverbose-asm来确切地找出O1与O0相比正在启用哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然如此大不同?即使我用O0运行gcc并手动添加fverbose-asm所说的用O1启用的所有标志,我也没有得到与使用O1时相同的汇编程序.
除了'-f ...'和'-m ......'之外还有什么可以改变的吗?
或者就是'O1'与无法关闭的'O0'相比具有一定的魔力.
对于隐秘性感到抱歉 - 这与使用GCC + ARM减少递归期间的堆栈使用有关,但是提及它使问题有点难以理解.
我正在为极其资源受限的嵌入式设备(http://www.espruino.com)编写一个JavaScript解释器,每当我认为我已经正确地实现了一些JavaScript时,我就会意识到我错了.
我现在的问题是[].您如何正确实现JavaScript最基本的部分之一?
我查看了JavaScript规范,也许我找不到正确的位,但我找不到有用的答案.
我之前曾假设您有效地拥有两个"地图" - 一个用于整数,一个用于字符串.并且数组长度是最高整数加1的值.然而,根据Chrome上的jsconsole,这似乎是错误的:
var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6
Run Code Online (Sandbox Code Playgroud)
但是也:
var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6
Run Code Online (Sandbox Code Playgroud)
所以...很棒 - 一切都被转换成一个字符串,并且使用表示整数的最高值字符串(加一)来获取长度?错误.
var a = [];
a["05"] = 42;
a.length; // 0
Run Code Online (Sandbox Code Playgroud)
"05"是一个有效的整数 - 即使是八进制.那为什么它不会影响长度呢?
您是否必须将字符串转换为整数,然后在转换回字符串时检查它是否匹配?
有没有人引用用于存储和获取数组或对象中的项的确切算法?它看起来应该很简单,但看起来它实际上并非如此!
我试图将大量代码塞进一个相当小的 ARM 微控制器中。我已经做了尺寸优化工作的巨量已经和我到哪里,我需要加倍运算的地步,但是__aeabi_ddiv,__aeabi_dadd与__aeabi_dsub一些最大的功能,整个设备上。
这两个__aeabi_dadd和__aeabi_dsub是尽管基本上做同样的工作〜1700 bytes每个(双打的最高层位为符号位)。两个函数都没有引用另一个。
实际上,我需要做的就是替换__aeabi_dsub为:
double __aeabi_dsub(double a, double b) {
// flip top bit of 64 bit number (the sign bit)
((uint32_t*)&b)[1] ^= 0x80000000; // assume little endian
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
我会节省大约 1700 个字节 - 所以翻转第二个参数的符号,然后使用__aeabi_dadd.
我知道这可能不是 100% 与 IEEE 规范兼容,但在这个平台上,为了节省 > 1% 的可用闪存,我可以接受。
我的问题是,当我添加该函数时,链接器会抱怨undefined reference to __aeabi_dsub- 这似乎很奇怪,因为定义它的行为导致了错误。
这似乎与链接时间优化 ( -flto) 有关 - 将其关闭意味着一切正常,但它会增加 8k 的固件大小,使其不再适合可用的闪存!
那么__aeabi_dsub …
我有一个用于嵌入式ARM处理器的递归下降解析器(在C + GCC中,用于ARM Cortex M3).
在运行它的同时我注意到它使用了大量的堆栈空间(甚至超出了你的预期)并且经过仔细检查我发现这种情况正在发生:
extern int bar(int *p);
int foo() {
int z = foo(); // it's an example!
int n[100]; // stack usage
return z+bar(n); // calling bar(n) stops n from being optimised out
}
Run Code Online (Sandbox Code Playgroud)
运行arm-none-eabi-gcc -fomit-frame-pointer -S test.c的结果
foo:
str lr, [sp, #-4]! ; Push link register
sub sp, sp, #412 ; Reserve space on stack, even if we don't need it now!
bl foo ; Recurse
str r0, [sp, #404] ; Store result
... …Run Code Online (Sandbox Code Playgroud) 我有一个Chrome Packaged Web应用程序(这是访问串行端口所必需的),我希望能够在我点击其上的链接/按钮时从我的网站(包含一些数据)启动它网站.
如果它可以检测用户是否没有运行chrome或者没有安装Web应用程序并且可以将它们引导到正确的位置,那就更好了......
有什么例子吗?这似乎是一个显而易见的事情,但我真的很难找到任何东西......
google-chrome web-applications protocols handler google-chrome-app
我正在为基于 STM32F103 的 ARM 微控制器(使用 GCC 编译)开发一些软件。我的一些用户希望能够对同一芯片的不同版本(具有更多 RAM)使用相同的二进制文件,因此我需要一种方法来找出运行时我有多少 RAM。
有一个地址 (0x1FFFF7E0) 包含闪存大小,但似乎没有包含 RAM 大小的地址!
显而易见的解决方案是运行内存地址检查哪些是可读/可写的,但我已经尝试过这个和芯片 HardFaults 从太高的 RAM 地址读取时(我不知道如何恢复)。
关于解决这个问题的最佳方法有什么想法吗?理想情况下,我会以实验方式进行,因为某些芯片(例如我现在使用的 STM32F103RCT6)实际上似乎具有 64kB 的 RAM,即使数据表表明它们有 48 个。例如,0x1FFFF7E0 寄存器报告 256kB 的可用闪存,即使 512kB 可用.
看起来我可以在 CCR 寄存器中设置 BFHFNMIGN 位,然后尝试从软件中断中访问内存 - 但是我不知道如何在 GCC+STM32 中调用或创建软件中断
是否可以在Raspberry Pi上设置硬件计时器外设并在特定时间(在Linux下运行)获得中断?有图书馆/例子吗?
我知道当引脚通过connectionPi(当以管理员权限运行时)发生引脚更改时,您会得到一个irq,因此,如果有一个免费的定时器外设,这似乎是可能的。
Pi论坛上的此帖子暗示有一个免费的STC注册,并且该注册提供了一些信息,但被标记为“ BareMetal”,我认为这意味着不涉及Linux?
背景:我知道这根本不是Linux的优势,但是我有兴趣向Espruino JS解释器添加硬件计时器功能。它最初是为微控制器设计的,包含一些希望通过计时器IRQ运行的代码(例如,用于软件PWM,定时脉冲以及其他位和鲍勃)-如果在线程中运行,则该部分实际上是无用的。
我有一些ARM代码,我试图在Cortex M3上运行.我用Thumb编写的大部分代码都是用C语言编写的 - 但对于某些函数,我希望能够运行普通的ARM代码(据我所知,这在M3上是可行的吗?).
所以...
原始C代码和汇编:
int donothing(int a) {
return a;
}
00000068 <donothing>:
68: e52db004 push {fp} ; (str fp, [sp, #-4]!)
6c: e28db000 add fp, sp, #0
70: e24dd00c sub sp, sp, #12
74: e50b0008 str r0, [fp, #-8]
78: e51b3008 ldr r3, [fp, #-8]
7c: e1a00003 mov r0, r3
80: e28bd000 add sp, fp, #0
84: e8bd0800 ldmfd sp!, {fp}
88: e12fff1e bx lr
Run Code Online (Sandbox Code Playgroud)
编译使用 arm-none-eabi-gcc -mfloat-abi=soft -nostdinc -nostdlib
我转而使用blx r4- 如果基地址&3为0,它应该交换.
在GDB中逐步执行此操作,即使地址包含正确的数据,它也会一旦到达显示的行,就会进入HardFaults.
(gdb) …Run Code Online (Sandbox Code Playgroud) 我在Mac App商店中编写了一个显示一些图形的程序.偶尔它会在互联网上更新这些内容.和大多数人一样,我现在必须使用Sandbox我的应用程序.
几乎所有东西都在工作,但是当更新它时会在我的应用程序自己的包中保存一个文件并且使用'sandboxd:deny file-write-create'失败
我只是用fopen(...,"wb")
传递给fopen的路径是:/Users/MyUser/Library/Developer/Xcode/DerivedData/MyApp-czuwveatgjffaggwqjdqpobjqqop/Build/Products/Debug/My.app/Contents/Resources/the_file.foo
使用以下命令创建路径:
CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyResourcesDirectoryURL(bundle);
CFURLGetFileSystemRepresentation(url, true, (UInt8*)buf, sizeof(buf));
Run Code Online (Sandbox Code Playgroud)
我在做一些明显不对的事吗?我的应用程序是多平台的,所以理想情况下我会继续使用fopen/etc.据我所知,应该允许应用程序写入自己的捆绑包,即使它被禁止在其他地方做任何事情?
谢谢!