我在嵌入式开发中遇到了一个串口问题./ dev/ttyS0,/ dev/ttyS2和/ dev/ttyS3都可以正常工作而没有问题.但在某些情况下,访问/ dev/ttyS1会抛出以下两个"oops"消息.
我不知道在哪里开始追踪原因,你能帮忙吗?
1
Unable to handle kernel NULL pointer dereference at virtual address 0000013c
pgd = c0004000
[0000013c] *pgd=00000000
stopped custom tracer.
Internal error: Oops: 17 [#1] PREEMPT
Modules linked in: macb
CPU: 0 Not tainted (2.6.24-rc5-rt1 #2)
pc : [<c01a9e60>] lr : [<c01a9e90>] psr: 60000093
sp : c3c25f10 ip : 0000012c fp : c3c25f1c
r10: 00000000 r9 : 00000000 r8 : 00000000
r7 : 000000ac r6 : 00000000 r5 : 0000012c r4 : 00000000
r3 …Run Code Online (Sandbox Code Playgroud) 我使用以下选项运行configure:
./configure --target=armv5tel CC=arm-linux-gnueabi-gcc --host=i686-linux
Run Code Online (Sandbox Code Playgroud)
然后跑了make
我遇到以下错误:
m_cpuid.S: Assembler messages:
m_cpuid.S:40: Error: bad instruction `pushl %ebp'
m_cpuid.S:41: Error: bad instruction `movl %esp,%ebp'
m_cpuid.S:42: Error: bad instruction `pushl %ecx'
m_cpuid.S:43: Error: bad instruction `pushfl'
m_cpuid.S:44: Error: bad instruction `pushfl'
m_cpuid.S:45: Error: bad instruction `popl %eax'
m_cpuid.S:46: Error: bad instruction `movl %eax,%ecx'
m_cpuid.S:47: Error: bad instruction `xorl $0x200000,%eax'
m_cpuid.S:48: Error: bad instruction `pushl %eax'
m_cpuid.S:49: Error: bad instruction `popfl'
m_cpuid.S:50: Error: bad instruction `pushfl'
m_cpuid.S:51: Error: bad instruction `popl %eax'
m_cpuid.S:52: Error: …Run Code Online (Sandbox Code Playgroud) 我正在开发一个从紧凑型闪存和tmpfs运行的嵌入式Linux系统.闪存以只读方式安装,通常应保持这种状态,但偶尔我需要向闪存写入内容.
写入闪存(通过PATA接口)时应该采取哪些预防措施?由于我无法回想起的原因,我正在使用ext4安装的文件系统barrier=1,data=ordered,nodelalloc,noatime,ro是否是一个可怕的想法?系统需要在零干预的情况下快速启动.我很想做tune2fs -c 0 -i 0.这是一个更糟糕的想法吗?
另外,当我写东西时,我显然需要重新安装flash读写,执行写操作,然后重新安装只读.问题是有几个不同的进程(c ++二进制和shell脚本)可能需要这样做.很明显,每个进程不加选择地重新安装文件系统只读它是一个坏主意.
协调这个的最佳方法是什么?flock看起来很有希 这是最好的方式,我需要担心什么?我不希望过时的锁阻止写入或使文件系统无限期写入.
澄清:通过"偶尔"写作,我的意思是系统可以使用多年而不需要写任何东西.什么东西写,它可能是几百字节.与此同时,系统需要承受不可预测的电源循环而无需任何干预.
如何保留SDRAM的一部分,比如4个字节,在U-Boot和Linux内核之间传递一个标志,以便链接器不会初始化这个保留的内存位置,并在热启动后保留该值?我试图避免使用bootargs来最小化嵌入式应用中使用的NAND闪存的磨损.我的问题可以被认为是对解决方案的扩展: 如何在ARM处理器上检测冷启动与热启动?
我使用下面的链接器脚本构建了u-boot.lds并使用以下命令构建它:-fno-zero-initialized-in-bss但没有成功.
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm926ejs/start.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
_U_BOOT_FLAG = .; . = . + 4;
.bss (NOLOAD) : { *(.bss) …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 12.04上构建了一个应用程序,并尝试在嵌入式系统上运行它.我跑apt-cache show libc6了我的开发机器,显示(除其他外)
Package: libc6
Priority: required
Section: libs
Architecture: i386
Source: eglibc
Version: 2.15-0ubuntu10
Replaces: belocs-locales-bin, libc6-i386
Provides: glibc-2.13-1, libc6-i686
Run Code Online (Sandbox Code Playgroud)
嵌入式设备上存在的libc6版本为2.8.90.在\lib设备上的目录中,我有2个库
libc-2.8.90.so
libc.so.6
Run Code Online (Sandbox Code Playgroud)
当我将我的应用程序复制到嵌入式设备上时,我收到以下错误
/usr/lib/libc.so.6: version `GLIBC_2.15` not found (required by ./ServerSocketApp)
Run Code Online (Sandbox Code Playgroud)
我知道如果可能的话,当我在开发机器上构建应用程序时,我需要强制它链接到嵌入式设备上存在的相同版本的libc6.我遇到的问题是我根本不知道该怎么做.我发现的任何答案对我来说都毫无意义.是否有一些选项需要传递给g ++以使其链接到版本2.8.90 ??
绝望中我想是可以将我的开发机器上的libc复制到嵌入式设备上代替已经存在的东西并希望最好的??? 我似乎无法在网上找到任何文件,用简单的术语解释你如何解决这个问题,所以任何建议都会非常受欢迎,因为我在这里撕裂我的头发.
我正在使用gpio中断.我在"/ sys/class/gpio/gpio38/value"中有一个文件.我想在属性值发生变化时发出通知.那么我怎样才能在用户空间中实现这一目标.由于我已经收集了信息,我可以使用select(),poll()或epoll().那么这个应用哪个是正确的?或者请建议我,如果我可以使用/ proc/irq或其他东西.谢谢 :)
我在ARM CortexA8的实际程序中找到了linux以下问题:
´*** glibc detected *** ./PRUssExternal: double free or corruption (top): 0x00024fe8 ***´
Run Code Online (Sandbox Code Playgroud)
我正在网上搜索它,我发现管理这个问题最有用的程序是Valgrind.
然后我尝试在交叉编译中编译到我的系统,在配置中使用以下选项.我正在使用Valgrind 3.8.1
@ -virtual-machine:〜/ valgrind-3.8.1 $ CC = arm-cortexa8-linux-gnueabi-gcc CFLAGS =" - pipe -Os -mtune = cortex-a8 -march = armv7-a -mabi = aapcs-linux -msoft-float -I/opt/OSELAS.Toolchain-2011.11.3/arm-cortexa8-linux-gnueabi/gcc-4.6.2-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitez/sysroot-arm-cortexa8-linux-gnueabi/usr/include"LDFLAGS =" - L/opt/OSELAS.Toolchain-2011.11.3/arm-cortexa8-linux-gnueabi/gcc-4.6.2-glibc-2.14.1 -binutils-2.21.1a-kernel-2.6.39-sanitez/sysroot-arm-cortexa8-linux-gnueabi/usr/lib"./ configure -prefix =/opt/valgrid -host = arm-cortexa8-linux-gnueabi - target = arm-none-linux-gnueabi -build = x86_64-ubuntu-linux
这个配置的输出是:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-cortexa8-linux-gnueabi-strip... arm-cortexa8-linux-gnueabi-strip
checking for a …Run Code Online (Sandbox Code Playgroud) 我们有一个嵌入式主板,其中以太网设备直接连接到交换机,两者之间没有phy.为了使事情变得更复杂,以太网设备的mdio总线连接到交换机的mdio进行控制.
我已设法使用固定的mdio/phy驱动程序启用以太网,并通过将交换机的默认配置与固定的phy匹配来工作.
我现在如何连接到mdio总线以更改开关设置?由于以太网设备附加的phy由固定的phy填充,我现在如何将真正的mdio总线连接到系统,以便我可以对其进行配置.似乎没有直接用户空间接口到mdio总线.我是否创建了一个假的以太网设备,其唯一目的是访问mdio总线或者以某种方式将它连接到以太网设备,然后将连接两个mdio总线?
PS:看起来物理mdio总线驱动程序找到了开关,但我该如何与它交谈?
linux ethernet linux-device-driver linux-kernel embedded-linux
像U-Boot这样没有实现Open Firmware API的Bootloader,应该将平面设备树的二进制形式传递给内核 - LinuxFDTBlob
为什么DTS文件也存在于内核中?这不是多余的吗?
例如,U-boot源代码包含以下文件:
arch/arm/dts/tegra124-jetson-tk1.dts
此文件也可以在Linux源代码下找到:
arch/arm/boot/dts/tegra124-jetson-tk1.dts
虽然内核版本是U-boot版本的4倍,但我想知道这种冗余背后的原因.我相信维护人员和开发人员都很难维护和使用它们
在基于Yocto的Embedded Linux发行版中,我真的很感兴趣,可以在执行映像构建配方之前,从将要构建并安装到映像文件的每个相关层中查找软件包/配方/内核模块的完整列表:
bitbake my-image-minimal
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?在这方面的任何指导是值得赞赏的。
提前致谢。
embedded-linux ×10
linux ×4
arm ×3
linux-kernel ×3
u-boot ×2
valgrind ×2
beagleboard ×1
bitbake ×1
c ×1
c++ ×1
cortex-a8 ×1
device-tree ×1
embedded ×1
epoll ×1
ethernet ×1
filesystems ×1
g++ ×1
linker ×1
locking ×1
memory ×1
yocto ×1