标签: embedded-linux

从用户空间获取U-boot的版本

有谁知道从用户空间安装U-boot版本的方法?有fw_printenv命令可以访问U-boot的环境变量,但不能访问版本.

embedded-linux u-boot

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

嵌入式Linux - 引导阶段

我想系统化我的U-Boot/linux知识.在每个嵌入式平台中是否需要至少2个引导加载程序阶段?或者后续流程可以变化吗?

  1. 第一阶段引导加载程序(可以是U-Boot)存储在处理器的ROM内部,无法更新.它将从内部缓存内存运行.此U-Boot需要(至少):初始化RAM,初始化外部闪存,初始化串行控制台,读取和运行第二阶段引导加载程序.

  2. 第二阶段引导加载程序(可以是U-Boot)存储在RW闪存中.它将处理以太网,闪存RW功能等.可以自定义和覆盖此U-Boot.主要任务是将Linux内核加载到RAM中并运行它.

  3. linux内核启动.

第一阶段引导加载程序是否始终为只读?

linux embedded embedded-linux u-boot

11
推荐指数
2
解决办法
5934
查看次数

Poulsbo系统控制器中枢(US15W)中LPC总线的配置寄存器

我们有一个基于Atom Z510/Intel SCH US15W Q7卡(运行Debian Linux)的系统.我们需要从低引脚数总线上的设备传输数据块.据我所知,这个芯片组不提供DMA设备,这意味着处理器必须在软件循环中一次读取一个字节的数据.(设备驱动程序实际上是使用"rep insb"x86指令实现的,所以如果我理解正确的话,循环实际上是由CPU实现的.)

这远非最佳,但应该可以达到14Mb/s的传输速率.相反,我们几乎无法管理4Mb/s,总线上的事务间隔不超过2us,即使每次对从设备的读取都是在560ns内完成.我不相信公共汽车上的其他交通是罪魁祸首,但我仍在调查.

我的问题是:

有没有人知道SCH上是否有可能影响LPC总线时序的配置寄存器?

我在英特尔网站上的设备上找不到任何有用的信息,也没有在Linux内核代码中发现任何看起来像是在摆弄任何这样的寄存器的东西(但是当涉及到Linux内核的东西时我就是一个菜鸟.)

我不是x86专家,因此任何可能发挥作用的其他因素或任何其他与此设备相关的"战争故事"都会很好地了解.

编辑:我找到了数据表.我没有看到解释这种行为的任何内容,但我正在研究将我们的设备映射为固件设备的可能性,因为固件总线周期似乎没有遭受相同的延迟.

hardware embedded bus linux-device-driver embedded-linux

11
推荐指数
1
解决办法
883
查看次数

Linux计时器有时挂起并停在1ns

我有一个嵌入式主板,PowerPC 5200运行的是Realtime Linux版本2.6.33.

我的应用程序在Linux中使用一个高分辨率计时器来报警.此计时器有时不会过期.问题很少发生,每次在系统上发生之间可能会持续很多个月.

定时器由timer_settime具有绝对时间的功能设置.当计时器没有过期时,我做了一些有趣的观察:

  • 函数timer_gettime返回剩余时间1ns.
  • 通过显示文件来检查活动计时器,/proc/timer_list并且timer_list未在活动计时器列表中显示此计时器.

我查看了Linux源代码,发现了一个可能的场景:

该函数timer_gettime以函数common_timer_get(posix-timers.c)结束.函数common_timer_get返回it_value.tv_nsec = 1如果计时器是活动的剩余时间<= 0.这意味着计时器已经倒计时并且计时器状态必须是'入队'或'回调'.

我认为它处于状态'回调',这意味着它在function __run_hrtimer(hrtimer.c)中运行.函数__run_hrtimer是调用函数__remove_hrtimer,它在将计时器状态从"排队"更改为"回调"之前从计时器活动列表中删除计时器.

__run_hrtimer在将定时器状态更改为"回调"和清除状态"回调"的函数结束之间,函数会调用多个函数.如果挂在这里,timer_gettime当定时器不在活动列表中时,该功能可能返回1ns.这里它调用Linux内核中的几个函数和应用程序中的回调函数.

我已经检查了我的应用程序中的回调函数.它发信号通知信号量并在同一线程上再次设置定时器.我不明白为什么那不起作用.

是否有人见过类似案件?

