与此问题相反:"软件开发人员难以进行低级嵌入式系统编程"我想请求从低级嵌入式系统转向使用OS的更高级系统(尤其是嵌入式Linux)的编程.
我主要使用小型微控制器硬件和软件,但现在只使用软件.我的教育主要包括硬件和嵌入式东西.我没有很多编程课程,也不太了解软件设计或OO编码.
现在,我手中有一个很大的项目,将在嵌入式Linux中完成.我在设计事物和保持可管理性方面存在重大问题,因为我之前并不需要这么做.同样利用多任务和阻塞调用而不是从主函数运行"并行"任务就像另一个世界.
从低级编程转向使用OS(Linux)的大型系统,您有什么样的经验?什么是难的,你是如何解决的?需要什么样的心态?
是否值得从零学习C++或继续使用普通C?
我正在寻找一个工具,它可以图形化地表示Linux内核中使用的硬件设备树.我试图了解特定arm芯片组的linux内核.这将是一个非常有用的工具.
什么工具通常用于单元测试,特别是嵌入式系统的持续集成?
我特别认为您通常需要交叉编译和部署,并且您无法轻松地可视化目标平台.此外,运行测试代码和框架也很困难.
我可以用什么来缓解这些困难?
(我认为它应该是某种双重目标,其中构建服务器在更容易的目标上运行其测试)
任何人都可以给我一个关于获得的个人资料的详细解释adb shell dumpsys meminfo my-app-name吗?
结果如下所述,如何在Android中发现我的应用程序的内存使用情况?:
** MEMINFO in pid 890 [process-name] **
native dalvik other total
size: 10940 7047 N/A 17987
allocated: 8943 5516 N/A 14459
free: 336 1531 N/A 1867
(Pss): 4585 9282 11916 25783
(shared dirty): 2184 3596 916 6696
(priv dirty): 4504 5956 7456 17916
Objects
Views: 149 ViewRoots: 4
AppContexts: 13 Activities: 0
Assets: 4 AssetManagers: 4
Local Binders: 141 Proxy Binders: 158
Death Recipients: 49
OpenSSL Sockets: 0
SQL
heap: …Run Code Online (Sandbox Code Playgroud) 当我在支持软件浮动仿真(硬件浮点禁用)的32位powerpc内核中运行以下C++程序时,我得到了错误的条件评估.有人可以告诉我这里有什么潜在的问题吗?
#include <stdio.h>
int main() {
int newmax = 1;
if ((newmax + 0.0) > 256) {
printf("\nShouldn't be here\n");
} else {
printf("\nShould be here\n");
}
}
Run Code Online (Sandbox Code Playgroud)
编译:
powerpc-linux-g++ -msoft-float -c floating.cxx
powerpc-linux-g++ -o floating floating.o
Run Code Online (Sandbox Code Playgroud)
目标系统中的输出:
[linux:/]$ ./floating
Shouldn't be here
Run Code Online (Sandbox Code Playgroud) 有一个名为的设备文件/dev/console,其名称(major,minor)为(5,1).当我使用串行控制台启动时,它会像我一样连接到我的UART端口/dev/ttyS0.但是当我禁用串行控制台启动时,/dev/console似乎连接到其他地方,/dev/ttyS0总是连接到同一个物理设备,即UART0.是否有任何迹象(如/proc或某些内容/sys)显示此类信息?我在那里试过但却找不到我想要的东西.我开始追踪Linux内核源代码以澄清它们之间的关系.任何人都可以给我一些提示吗?何时,何地,如何以及如何确定/dev/console连接的物理设备?
编辑:最新的发现是:
/dev/console由配置console=内核参数,而这又是使用的getty打开stdin/stdout/stderr.如果未console=指定,/dev/null则打开为stdin/stdout/stderr.但我不确定它们是否完全相同/dev/console,这意味着/dev/console可以将其I/O连接到不同的物理设备./dev/console如果USB HID键盘已插入console=且未配置为UART ,则可以读取.因此/dev/console== /dev/null似乎没什么意义.需要更多调查.在我的嵌入式系统上,我通常使用/ dev/ttyS0作为主控制台.这是通过传递内核参数来实现的,console=/dev/ttyS0并且当init它参与时,getty会在inittab例如由中指定的同一设备上触发.ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100.
是否有可能在不重启的情况下更改这些设置并将控制台切换到另一个终端ttyS1,ttyUSBx甚至是一些伪tty?
我有一个USB设备输出大小为一个字节的数据,我想将这些字节传递给AXI桥上存在的FPGA组件,FPGA和CPU在同一芯片上...它是SoC FPGA Altera Cyclone V. CPU是ARM Cortex-A9.内核版本3.7.0.
有一个软件可以从USB设备读取并写入转储文件......它可以正常工作.我试图用mmap()FPGA将地址映射到虚拟空间并从用户空间写入.这样做......说完一分钟后,内核似乎崩溃了.
我为我的FPGA组件编写了一个驱动程序,并将驱动程序路径作为文件传递给该软件,以便写入它,最终写入我的FPGA组件,但结果相同......内核在随机时间后再次崩溃.
我还写了一个简单的程序,从本地文件中读取字节并将其传递给FPGA ......无论哪种方式(使用mmap()或驱动程序模块)都可以正常工作,无论文件有多大,文件都可以毫无问题地传递给FPGA.文件.
所以问题是当从USB设备传递到FPGA时,无论是使用mmap()还是驱动模块.
这是一个示例崩溃消息:
Internal error: Oops - undefined instruction: 0 [#1] SMP ARM
Modules linked in: ipv6
CPU: 1 Not tainted (3.7.0 #106)
PC is at scheduler_ipi+0x8/0x4c
LR is at handle_IPI+0x10c/0x19c
pc : [<800521a0>] lr : [<800140d4>] psr: 80000193
sp : bf87ff58 ip : 8056acc8 fp : 00000000
r10: 00000000 r9 : 413fc090 r8 : 00000001
r7 : 00000000 r6 : bf87e000 r5 : …Run Code Online (Sandbox Code Playgroud) 我可以使用带有--duplicates标志的hcitool lescan来捕获来自附近两个BLE设备的定期LE广告报告(接近信标):
$ sudo hcitool lescan --duplicates
LE Scan ...
C8:0F:10:29:4D:98 MI1S
C8:0F:10:29:4E:75 MI1S
C8:0F:10:29:4E:75 MI1S
C8:0F:10:29:4D:98 MI1S
C8:0F:10:29:4E:75 MI1S
C8:0F:10:29:4D:98 MI1S
<snip>
Run Code Online (Sandbox Code Playgroud)
这是再次扫描,添加时间戳以显示周期:
$ sudo stdbuf -i0 -o0 -e0 hcitool lescan --duplicates | perl -nle 'print scalar(localtime), " ", $_'
Wed Apr 13 13:46:45 2016 LE Scan ...
Wed Apr 13 13:46:46 2016 C8:0F:10:29:4E:75 MI1S
Wed Apr 13 13:46:47 2016 C8:0F:10:29:4D:98 MI1S
Wed Apr 13 13:46:48 2016 C8:0F:10:29:4E:75 MI1S
Wed Apr 13 13:46:48 2016 C8:0F:10:29:4D:98 MI1S
Wed Apr 13 …Run Code Online (Sandbox Code Playgroud) 我正在Cyclone V SoC上运行Linux 5.1,这是一个FPGA,在一个芯片中具有两个ARMv7内核。我的目标是从外部接口收集大量数据,并通过TCP套接字流出(部分)这些数据。这里的挑战是数据速率非常高,并且可能接近饱和GbE接口。我有一个write()可行的实现,该实现只使用对套接字的调用,但其最高速度为55MB / s;大约是理论GbE限制的一半。我现在正在尝试使零拷贝TCP传输能够提高吞吐量,但是我遇到了麻烦。
为了将数据从FPGA传送到Linux用户空间,我编写了一个内核驱动程序。该驱动程序使用FPGA中的DMA模块将大量数据从外部接口复制到连接到ARMv7内核的DDR3存储器中。当使用dma_alloc_coherent()进行探测时GFP_USER,驱动程序将此内存分配为一堆连续的1MB缓冲区,并通过mmap()在文件中实现并将这些/dev/地址返回给应用程序使用dma_mmap_coherent()预分配的缓冲区,将这些缓冲区公开给用户空间应用程序。
到目前为止,一切都很好; 用户空间应用程序正在查看有效数据,并且吞吐量超过360MB / s足够多,并有剩余空间(外部接口的速度不足以真正看到上限)。
为了实现零拷贝TCP网络,我的第一种方法是SO_ZEROCOPY在套接字上使用:
sent_bytes = send(fd, buf, len, MSG_ZEROCOPY);
if (sent_bytes < 0) {
perror("send");
return -1;
}
Run Code Online (Sandbox Code Playgroud)
但是,这导致send: Bad address。
谷歌搜索了一段时间之后,我的第二种方法是使用管道,splice()然后执行以下操作vmsplice():
ssize_t sent_bytes;
int pipes[2];
struct iovec iov = {
.iov_base = buf,
.iov_len = len
};
pipe(pipes);
sent_bytes = vmsplice(pipes[1], &iov, 1, 0);
if (sent_bytes < 0) {
perror("vmsplice"); …Run Code Online (Sandbox Code Playgroud) embedded-linux ×10
linux-kernel ×6
embedded ×3
linux ×3
tty ×2
android ×1
android-ndk ×1
arm ×1
bluetooth ×1
c ×1
c++ ×1
device-tree ×1
ieee-754 ×1
powerpc ×1
splice ×1
unit-testing ×1
zero-copy ×1