标签: embedded-linux

U-boot可以在单核上运行吗?

我正在开发基于 TI Jacinto6(ARM CortexA15) 的主板。我正在了解U-boot源代码。根据 start.S 文件,执行以下汇编指令以禁用 L1 I/D 缓存和 TLB。该说明来自 start.s( http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/start.S;h=fedd7c8f7e00d0427405173849e6c0743d6b886f;hb =524123a70761110c5cf3ccc5f52f6d4da071b959

 mov     r0, #0                  @ set up for MCR
 mcr     p15, 0, r0, c8, c7, 0   @ invalidate TLBs
 mcr     p15, 0, r0, c7, c5, 0   @ invalidate icache
 mcr     p15, 0, r0, c7, c5, 6   @ invalidate BP array
 mcr     p15, 0, r0, c7, c10, 4  @ DSB
 mcr     p15, 0, r0, c7, c5, 4   @ ISB
Run Code Online (Sandbox Code Playgroud)

根据 ARM 文档,CortexA15 有 4 个内核。上面的代码将禁用它正在运行的核心上的缓存和TLB,那么其他核心的缓存和TLB呢?U-boot 源代码只能在一个内核上运行吗?如果是这样那么其他核心将如何被禁用?

arm smp embedded-linux u-boot

3
推荐指数
1
解决办法
4559
查看次数

如何仅使用串行控制台将二进制闪存文件发送到嵌入式系统?

我有一个使用 ramdisk 启动的嵌入式 Linux 系统,因此它运行时没有可用的持久存储(它有闪存来存储内核和 ramdisk)。

唯一的连接是 RS-232 串行登录控制台。所以我受到其内置 busybox 提供的功能的限制。我想检索 ramdisk,修改它,然后重写 ramdisk。内核没有内置 Flash 文件系统支持。ramdisk 分区大小约为 10 MB。当用户目录下的所有文件都被删除后,可用的ramdisk大小约为14 MBytes。

命令 dd 可用,因此我可以将 ramdisk 分区复制到 ramdisk,并可以从 ramdisk 文件写入闪存。flashcp 也可用。

所以我现在的问题是如何通过RS-232串行控制台接收和发送二进制文件?

我研究了以下内容,但没有一个对我有用:

主要是因为 x/y/zmodem 在 busybox 中不可用。

任何想法?谢谢!

根据要求,这是我应该首先包含的内容。

可用的 u-boot 命令:

U-Boot >?
?       - alias for 'help'
askenv  - get environment variables from stdin
base    - print or set address offset
bdinfo  - print Board Info structure
boot …
Run Code Online (Sandbox Code Playgroud)

binary console serial-port file-transfer embedded-linux

3
推荐指数
1
解决办法
9133
查看次数

多个 UART 上的 Linux 控制台输出

我的嵌入式板有 2 个 UART。我想在两个 UART 上都有控制台输出。

kernel/Documentation/console/console.txt中提到:

您只能为每种设备类型(串行、视频)定义一个控制台。

这是否意味着我只能使用一个 UART 作为控制台?或者,是否可以将控制台输出重定向到这两个 UART?

linux linux-kernel embedded-linux

3
推荐指数
1
解决办法
4075
查看次数

发行版特征、机器特征和图像特征之间有什么区别?他们之间有什么依赖关系?

我正在使用 Yocto 项目为我的主板构建自定义发行版。我只是想问你,发行版特征机器特征图像特征有什么区别?

embedded-linux yocto

3
推荐指数
1
解决办法
3747
查看次数

Linuxarm64如何在AArch32和AArch64之间切换

Linux支持运行32位应用程序,只要

  1. 内核启用CONFIG_COMPAT
  2. 硬件支持AArch32

我假设32位应用程序必须在arm AArch32执行状态下运行,并且如果环境有32位应用程序和64位应用程序。

32位应用程序进程->arm状态为AArch32

64位应用进程和内核->arm状态是AArch64

这是对的吗?

如果是这样,
Linux 如何处理 AArch32 和 AArch64 切换?
内核是否知道正在运行的进程是32位还是64位?

linux arm linux-kernel embedded-linux

3
推荐指数
1
解决办法
3379
查看次数

libgpiod API 使用(Linux 共享库)

有人对 libgpiod API 有经验吗?我已经在我的linux平台上安装了它,但无法调用它的库函数。

我安装的是:

git clone git://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git
cd libgpiod
./autogen.sh
make
make install
Run Code Online (Sandbox Code Playgroud)

之后,我在/usr/local/lib/中看到libgpiod.so库,在/usr/local/include/中看到gpiod.h(出于良好的考虑,我也运行了)。但是,当我尝试编译以下内容时:ldconfig

测试.c

#include <gpiod.h>

struct gpio_chip *chip;    

int main(void)
{
    chip = gpio_chip_open("/dev/gpiochip4");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:undefined reference to 'gpiod_chip_open'

谁能帮我看看我哪里出了问题?

提前谢谢了!

c api embedded-linux dynamic-library gpio

3
推荐指数
1
解决办法
8778
查看次数

如何交叉编译Python?

我有一个采用 Cortex A9 ARMv7 架构的 SoC。我需要能够在带有此 SoC 的板上运行 python 脚本。所以我需要针对这个平台交叉编译Python。

SoC具有ARMv7架构,因此我安装了arm-linux-gnueabihf在VirtualBox中运行的Ubuntu 20.04的交叉编译器。

我正在遵循这个指示:

  1. 首先,我下载了Python 2.7.1源代码并将其解压到/home/user/python/Python-2.7.1目录中。

  2. 然后我按照说明下载了补丁。

  3. 然后我应用了补丁:

    patch -p1 < python-2.7.1-cross-compile.patch
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后我为host编译了一些工具:

    ./configure
    make python Parser/pgen
    mv python hostpython
    mv Parser/pgen Parser/hostpgen
    make distclean
    
    Run Code Online (Sandbox Code Playgroud)
  5. 然后我配置了 Python 进行交叉编译:

    readonly CROSS_COMPILER=arm-linux-gnueabihf
    
    CC=${CROSS_COMPILER}-gcc \
    CXX=${CROSS_COMPILER}-g++ \
    AR=${CROSS_COMPILER}-ar \
    RANLIB=${CROSS_COMPILER}-ranlib \
    ./configure \
    --host=${CROSS_COMPILER} \
    --target=${CROSS_COMPILER} \
    --prefix=/python
    
    Run Code Online (Sandbox Code Playgroud)
  6. 然后我最后交叉编译它:

    make \
    HOSTPYTHON=./hostpython \
    HOSTPGEN=./Parser/hostpgen \
    BLDSHARED="${CROSS_COMPILER}-gcc -shared" \
    CROSS_COMPILE=${CROSS_COMPILER}- \
    CROSS_COMPILE_TARGET=yes
    
    Run Code Online (Sandbox Code Playgroud)

    但最终我得到了IndentationError

    /usr/lib/gcc-cross/arm-linux-gnueabihf/9/../../../../arm-linux-gnueabihf/bin/ld: …
    Run Code Online (Sandbox Code Playgroud)

python linux cross-compiling embedded-linux python-2.7

3
推荐指数
1
解决办法
2万
查看次数

面试题-如何连续读取缓冲区而不丢失数据

我是一名嵌入式工程师,经验不多。我在接受采访时被问到了一个问题,我想这并不新鲜,并且已经有了答案:

您有一个不断接收来自外部世界的输入的外设,该外设有一个缓冲区。输入的速率时不时地发生变化。外设需要读取输入缓冲区并对其进行处理。它检查输入消息并查看其是否与配置的过滤器匹配。如果匹配则转发,否则丢弃。

问题如下:

  1. 你如何处理这个问题?
  2. 如果缓冲区满了怎么办?您的缓冲区大小有限?外设仅具有一定的处理缓冲消息的速度。
  3. 如何使缓冲区适应不同的输入速度?

感谢你的帮助。谢谢。

c can-bus spi i2c embedded-linux

3
推荐指数
1
解决办法
378
查看次数

如何在ARM上设置Linux内核命令行?

我的理解是,对于 ARM,内核启动命令行一般有以下三个来源:

  1. 那些在内核配置中作为 CONFIG_CMDLINE 给出的
  2. 由引导加载程序传递的那些(通常是 ARM 处理器上的 U-Boot)
  3. 那些包含在设备树中的 selected/bootargs 下使用哪一个取决于内核配置参数。我的问题是如何使用内核配置在这些选项之间进行选择?

一个可以附加到另一个,即我们可以使用 CONFIG_CMDLINE 传递一些参数,然后在设备树中附加硬件特定参数吗?

我首先尝试组合 1、2 和 3,但这无法编译:

/dts-v1/; 
#include "imx6q.dtsi"
#include "imx6q-h.dtsi"
#include "imx6q-m.dtsi"
/ {
    model = "A M";
    compatible = "a,imx6q-hydra13", "a,imx6q-mercury",
                    "a,imx6q-hydra", "fsl,imx6q";
};

&ssd_touch {
    status = "okay";
};

ERROR AT THIS LINE: chosen {  
        bootargs = "console=ttymxc1,115200";
};
Run Code Online (Sandbox Code Playgroud)

command-line arm linux-kernel embedded-linux device-tree

3
推荐指数
1
解决办法
4727
查看次数

是否可以在 yocto 开发的 Linux 映像中设置静态 IP 地址?

我正在使用 yocto 开发自定义 Linux 映像,我想为所有映像设置一个 IP 地址。有可能的?我怎样才能做到这一点?

提前致谢。

linux ip static-ip-address embedded-linux yocto

3
推荐指数
1
解决办法
2939
查看次数