这个问题对于嵌入式开发尤为重要.异常处理为生成的二进制输出增加了一些空间.另一方面,没有例外,错误需要以其他方式处理,这需要额外的代码,这最终也会增加二进制大小.
我对你的经历很感兴趣,特别是:
请仅以我的问题为指导.欢迎任何输入.
附录:对于特定的C++对象/可执行文件,是否有任何人具有具体的方法/脚本/工具,它将显示由编译器生成的代码和专用于异常处理的数据结构占用的已加载内存占用的百分比?
我正在研究在DSP上运行Linux的嵌入式系统.现在我们想让它的一些部分可编写脚本,我们正在寻找一种很好的可嵌入脚本语言.这些脚本应该与我们现有的C++代码库很好地集成,小而快.
我知道Lua是这类问题的行业选择.我们可能会选择Lua,因为它是经过验证的,并且被证明是稳定的等等.然而,作为一种编程语言,它有一些相当古怪的角落.
那么,可嵌入语言有哪些替代方案?
编辑:
这是大约一年之后.
我们实际上在我们的嵌入式系统上使用了Lua,它表现非常出色.随着时间的推移,我们为项目的越来越多的部分添加了越来越多的脚本支持,这确实有助于实现它.
性能非常出色,真的.即使是相当复杂的操作,涉及搜索长数组或奇特的字符串操作也表现得非常好.我们基本上从未遇到过与Lua相关的性能问题.
与C函数的接口非常简单,并且工作得非常好.这使我们可以轻松地扩展脚本系统.
最后,我们对Lua的灵活性感到震惊.我们的Lua解释器必须在具有非标准内存分配器的系统上运行,并且不支持双数据类型.在一个头文件中有两个记录良好的位置我们必须修改以使Lua在该系统上工作.它非常适合嵌入!
我正在编程主机 - 加速器系统的主机端.主机在Ubuntu Linux下的PC上运行,并通过USB连接与嵌入式硬件通信.通过将存储器块复制到嵌入式硬件的存储器和从嵌入式硬件的存储器复制来执行通信.
在主板的内存中有一个内存区域,我用它作为邮箱,我在其中写入和读取数据.邮箱定义为结构,我使用相同的定义在主机空间中分配镜像邮箱.
我过去成功地使用了这种技术,所以现在我将主机Eclipse项目复制到我当前项目的工作区,并进行了相应的名称更改.奇怪的是,在构建主机项目时,我现在收到以下消息:
构建目标:fft2d_host
调用:GCC C链接器
gcc -L/opt/adapteva/esdk/tools/host/x86_64/lib -o"fft2d_host"./ src /fft2d_host.o -le_host -lrt./src/fft2d_host.o:在函数`main'中:
fft2d_host.c :(.text + 0x280):重定位被截断以适合:R_X86_64_PC32对./src/fft2d_host.o中COMMON部分中定义的符号`Mailbox'
这个错误意味着什么以及为什么它不会建立在当前项目上,而旧项目是否可以?
我正在阅读一个由Introversion游戏编码器撰写的博客文章,他正在忙着试图从代码中挤出每一个CPU蜱.他提到的一个伎俩是
"将类的成员变量重新排序为最常用和最少使用的."
我不熟悉C++,也不熟悉它的编译方式,但我想知道是否
我知道这个技巧节省的(CPU)时间量是最小的,这不是一个交易破坏者.但另一方面,在大多数函数中,很容易识别哪些变量将是最常用的,并且默认情况下只是以这种方式开始编码.
我怎样才能制作自己的微控制器?我已经完成了一些使用GAL芯片的工作,并编写了一个芯片来执行简单的命令,如添加,加载,移动,xor和输出,但我想做一些更像真正的微控制器.
我该怎么做呢?我已经阅读了一些关于FPGA和CPLD的内容,但不是很多,所以我们正在寻找一些关于如何获得以及如何开始开发的建议.
我正在尝试直接访问嵌入式Linux项目的物理内存,但我不确定如何最好地为我的内容指定内存.
如果我定期启动我的设备,并访问/ dev/mem,我可以轻松地读取和写入我想要的任何地方.但是,在这里,我正在访问可以轻松分配给任何进程的内存; 这是我不想做的
我的/ dev/mem代码是(所有错误检查等删除):
mem_fd = open("/dev/mem", O_RDWR));
mem_p = malloc(SIZE + (PAGE_SIZE - 1));
if ((unsigned long) mem_p % PAGE_SIZE) {
mem_p += PAGE_SIZE - ((unsigned long) mem_p % PAGE_SIZE);
}
mem_p = (unsigned char *) mmap(mem_p, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, BASE_ADDRESS);
Run Code Online (Sandbox Code Playgroud)
这很有效.但是,我想使用其他人无法触及的记忆.我已经尝试通过使用mem = XXXm启动来限制内核看到的内存量,然后将BASE_ADDRESS设置为高于该值(但低于物理内存),但它似乎并不是一致地访问相同的内存.
根据我在网上看到的内容,我怀疑我可能需要一个使用ioremap()或remap_pfn_range()(或两者兼而有之)的内核模块(可以),但我完全不知道如何; 有人可以帮忙吗?
编辑:我想要的是一种总是访问相同物理内存(比如,1.5MB)的方法,并将该内存放在一边,以便内核不会将其分配给任何其他进程.
我正在尝试重现我们在其他操作系统中的系统(没有内存管理),我可以通过链接器在内存中分配一个空间,并使用类似的方式访问它
*(unsigned char *)0x12345678
Run Code Online (Sandbox Code Playgroud)
EDIT2:我想我应该提供更多细节.此内存空间将用于RAM缓冲区,以用于嵌入式应用程序的高性能日志记录解决方案.在我们拥有的系统中,在软重启期间没有什么可以清除或扰乱物理内存.因此,如果我向物理地址X写入一个位并重新启动系统,则重新启动后仍将设置相同的位.这已经在运行VxWorks的完全相同的硬件上进行了测试(这种逻辑在不同平台上的Nucleus RTOS和OS20上也很好用,FWIW).我的想法是通过直接解决物理内存在Linux中尝试相同的事情; 因此,每次启动时都必须获得相同的地址.
我应该澄清这是针对内核2.6.12和更新的.
EDIT3:这是我的代码,首先是内核模块,然后是用户空间应用程序.
要使用它,我用mem = 95m启动,然后insmod foo-module.ko,然后mknod mknod/dev/foo c 32 0,然后运行foo-user,它会死掉.在gdb下运行表明它在赋值时死了,虽然在gdb中,我无法取消引用从mmap获得的地址(虽然printf可以)
FOO-的module.c
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include …Run Code Online (Sandbox Code Playgroud) 我很想开始为外部设备和传感器编写托管代码.是否有任何可以使用.NET编码的设备?有什么建议?
编辑:我要做的主要是学习设备编程的工作原理.在我看来,没有比尝试做一些有趣和酷的事情更好的方法.
在过去的3到5年里,我一直在C和CPython工作.考虑一下我的知识基础.
如果我要使用汇编指令(如MOV AL, 61h支持它的处理器),处理器内部究竟是什么解释此代码并将其作为电压信号发送?如何进行如此简单的指导?
当我试着想到包含MOV AL, 61h甚至包含的众多步骤时,大会甚至感觉像是一种高级语言XOR EAX, EBX.
编辑:我读了一些评论,询问为什么我把它作为嵌入式,当x86系列在嵌入式系统中不常见时.欢迎来到我自己的无知.现在我想,如果我对此一无所知,也有可能其他人也对此一无所知.
考虑到你们在答案中付出的努力,我很难选择一个最喜欢的答案,但我觉得有必要做出决定.没有伤害感情,伙计们.
我经常发现,我对计算机的了解越多,我就越不会意识到我真正知道的.感谢您对微码和晶体管逻辑的开放态度!
编辑#2:感谢这个帖子,我刚刚理解了为什么XOR EAX, EAX比这更快MOV EAX, 0h.:)
有哪些方法可用于确定嵌入式/内存受限系统的最佳堆栈大小?如果它太大那么浪费的内存可以在其他地方使用.但是,如果它太小,那么我们得到这个网站的同名......
为了尝试快速启动:Jack Ganssle在"嵌入式系统设计的艺术"中指出,"凭借经验,人们可以学习标准的,科学的方法来计算堆栈的正确尺寸:随机选择尺寸并希望." 任何人都可以做得更好吗?
要求提供更具体的例子.那么,在没有操作系统的情况下使用IAR Embedded Workbench工具链,针对具有2 kB RAM 的MSP430 MCU的C程序怎么样?使用JTAG调试器时,此IDE可以显示堆栈内容和使用情况.