嵌入式linux下如何尽快播放开机音乐
今天在考虑如何尽快启动一个应用程序,播个开机音乐什么的。
最开始的启动流程是这样的,bootloader 启动kernel,kernel跑完挂载文件系统,
然后会执行/init,而这个init 是指向busybox的一个软链接,
busybox做一些事情后,会解析/etc/inittab , 其中调用/etc/init.d/rcS 脚本,
rcS脚本里面再调用其他脚本,做一些开网络之类的功能,全部做完大概五秒多,打印出了“/ #”
此处简化下,暂且认为rcS脚本是这样的吧
#!/bin/sh /etc/init.d/zqbNetwork start
这个应用程序呢,暂且叫做 zqbMusic 吧,是用来放音乐的,此处想放点开机提示音,所以我们有个音乐文件,叫kaiji.wav
调用一下 ./zqbMusic kaiji.wav 就播放了。大概一秒的音乐。
那么问题就是,如何尽快播放这个开机提示音乐。
先来个简单粗暴,直接加到rcS脚本后面,
#!/bin/sh /etc/init.d/zqbNetwork start ./zqbMusic kaiji.wav
那么就在五秒多的时候,开始播放,播放完毕六秒多,打印出了"/ #",这样就比较不好了,我“/ #”之后还要启动其他应用程序呢,放音乐直接延迟了其他事情一秒多。
那么,是不是可以并行呢,考虑了一下,开网络是要时间的,放音乐也要时间,那把一个放到后台去,不要等,应该快些吧。于是改成
#!/bin/sh ./zqbMusic kaiji.wav & /etc/init.d/zqbNetwork start
后面加上 & ,就是后台执行了,也就是另一个进程了。恩,今天想到并行,搜了一下才发现这么简单,加个 & 就可以了,好东西。
这么做了之后,好一些了,五秒多就可以听到声音了,打印“/ #”的时间也在五秒多(比原来慢一些,毕竟多跑了个线程抢资源)
这个时候,忍不住就要想,能不能再往前提,我干脆提到跟init并行,不改文件系统的话,这就是用户空间的极限了吧,一进来就开始播音乐
于是修改掉kernel的CMDLINE,把里面的init=/init 改成 init=/zqbinit,重新编译内核
然后就写个zqbinit.sh,大概是这样
#!/bin/sh ./zqbMusic kaiji.wav & exec init
搞定,丢到文件系统,烧到板子启动,结果报错了,是一个什么permission denied,具体当时没存下来,大概就是说我没有权限执行 init(实际上是busybox)
尝试了chmod 各种加权限,还是报错,暂时不知道为什么,算了干脆用C试试
于是用C写个很简单的程序,fork一个子进程,子进程去execlp调用zqbMusic,父进程则execlp 调用原本的init
大概是这样
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char **argv)
{
pid_t pid;
if(pid = fork())
{
execlp("./init", "init", NULL);
exit();
}
execlp("./zqbMusic", "zqbMusic", "./kaiji.wav",NULL);
return ;
}
搞好Makefile,编译出zqbinit,放进去,这回可以用了
结果是,音乐在四秒多就开始播了,原本的init也能正常执行下去最终到达控制台,打印出“/ #”。
不过播放音乐这个进程,抢资源还是比较多,打印“/ #”的时间比没播音乐的情况,延迟了七八百毫秒。但总比串行执行,延迟一秒多,要好些。
而且这么看来,其他应用程序,也不是非得等到“/ #”之后调用,跟这个音乐一起并行嘛,再开个进程,也是个方法。至于到底要不要这么做,那就是另说了,毕竟进程多了切来切去也挺耗资源的。
那能不能再提前?想了下,如果在刚刚那个调用init 的父进程中,来个sleep之类的,主动让资源给zqbMusic,或者有什么小动作提一下优先级,那就是当之无愧的用户空间第一快了。
再提前?再提前就要到内核里面去了,唔,在驱动初始化完毕之后,补一个initcall,就用来放音乐,理论上似乎也是可以的,就是有点别扭。
再提前?把驱动移植到uboot中,没进内核就可以先放开机音乐了,也是一个办法。
再提前,那就太难度了,不如不要放音乐了,弄个蜂鸣器,开机滴一下(突然有种电磁炉即视感……),这个电路应该就能解决吧,绝对快。
本文链接:http://www.cnblogs.com/zqb-all/p/6012087.html
嵌入式linux下如何尽快播放开机音乐的更多相关文章
- Linux下的在线播放神器
Linux下的在线播放神器:一个是Amarok缺点是,每个音乐源都要更新后才能播放. 在一个就是中国造的:linux deepin下的深度音乐,缺点就是连不上.反正我是连不上
- mplayer - Linux下的电影播放器
概要 mplayer [选项] [ 文件 | URL | 播放列表 | - ] mplayer [全局选项] 文件1 [特定选项] [文件2] [特定选项] mplayer [全局选项] {一组文件和 ...
- 嵌入式 Linux下永久生效环境变量bashrc
嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报 分类: 嵌入式(928) 一般察看函数运行时堆栈的 ...
- 【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计
这个教程描述了在嵌入式linux下使用Qt如何设置一个支持多点触摸和单点触摸的输入系统.这里假定你已经有了对应的驱动程序,驱动可以从触摸屏的厂商那里获得或者使用一个linux 内核源码中已经存在的驱动 ...
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- Linux下的应用程序开机自启动
Linux下的应用程序开机自启动,目前我知道的有2种: 1.将启动语句写到/etc/rc.local 2.在init.d放置启动脚本 第一种,很简单,直接写进去就行,比如说: /db/mongodb/ ...
- 嵌入式Linux下BOA网页server的移植
**************************************************************************************************** ...
- linux下Oracle数据库实例开机自启动设置
linux下数据库实例开机自启动设置 1.改动/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,例如以下提示 # This file is used ...
随机推荐
- Java学习笔记__异常机制_try_catch_finally_return执行顺序
package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- (转)java redis使用之利用jedis实现redis消息队列
应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高.连接频繁的因素,决定利用缓存做. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象 ...
- html BOM、DOM
- 使用WGET参数介绍大全
wget 是一个命令行的下载工具.对于我们这些 Linux 用户来说,几乎每天都在使用它.下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget. $ wget -r -n ...
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
- scikit-learn算法选择图
图片来自sklearn官网 最近事情弄完一部分了,继续开始python data science!
- 【积累篇:他山之石,把玉攻】Mime 类型列表
按照内容类型排列的 Mime 类型列表 类型/子类型 扩展名 application/envoy evy application/fractals fif application/futurespla ...
- F#之旅4 - 小实践之快排
参考文章:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/fvsc-quicksort.html F#之旅4 - 小 ...
- hash表及Java中的HashMap与HashSet
链接: http://alex09.iteye.com/blog/539545/ 当程序试图将一个 key-value 对放入 HashMap 中时,程序首先根据该 key 的 hashCode() ...
- Windows8 UI MessageBox In DevExpress
// custom messagebox using System; using System.Drawing; using System.Windows.Forms; using DevExpres ...