应该为Windows,Linux和嵌入式目标编译一个项目.在主机或嵌入式目标上运行时,应用程序具有行为差异.总结我的要求,这是表:
Target Compiler Behavior
Windows MSVC, gcc A
Host Linux gcc A
Embedded Linux cross pltf gcc B
Run Code Online (Sandbox Code Playgroud)
我希望创建一个自动识别编译器和环境差异的Makefile(无需手动传递参数/定义).是否可以通过在C源文件级别使用条件编译来解决此类问题?
到目前为止我还没有使用automake.
我编写了一个接受不同远程客户端的应用程序,并基于select()将作业分发给不同的处理程序.我注意到在一个运行ARM926EJ-S和内核2.6.33-rc4的平台上,应用程序使用了大量的CPU!通过使用strace -c运行我的应用程序30秒,我可以看到以下内容:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.47 3.680000 204444 18 select
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我从远程客户端连续向应用程序发送数据,则选择使用更少的CPU!
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
44.69 0.340278 175 1945 gettimeofday
40.71 0.310000 25833 12 select
3.94 0.030000 30000 1 fsync
...
Run Code Online (Sandbox Code Playgroud)
我想知道是否select()实施繁忙的等待.但是,在较旧的平台上,运行MIPS处理器和2.6.30.10 Linux内核时,这个问题没有出现,尽管我应该交叉编译strace来确认......!由于数据"很少"发送,我大多数情况下最糟糕!
我想知道问题可能来自哪里!C图书馆?Linux内核?另一方面,我不确定写多线程应用程序是否会因为pthread关键部分而导致更好的性能......?
我在互联网上阅读了两篇有趣的文章:
不幸的是它们已经很老了(从'98/'99)我想知道是否有其他人遇到过那种问题,或者你是否有其他建议来提高性能或指出真正的问题?
编辑:
我注意到更多的客户端连接更多我的应用程序使用CPU,这尽管客户端不发送任何数据!由于大部分时间花在选择上,我虽然选择本身消耗更多的CPU!我可以在ARM下使用哪些其他免费工具来分析我的应用程序并指出问题?Valgrind在ARM9上还没有工作......
在我的基于ARM的主板(DM368)的u-boot中,我手动将某些内核分区块标记为坏.U-boot说它被标记,例如,在写/读内核图像时,我看到它跳过这个坏块.
但是当我尝试从Linux中编写相同的分区(通过NFS加载)时,我看到Linux nandwrite命令使用了这个坏块!我通过几种方式检查了这一点 - Linux忽略了100%的坏块标记.但是在互联网上的每个地方都说BBT是u-boot和Linux的一部分.
那么,捕获量在哪里?
http://lttng.org/download上提供的源代码压缩包中的README文件似乎假设一个构建在同一个Linux系统上,该系统将成为跟踪的目标.我找到了解释如何执行此操作的其他资源(LTTng Project YouTube频道有非常好的截屏视频),但我找不到任何关于如何交叉编译LTTng的说明(具体来说,我猜,liburcu,LTTng-UST ,LTTng-tools和LTTng-modules),并将它们全部安装在嵌入式Linux系统上(我可以在其中构建或重建内核,使用设备树blob,现在是基于ramdisk的文件系统).
我在哪里可以找到有关如何操作的详细信息?
更新:正如Marko在下面的第一条评论中指出的那样,LTTng工具是使用构建的autoconf.理论上我理解我可以找到一个"--host"选项configure,类似于这个答案.也许我需要一个像"ARCH = arm" make这样的参数,就像我在构建内核时使用的那样.但是make install,在使用它们的同一台机器上构建LTTng组件时,使用的交叉编译等效是什么?
如何在arago项目构建中编写自己的配方包?我知道它可以是bitbake文件.但我怎么写,不知道.我在互联网上搜索,但没有找到任何好的来源开始.有人可以提供链接或示例开始吗?
关心
Linux学习者.
在linux中的C程序中,我们可以使用getpid()和getppid()系统调用来获取进程的pid和ppid,
同样,是否有任何系统调用来获取进程/当前进程的名称?
我正在开发嵌入式系统上的恢复机制.如果用户按下GPIO按钮,我想启动进入恢复模式.恢复模式意味着选择不同的内核和根分区.我坚持在条件命令中使用gpio值.如果我写的if gpio input 20; then cmd; fi cmd将始终运行,因为gpio返回错误状态而不是GPIO的值.我怎样才能获得价值?
使用U-Boot命令实现引导选择是否可行(我需要将LED闪烁15秒,如果用户按下按钮至少5秒,则切换到恢复).在C代码中实现这个逻辑会更容易吗?如果是这样在哪里看,有没有例子?
通常,提供恢复系统似乎是嵌入式工程师的常见任务.这种情况下的最佳做法是什么?实现这个的最常见方式是什么?我在网上找不到任何帮助或指导.
我最近开始研究ARM Cortex微控制器.在通过Internet阅读不同的文章时,我通常会发现2个常见术语,如软件中断和硬件中断.这两者的实际差异是什么?你能用一个例子解释一下吗?
c embedded interrupt-handling embedded-linux interrupted-exception
到目前为止,我一直在使用buildroot,最近又切换到Yocto。在buildroot中,根文件系统位于“目标”文件夹中。根文件系统在Yocto中的位置是什么。我知道它将位于“ build / tmp”文件夹中,而不是“ sysroots”文件夹中。
纠正我,如果我错了。
谢谢你的时间
目前,我有一个使用U-boot加载Android操作系统的ARM设备.我希望用linux替换android.所以我所做的是将为ARM设备编译的linux副本加载到SD卡上,启动到U-boot引导加载程序.现在的问题是我告诉U-boot启动vmlinuz linux内核的内存位置是什么?
我怎么找到这个?或指出一些资源也会很棒.
谢谢.
以下是连接到串行端口的当前启动顺序
Reg Version: v1.1.0
Reg Time: 2014-10-115:15:35
Reg Name: hi3719cdmo1a_hi3719cv100_ddr3_1gbyte_16bitx2_2layers_emmc.reg
Fastboot 3.3.0 (zengzhiliang@server180) (Nov 21 2014 - 13:41:16)
Fastboot: Version 3.3.0
Build Date: Nov 21 2014, 13:41:29
CPU: Hi3719Cv100
Boot Media: eMMC
DDR Size: 1GB
Check nand flash controller v610. found
Special NAND id table Version 1.36
Nand ID: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
No NAND device found!!!
Check spi flash controller v350. found
Can't find a valid spi flash chip.
Can't find …Run Code Online (Sandbox Code Playgroud)