交叉编译MIPS架构ASLA ../src/.libs/libasound.so: undefined reference to `atomic_sub'

我使用下面的命令进行config:

./configure --host=mipsel-linux --prefix=/home/cy/alsa/lib/ --enable-shared --disable-python

然后make出现以下错误:

../src/.libs/libasound.so: undefined reference to `atomic_sub'

../src/.libs/libasound.so: undefined reference to `atomic_add'

atomic_sub在include/iatomic.h中定义,找了下有__arm__对应的版本,但是没有__mipsel__,只有__mips__,那就死马当活马了:

./configure --host=mips-linux --prefix=/home/cy/alsa/lib/ --enable-shared --disable-python

然后make,又是:

../src/.libs/libasound.so: undefined reference to `atomic_sub'

../src/.libs/libasound.so: undefined reference to `atomic_add

//extern __inline__ void atomic_add(int i, atomic_t * v)

//extern __inline__ void atomic_sub(int i, atomic_t * v)

将其中的函数实现的函数类型“extern ”改为“static”即可!

//static __inline__ void atomic_add(int i, atomic_t * v)

//static __inline__ void atomic_sub(int i, atomic_t * v)

alsa-lib-1.0.24.1配置编译

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --prefix=/opt/mips/alsa_lib/ --enable-shared --disable-python

alsa-utils-1.0.24.2配置编译

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --prefix=/opt/mips/alsa_utils/ --host=mips --with-alsa-prefix=/opt/mips/alsa_lib/lib_1.0.24.1/lib/ --with-alsa-inc-prefix=/opt/mips/alsa_lib/lib_1.0.24.1/include/

./configure --prefix=/home/armmlinux/zdfwork/project/audio/alsa/output/mips-linux AR=/opt/buildroot-gcc342/bin/mipsel-linux-uclibc-ar CC=/opt/buildroot-gcc342/bin/mipsel-linux-uclibc-gcc CXX=/opt/buildroot-gcc342/bin/mipsel-linux-uclibc-g++ CXX=/opt/buildroot-gcc342/bin/mipsel-linux-uclibc-g++ --host=mipsel-linux-uclibc --enable-shared=yes --enable-static=no --target=mipsel-linux-uclibc --with-debug=no --with-alsa-devdir=/dev --with-softfloat --with-configdir=/usr/ LDFLAGS="-lm"

ALSA是目前Linux系统上大量采用的音频设备库,通过Alsa架构能分离驱动和应用的开发。Alsa为上层提供API的同时,也为下层提供了接口,在内核配置的时候指定“支持Alsa”就能得到内核支持,具体位置为:

Menuconfig -> Device Drivers -> Soundcard support -> Advanced Linux Sound Architecture

有了Alsa内核驱动,我们还需要Alsa Lib和Alsa Util的支持,这3者的关系如下图所示:

Alsa Util

-------------

Alsa lib

-------------

Alsa Driver

Alsa Util是纯应用层的软件,相当于Alsa设备的测试程序,AlsaLib则是支持应用API的中间层程序。移植Alsa程序的顺序就是先后移植Driver,Lib,Util。

一.Alsa Lib移植

1.编译alsa-lib:

cd /home/pingle/BackUp/alsa-tools/alsa-lib-1.0.15/

$ ./configure --prefix=/home/pingle/alsa/ AR=mipsel-openwrt-linux-uclibc-ar CC=mipsel-openwrt-linux-uclibc-gcc CXX=mipsel-openwrt-linux-uclibc-g++ CXX=mipsel-openwrt-linux-uclibc-g++ --host=mipsel-openwrt-linux-uclibc --enable-shared=yes --enable-static=no --target=mipsel-openwrt-linux-uclibc --with-debug=no --with-alsa-devdir=/dev --with-softfloat --with-configdir=/usr/local/share LDFLAGS="-lm"

make

make install

2.编译alsa-utils:

cd /home/pingle/BackUp/alsa-tools/alsa-utils-1.0.15/

./configure --prefix=/home/pingle/alsa/ AR=mipsel-openwrt-linux-uclibc-ar CC=mipsel-openwrt-linux-uclibc-gcc CXX=mipsel-openwrt-linux-uclibc-g++ CXX=mipsel-openwrt-linux-uclibc-g++ --host=mipsel-openwrt-linux-uclibc CPPFLAGS="-I/home/pingle/alsa/include" LDFLAGS="-L/home/pingle/alsa/lib" --disable-alsamixer

make

make install

1)--host指定编译器,这里指定为在目标板所运行的交叉编译器。注意运行本配置命令前务必保证编译器已经可以在Shell下直接执行了。

2)--prefix指定编译后文件的安装路径,后续的安装命令会在该目录中创建lib和include两个目录

3)若编译make install时报错:"mipsel-linux-ranlib command not found",解决方案为:执行make install之前,先用下su命令取得root权限。然后再执行make install

二.lib和util安装到嵌入式平台

在目标板上,以下文件必须被拷贝至对应位置

1) lib库文件,放在 /lib/中

2) conf文件,应放在/usr/local/share中,与编译时指定的目录相同

3) 应用文件,util能产生aplay,amixer,arecord可执行程序,这些文件可放在/usr/sbin中

4) 必须保证有/dev/snd/目录中,此目录下应包含以下几个设备文件(驱动),controlC0, pcmC0D0c, pcmC0D0p, timer如果这些文件已经在/dev/下,可拷贝到snd目录中。或者建立相应符号链接,

ln -s /dev/pcmC0D0c /dev/snd/pcmC0D0c

ln -s /dev/controlC0 /dev/snd/controlC0

ln -s /dev/timer /dev/snd/timer

三.运行测试程序

export ALSA_CONFIG_PATH=/usr/share/alsa/alsa.conf

未添加环境变量前出现的错误:

~ # ./aplay

ALSA lib conf.c:2827:(snd_config_hook_load) cannot access file /usr/share/arm-alsa/share/alsa/cards/aliases.conf

ALSA lib pcm.c:1959:(snd_pcm_open_conf) Invalid type for PCM default definition (id: default, value: cards.pcm.default)

aplay: main:533: audio open error: Invalid argument

~ # ./aplay

ALSA lib pcm.c:2090:(snd_pcm_open_noupdate) Unknown PCM default

aplay: main:533: audio open error: No such file or directory

编译报错:can't load library 'libpthread.so.0'。

解决方案:在openwrt中的make menuconfig中加入libpthread支持。

编译报错:fatal error: alsa/asoundlib.h: No such file or directory compilation terminated.

解决方案:mipsel-openwrt-linux-uclibc-gcc -lasound -L/home/pingle/alsa/lib -I/home/pingle/alsa/include -o test_audio2 test_audio02.c

四.回顾驱动程序

还是oss驱动接口调用比较好理解,不过终于找到了这个图,一看就啥都明白了

period(周期):硬件中中断间的间隔时间。它表示输入延时。

声卡接口中有一个指针来指示声卡硬件缓存区中当前的读写位置。只要接口在运行,这个指针将循环地指向缓存区中的某个位置。

frame size = sizeof(one sample) * nChannels

alsa中配置的缓存(buffer)和周期(size)大小在runtime中是以帧(frames)形式存储的。

period_bytes = frames_to_bytes(runtime, runtime->period_size);

bytes_to_frames()

The period and buffer sizes are not dependent on the sample format because they are measured in frames; you do not need to change them.

五.小技巧:

1.经过yaff文件系统烧入用户文件到板子上:

在/home/pingle/kernal/ws04/build_dir/target-mipsel_uClibc-0.9.32/root-xburst目录下加入自己的文件;

然后:

$cd /home/pingle/Yaff/linux-2.6.24.3/fs/yaffs2/utils

(可能要make一下哦!)

$./mkyaffs2image 1 /home/pingle/kernal/ws04/build_dir/target-mipsel_uClibc-0.9.32/root-xburst /home/pingle/desktop/xburst-tools-ws10/image/rootfs.yaffs2

(参数) (rootfs的目录) (生成的文件yaffs系统存到的目录)

2.uboot下检测内存命令:mtest.

php mipsl,MIPS系列笔记-交叉编译MIPS架构ASLA相关推荐

  1. mips和sparc交叉编译工具链网址

    1.mips-mti-elf-gcc和mips-img-elf-gcc 网址1:Early Access Release of Codescape MIPS SDK Components – MIPS ...

  2. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转] 目录 参数设置 收集器搭配 启动内存分配 监控工具和方法 调优方法 调优实例       光说不练假把式,学习Java GC机制的目的是为了实用,也 ...

  3. 微服务系列笔记之Mico Api详解

    导语 上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中.因此如果 ...

  4. 深度学习系列笔记——贰 (基于Tensorflow2 Keras搭建的猫狗大战模型 三)

    深度学习系列笔记--贰 (基于Tensorflow Keras搭建的猫狗大战模型 一) 深度学习系列笔记--贰 (基于Tensorflow Keras搭建的猫狗大战模型 二) 前面两篇博文已经介绍了如 ...

  5. 微服务系列笔记之Go-Micro入门案例

    导语 了解了Micro的基本框架之后,我们做一个简单的例子来实现客户端与服务端的通信,在了解本篇文章之前,需要你对rpc.grpc通信技术有所了解. 准备工作 ## 安装go-micro go get ...

  6. RabbitMQ系列笔记封装篇

    导语 在阅读本篇笔记时,如果你还不熟悉RabbitMQ,请查看公众号中关于RabbitMQ系列笔记相关文章,如果你已经熟悉了,还请在本篇文章多多指教.本文使用go mod进行获取相关包,使用Go1.1 ...

  7. RabbitMQ系列笔记广播模式和路由模式

    导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...

  8. RabbitMQ系列笔记入门篇

    导语 在了解本篇文章之前,先复习以下知识点,如果你对RabbitMQ还不了解,请先查看RabbitMQ系列笔记介绍篇这篇文章. 生产者:发送消息的程序 队列:消息的中转站 消费者:接收消息的程序 在以 ...

  9. 微服务系列笔记之Go-Micro

    导语 在上一篇博客中我们主要介绍了什么是微服务,读者可以用这篇文章进行简单的入门,当然仅仅阅读这一篇仍然是不够的,还需要广泛浏览相关概念,逐渐加深印象,可以更好的理解,在本篇文章中,主要分享了微服务框 ...

最新文章

  1. mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?
  2. 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记
  3. JavaScript: 设置Cookie
  4. Centos firewall基本操作
  5. mybatis 分页需要的jar包下载_牛逼哄哄的PageHelper分页插件到底牛在哪里?
  6. 数组的升序 java_java – 以升序数组排序数组
  7. 《大数据》2015年第2期“研究”——特异群组挖掘:框架与应用
  8. 单片机反相器_小白学单片机 :AT89S51单片机基本硬件结构认识(3)
  9. [No00009E]几种常见的命名规则
  10. 别再用 Visio 了!试试这个比它快 10 倍的画图工具不香吗?
  11. IDEA打包失败解决方案
  12. mysql-高级命令(1)和一些函数(悟已往之不谏,知来者之可追)
  13. 十月,愿世间美好,都是恰逢其时
  14. MySQL重做日志文件放在磁盘_重做日志文件
  15. canvas教程10-绘制文本
  16. Office word编辑公式居中,编号右对齐的简单方法,非表格法和制表符法
  17. 影视广告创意与制作(四)
  18. 普通台式机上Tesla M40显卡paddleGPU深度学习柯南的变身器上机体验
  19. Emc服务器怎么用u盘装系统,用u盘装系统的具体方法
  20. 软件测试工程师,是学习Java还是Python比较好呢?

热门文章

  1. QQ2010正式版下载
  2. 连接并配置好无极网络VPS主机 | 配置Mysql数据库 | Centos 常用操作| vim操作 | 保持centos的任务 | 阿里云mysql | Node.js | 腾讯云mysql
  3. 我的日记本开发手记(2)——配色
  4. python简单圣诞树手工折纸_简单折纸圣诞树手工制作教程教你如何折简单的圣诞树...
  5. 实习项目-校园通简介
  6. 中基鸿业投资理财入门的六个小技巧
  7. 大数据 (三) BI报表系统 superset 源码搭建开发环境
  8. 信息论安全的私有信息检索(PIR)Chor1995论文里的双服务器模型
  9. sqlyog-数据库同步
  10. 图解 epoll 是如何工作的及epoll实现原理