嵌入式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 ...
随机推荐
- tp5 model 中的类型转换
类型转换使用 $type 定义 // 保存到数据库的数据会自动转换为相对应的格式class User extends Model { protected $type = [ 'status' => ...
- acm 1002 算法设计
最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...
- 惊闻Java要收费之后
今天看到朋友圈里的文章 <Oracle终于要向Java的非付费用户开枪了>,被这个标题吓了一跳,还以为Java要全面收费了.又被标题党骗了. 但是仔细想想,以Oracle公司的尿性,没准哪 ...
- Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
- V4.0到来了,css雪碧图生成工具4.0更新啦
V3.0介绍 http://www.cnblogs.com/wang4517/p/4476758.html V4.0更新内容 V4.0下载地址:http://download.csdn.net/det ...
- 迭代器模式/iterator模式/对象行为型模式
意图 又名:游标(Cursor): 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 动机 一个聚合对象,提供访问元素的方法,而有不暴露它的内部结构.如list,将对列表的访问 ...
- Git安装
前面说了很多废话,说得再好,还不如实践一次.要想使用Git,首先得安装.这次实验主要是实践怎样安装Git. 安装与检查是否安装成功 1. 在Linux(Ubuntu)上安装 上篇的Git简介已经介绍过 ...
- mongoose数据库连接和操作
var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...
- 转:WaitForSingleObject()函数、WaitForMultipleObject()函数
http://blog.csdn.net/xiaobai1593/article/details/6672193 在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以 ...
- 动作手游实时PVP技术揭密(服务器篇)
前言 我们的游戏是一款以忍者格斗为题材的ACT游戏,其主打的玩法是PVE推图及PVP 竞技.在剧情模式中,高度还原剧情再次使不少玩家泪目.而竞技场的乐趣,伴随着赛季和各种赛事相继而来,也深受玩家喜爱, ...