是否有人知道这里出了什么问题?

linux linux-kernel embedded-linux

11
推荐指数
0
解决办法
427
查看次数

嵌入式系统上的Docker,为什么不呢?

最近有一个项目引发了我的方式,包括编写几个(支持Linux的)嵌入式设备,为它们部署软件,以及允许在git repo中更新代码库时更新应用程序.

最初的想法是为每个设备制作一个标准图像,然后我开始尝试在UDOO Quad和Intel Edison上安装docker,但是到目前为止还没有任何成功.

我的想法是,在嵌入式设备上安装Docker似乎是一个好主意 - 但如果是这样的话,那么它肯定会被移植到现在.Resin.io是唯一一个似乎在做这些努力的团体.

有没有我缺少的东西,或者有没有明确的理由说明Docker在嵌入式设备上没有意义?如果没有理由,并且在嵌入式系统上运行Docker 确实有意义,那么我是否忽略了一些问题:是否有任何关于移植的讨论来源,或者如何解决这个问题?

containers embedded-linux docker intel-edison

11
推荐指数
2
解决办法
8858
查看次数

写入文件而不填写Linux

假设我们的目的是在运行Linux的嵌入式设备上创建一个带有大洞的文件,我们将在稍后编写.我们打开文件,获取文件描述符并调用lseek它来寻找某个已知位置.之后,当我们想要在搜索到的位置写入该文件时,我们会调用write它.

但是,在第一次写入时,通过搜索创建的孔变为零填充,如果孔足够大,则此操作可能需要一些时间.在我的应用程序中,不需要这个零初始化,因为这个孔的长度非常精确,我稍后会用我的数据填充它.

有没有办法避免在填零write后进行第一次调用seek(即使它涉及修改文件系统驱动程序)?或者,有没有办法在文件开头之前写入文件(附加到文件的前面)?

linux file embedded-linux lseek

11
推荐指数
1
解决办法
955
查看次数

在同一个线程中多次锁定互斥锁

我正在开发嵌入式Linux操作系统(uClinux)上的应用程序,我需要能够多次锁定互斥锁(通过相同的线程).

我有一个mutex和一个mutexattr定义和初始化如下:

pthread_mutexattr_t waiting_barcode_mutexattr;
pthread_mutex_t waiting_barcode_mutex;

pthread_mutexattr_init(&waiting_barcode_mutexattr);
pthread_mutexattr_settype(&waiting_barcode_mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&waiting_barcode_mutex, &waiting_barcode_mutexattr);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试获取锁定两次时它会阻塞第二个锁:

pthread_mutex_lock(&waiting_barcode_mutex);
pthread_mutex_lock(&waiting_barcode_mutex);
Run Code Online (Sandbox Code Playgroud)

我错误地初始化它还是有更好的方法来实现它?

提前致谢.

结论:

  • 显然PTHREAD_MUTEX_RECURSIVE或PTHREAD_MUTEX_RECURSIVE_NP不起作用,因此我无法创建可重入的互斥锁.
  • try_lock也不好.如果可以,它获取锁定,如果无法获取锁定则返回错误.不幸的是,错误只是告诉我互斥锁已经在使用中,我不知道当前线程是否已经拥有锁.
  • 如果当前线程有锁,pthread_mutex_lock可以返回错误,但为此我需要创建一个PTHREAD_MUTEX_ERRORCHECK类型的互斥锁,我也不能创建一个.

c linux posix uclinux embedded-linux

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

我需要实现一种方法来睡眠这个线程,直到它有工作要做

好吧,所以这个问题并不完全是关于线程管理......好吧,等等.我正在寻找这种配置的不同解决方案.我有一些想法,但我正在寻找可以解决问题的任何解决方案.并将权衡利弊,以实现最好的一个.

情况就是这样.

我有一个将生成线程的管理器应用程序.该线程将持续运行并处理通过USB连接到系统的板的串行通信.管理器应用程序促进系统上运行的其他应用程序与此线程之间的通信.线程需要真正执行两件事:

  1. 在可变定时器上通过串行轮询电路板获取样品数据..通常大约每分钟一次(串行总线相当慢,波特率为4800.我无法控制这个)
  2. 促进与经理应用程序的通信.(即其他应用程序将请求样本数据,管理器将请求转发给线程.线程执行操作并返回数据)

