最近,我们的客户遇到了一个相当不愉快的情况 - 用于显示遥感数据的基于 Raspberry Pi 的“信息亭”(没有什么比显示来自数据收集服务器的自更新网页的信息亭模式浏览器更花哨的了)由于以下原因无法启动文件系统损坏。Ext4,需要手动fsck,系统将成为明天重要演示的一部分,立即需要服务。当然,我们不能要求客户在晚上关闭系统时很好地关闭系统;该系统必须简单地承受这种虐待。
我想在未来避免这种情况,并且我想将操作系统移动到一个可以防止这种情况的文件系统。有很多用于 MTD 设备的文件系统,让它们在 SD 卡(标准块设备)上运行需要一些严重的跳跃。还有一些其他文件系统(日志等)具有良好的抗腐败能力。我仍然需要看到他们的优缺点的一些合理比较。
Linux 中可用的哪个文件系统将在意外电源故障时提供最佳的抗破坏性,并且不需要跳过像yaffs2这样不可能的箍来安装到 SD。
磨损平衡是一个优点,但不是必需的——SD 卡通常有自己的机制,如果不够完美,尽管系统应该是“对闪存温和的”(像 NTFS 这样的系统可以在一个月内杀死 SD 卡)。
我最怀念嵌入式 Linux 中“小型嵌入式”的功能之一是中断。特定引脚上出现信号,或触发其他中断源,CPU 内部所做的任何事情都会被中断,然后启动我的中断处理程序功能。在 Linux 中,一切都被缓冲,如果发生某些事情,系统只会按照自己的方式进行,当(最后)给定线程被带到前台时,其等待外部源的等待状态结束,其处理程序开始。
我所知道的最接近的是信号,它可以触发中断线程正常流程的处理程序,但是,在内核将线程置于前台之前,处理程序不会接收信号,这可能是信号发生后的许多毫秒- 触发信号也不那么可靠;我需要一个应用程序或内核模块来发送信号,我不能简单地将它连接到 GPIO 引脚。
我如何才能在 Linux 用户空间软件中实现类似于硬件中断的功能——在触发外部源条件后立即启动特定功能或将特定线程置于前台,而无需等待进程队列将我的线程置于前台?
如果你觉得这个问题太宽泛,让我们把它缩小到一个具体的例子:Raspberry Pi 板在它的一个 GPIO 引脚上接收一个信号(不一定是任意的;如果只有一些引脚可以做到这一点,那没关系。)我想要我的用户空间应用程序在尽可能短的时间内对此事件做出反应,无论是使其退出等待状态,启动处理程序函数或任何等效机制,但最重要的是在处理程序被引入之前不等待任务队列循环通过所有挂起的进程到前台,但尽快触发它。(特别是,当没有信号时,不会让系统永远锁定,处理程序进程占用 100% CPU 时间轮询输入并且永远不会屈服于操作系统。)有这样的机制吗?
我正在使用 TS-4900,这是一个插入基板的嵌入式“计算机模块”,运行 Yocto Linux。它使用 U-Boot 启动,据说它会根据底板的型号选择正确的 dtb 文件来启动,如果它无法找到正确的文件,它可能会回退到我的模块的“通用”文件。
但是它如何/在哪里确定正确的?我如何知道使用了哪个 .dtb,或者设置应该使用哪个?
下面是 U-Boot 的启动信息。
U-Boot 2014.10-g3ac6ec3 (Jan 29 2015 - 17:20:15)
CPU: Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
Board: TS-4900
Revision: C
Watchdog enabled
I2C: ready
DRAM: 1 GiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
SF: Detected N25Q64 with page size 256 Bytes, erase size 4 KiB, total 8 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: using phy at 7 …
Run Code Online (Sandbox Code Playgroud) 我正在使用嵌入式平台,需要/dev/fb0
清除供我自己使用(可通过串行控制台访问的设备,而屏幕用于显示信息,没有 X。)。
我已经default.target
从图形用户更改为多用户,但现在它在帧缓冲设备上打开 getty 并显示登录提示,但我无法找到那是哪个服务。我不想偶然禁用串行控制台登录,并且lsof
在/dev/fb0
打开时不显示任何内容。
如果有帮助的话,发行版是 Yocto Linux。
我意识到sched_rt_period_us
并且sched_rt_runtime_us
旨在防止在 RT 任务失控的情况下冻结系统。我想知道,是否可以使用较小的值sched_rt_period_us
来确保任务顺利运行。
我有一个简单的工作,每次调用所需的 CPU 时间不超过一毫秒左右 - 例如,通过 GPIO 引脚驱动步进电机。不过,我希望达到每秒不少于 100 个周期,持续。这不超过 CPU 时间的 10% - 扣除抢占和调度程序开销。
我读过“sched_rt_period_us 中的非常小的值会导致系统不稳定” 1,但没有说明“非常小的值”在哪个数量级上很重要。如果我设置sched_rt_period_us
为 10000 并sched_yield()
及时返回控制权 ( ),我能否可靠地指望调用我的程序之间的延迟不超过 0.01 秒?
底层 CPU 可能是 850MHz ARM,具有除上述控制之外的许多其他任务,但它们都不是实时的,甚至不需要“感觉响应”,但与默认值sched_rt_period_us
和sched_rt_runtime_us
(1 秒中的 95%)不同,我不能允许 RT 任务一次休眠整整 0.05 秒。
...或者,当我在 USB 系绳模式下将手机用作 GSM 调制解调器时,如何不给手机充电?
我可以将它用作 WiFi 系绳调制解调器,但它会浪费它提供连接的上网本和手机端的电池。在 USB 系绳模式下,我会避免使用耗电的 WiFi 连接,但手机充电会损坏上网本电池。我希望能够在禁用或限制通过电源线馈送的电流的同时保持数据连接;让手机和上网本使用各自的电池而不会相互耗尽。
我使用的是 Kubuntu 14.10,但任何系统解决方案都可以,我相信我能够适应它。即使是硬件解决方案也可以 - 切断 USB 电缆中的电源线或焊接一个大电阻?那行得通吗?
目前我的启动字符串(用 显示env print
)是:
如果我想在 u-boot 中将变量设置为字符串,我会这样做
env set variable 'my string'
Run Code Online (Sandbox Code Playgroud)
但是如果字符串包含引号字符怎么办?我想将以下内容放入bootcmd
:
if test ${jpsdboot} = 'on' ; then run sdboot; else run emmcboot; fi;
Run Code Online (Sandbox Code Playgroud)
如果我将整个字符串放在引号中('
或"
),它可以工作,但周围的引号'on'
丢失了。
如果我把它放在一起\'on\'
会产生语法错误。
如果我不加引号,它会;
立即执行该部分。
如何将引号放入变量值中?
附加信息:
env print
在“原始”板上返回什么:
bootcmd=run usbprod; if test ${jpsdboot} = 'on' ; then run sdboot; else run emmcboot; fi;
Run Code Online (Sandbox Code Playgroud)
我的各种尝试产生了什么:
U-Boot > env set bootcmd 'run usbprod; if test ${jpsdboot} = 'on' ; then run sdboot; else …
Run Code Online (Sandbox Code Playgroud) 在编写一个简单的 shell 工具时,我发现了一个我不知道如何让它工作的部分。
[ "$#" -ne 3 ] || echo "wrong number of arguments" && exit
Run Code Online (Sandbox Code Playgroud)
上述工作按预期工作,因为很难想象回声可能失败的情况。但是如果我用一个可能失败的命令替换 echo 并且仍然执行exit
呢?
这是行不通的,因为exit
退出了产生的外壳( )
而不是主要的外壳:
[ "$#" -ne 3 ] && ( command ; exit )
Run Code Online (Sandbox Code Playgroud)
这将始终退出:
[ "$#" -ne 3 ] && command ; exit
Run Code Online (Sandbox Code Playgroud)
我可以使用冗长的语法:
if [ "$#" -ne 3 ] ; then
command
exit
fi
Run Code Online (Sandbox Code Playgroud)
但是如果我不想参与if
并保持语法简洁 - 我如何将命令的条件执行串起来,包括exit
这样的?
我已经使用 Raspberry Pi 制作了一个可编程电源开关(尽管这个问题不是特定于 RPi 的 - 它更像是“通用 Linux”,其问题是由硬件缺陷引起的。)Raspberry 没有电池供电的 RTC;它旨在通过网络启动后立即联网工作并同步其时钟。
我的问题是,当我通过网络对所述开关进行编程时,我可以在给定的时间以这种方式打开/关闭给定的插座,但设备本身将用于不同的位置,包括非联网的位置。当我将它从我对其进行编程的位置带到要插入的位置时,它会断电并且时钟会丢失状态。在我重新打开电源后,它无法连接来恢复日期。
断电的几分钟对我来说不是问题 - 我不介意时钟差一两分钟。我介意它是否在 43 年之前关闭,就像我打开非联网后的情况一样。
是否有一些巧妙的方法可以将启动时的时钟恢复到系统因断电而停机之前的状态?(每秒将其写入作为 RPi 的存储介质的 SD 卡会非常快地杀死该卡,因此这不是一个选择。)
embedded ×2
linux ×2
u-boot ×2
bash ×1
clock ×1
console ×1
device-tree ×1
filesystems ×1
framebuffer ×1
real-time ×1
scheduling ×1
shell-script ×1
systemd ×1
usb ×1
yocto ×1