我最初的设计很简单,很有效.我使用队列和互斥体来管理经线.所以线程的逻辑如下:

  1. 初始化
  2. 虽然我们没有收到经理的关机命令
  3. 如果我们的计时器已启动,请在电路板上查询数据
  4. 否则,请检查管理器是否有消息发送到队列.如果是这样,请处理它

问题是我没有考虑CPU利用率.99.9%的时间我的线程没有处理任何东西而只是吮吸电源.我需要实现一种方法来睡眠这个线程,直到它有工作要做.所以有几个想法:

使用select()来阻止.这可以基于我需要使用的计时器来阻止,我可以将队列消息传递实现更改为套接字消息传递.相反,线程会打开一个客户端套接字到管理器,管理器会通过套接字将消息传递给线程.然后select()会睡觉,直到fd上有活动或我的计时器启动.

亲:正是我需要的功能.

Con:对于与你共享内存的线程进行通信,套接字是不是有点繁重?

使用信号系统.(在Linux上知识渊博的人可以通过一个实现示例在这里进行管道......我不确定该怎么做.)但是线程可以在计时器的持续时间内休眠,并且如果信号是,则唤醒进行处理收到经理.

Pro:使用共享内存维护当前实现

Con:不确定如何实施.是否有像select()这样的函数可以使用信号而不是fds?

可能是互斥量.我可以阻止,直到经理发布了一个互斥锁.

专业:仍然共享内存

Con:可能需要将计时器处理移动到管理器,这实际上不是一个选项,因为它有其他计时器和关键工作要执行.

请推荐并随意批评.我愿意接受任何有效的选择.请注意,虽然这是在嵌入式系统上运行,但资源使用至关重要.

c linux multithreading pthreads embedded-linux

10
推荐指数
2
解决办法
6345
查看次数

Rasberry Pi HDMI输入和HDMI输出,用于图像处理

我的目标是将HDMI输入视频发送到Rasberry Pi,然后改变输入HDMI(通过C/C++或Java进行图像处理)并将其发送回HDMI输出端口.

问题是Rasberry Pi只有HDMI输出端口,因此没有使用扩展板就无法发送HDMI.

1)我找到了一个试图提供扩展板的启动项目,但是这还没有资金

(https://www.kickstarter.com/projects/1419380698/connect-your-hd-camcorder-to-your-raspberry-pi?ref=discovery).

2)我遇到了这款带有HDMI输入的Rasberry Pi x100扩展板

(http://www.cnx-software.com/2013/12/21/x100-raspberry-pi-expansion-board-adds-vga-output-rtc-and-more/)

问题是,我可以以编程方式检测和拦截x100上的HDMI输入端口,而不是将更改的数据发送到实际PI上的常规HDMI输出吗?

请善意提供详细的方法.

谢谢

image-processing embedded-linux hdmi raspberry-pi

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

copy_to_user在linux内核版本4.12.8中未定义

在我的项目中,我使用char驱动程序在用户空间和内核空间之间进行通信.我使用该函数copy_to_user(void user *to, const void *from, unsigned long n)将数据从内核空间复制到用户空间缓冲区.我们可以在#include < asm/uaccess.h >头文件下找到这个函数.我使用Linux内核版本4.4.0-59-generic,Ubuntu OS版本16.04 LTS编译了该项目,并且其工作正常,没有任何错误和警告.我得到了所需的输出.

我使用Linux内核版本4.12.8,Ubuntu OS版本16.04.2 LTS编译了同一个项目,它在编译期间向我发出警告WARNING: "copy_to_user" [/home/ldrv1/Desktop/Vijay/code/build/uts.ko] undefined!.当我对我的模块进行insmod时,我得到如下错误insmod: ERROR: could not insert module uts.ko: Unknown symbol in module.我认为#include <asm/uaccess.h>4.12.8内核版本仍然支持头文件,否则我会遇到致命错误:编译时没有这样的文件或目录错误.我尝试使用apt-get install linux-headers-$(uname -r)命令更新linux内核头文件 ,我得到以下响应:

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.12.8
E: Couldn't find any package by glob 'linux-headers-4.12.8'
E: Couldn't find any package by regex 'linux-headers-4.12.8' …
Run Code Online (Sandbox Code Playgroud)

linux linux-device-driver linux-kernel embedded-linux ubuntu-16.04

10
推荐指数
1
解决办法
8208
查看次数