linux arm 使用cmake 进行编译的一个播放音乐的例子

搭建 arm linux 环境一般是这样:
1 下载交叉编译环境
2 下载cmake,如果版本低,那么下载源码自己编译
3 下载gdb新版本,我下的是7.5
4 编译 gdb ,然后配合 gdbserver可以远程调试,或者使用 idapro 进行调试
下面就是cmake的编译设置

指定 c编译器 , c++编译器, include 目录和library 目录就可以了.

set(CMAKE_SYSTEM_NAME Linux)
set(TOOLCHAIN_DIR "/usr/local/arm/cross/am335xt3/devkit/arm-arago-linux-gnueabi")
set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/bin/gcc")
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_DIR}/bin/g++")
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}
    ${TOOLCHAIN_DIR}/include 
    ${TOOLCHAIN_DIR}/lib)
include_directories("/usr/local/arm/cross/am335xt3/devkit/arm-arago-linux-gnueabi/usr/include")
include_directories("/usr/local/arm/cross/am335xt3/devkit/arm-arago-linux-gnueabi/usr/include")
link_directories("/usr/local/arm/cross/am335xt3/devkit/arm-arago-linux-gnueabi/lib")
link_directories("/usr/local/arm/cross/am335xt3/devkit/arm-arago-linux-gnueabi/usr/lib")

project(hal)
cmake_minimum_required(VERSION 3.5)


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/bin)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib/debug)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib/release)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/lib/Release)

message("cmake_binary_dir=${CMAKE_BINARY_DIR}")
message("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
add_subdirectory(buzzer)

在buzzer目录的CMakeLists.txt 的内容

set(src interface_buzzer.c
        test/main.c)
add_executable(test_buzzer ${src})

在 buzzer 中的 interface_buzzer.h 文件内容

#ifndef _interface_buzzer_h_20180806_
#define _interface_buzzer_h_20180806_

#ifdef __cplusplus
extern "C" {
#endif

int virbox_open_buzzer();
int virbox_close_buzzer(int fd);
int virbox_sound_frequency(int fd,int freq,long keep_time);
int virbox_keep_buzzer_frequency(int freq,long keep_time);

#ifdef __cplusplus
}
#endif

#endif

在 buzzer 中的 interface_buzzer.c 文件内容

#include <stdlib.h> //system
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define BUZZER_DEVICE "/dev/buzzer"
/*
 * virbox_open_buzzer
 * parameters: -
 * return : 成功返回文件描述符;否则返回errno
 * desc:
 *  打开buzzer 设备.
 */
int virbox_open_buzzer()
{
    return open(BUZZER_DEVICE,O_RDWR);
}
/*
 * virbox_close_buzzer
 * parameters: fd - buzzer 设备描述符(文件描述符)
 * return 0 - 成功 ;其他 - 失败
 */
int virbox_close_buzzer(int fd)
{
    return close(fd);
}
/*
 * virbox_sound_frequency
 * parameters: fd - buzzer 设备描述符(文件描述符)
 * freq - 声音的频率
 * keep_time - 保持多久
 * return 0 - 成功 ;其他 - 失败
 * desc:
 *  使用打开的设备发出一定频率的声音,并且保持一定时间。
 */
int virbox_sound_frequency(int fd,int freq,long keep_time)
{
    int ret = ioctl(fd, 1, freq);
    if(ret<0)
    {
        return ret;
    }
    usleep(keep_time);
    return ret;
}

/*
 * virbox_keep_buzzer_frequency
 * parameters:
 *  
 * desc:
 *  发出某个频率声音,并且保持多久
 */
int virbox_keep_buzzer_frequency(int freq,long keep_time)
{
    int fd = virbox_open_buzzer();
    int ret = virbox_sound_frequency(fd,freq,keep_time);
    virbox_close_buzzer(fd);
    return ret;
}



在 test 目录下的main.c 文件
这里是小蜜蜂的乐谱:
小蜜蜂

#include <stdio.h>
#include "../interface_buzzer.h"
typedef struct sound_data
{
    int freq_index;
    int delay_time;
}sound_data;

#define BEAT_1 3200000/8
#define BEAT_2 3200000/4

int mid[]= {0, 523,578,659,698,784,880,988};
sound_data bee[]={{5,1},{3,1},{3,2},{4,1},{2,1},{2,2},{1,1},{2,1},{3,1},{4,1},{5,1},{5,1},{5,2},
    {5,1},{3,1},{3,2},{4,1},{2,1},{2,2},{1,1},{3,1},{5,1},{5,1},{3,4},
    {2,1},{2,1},{2,1},{2,1},{2,1},{3,1},{4,2},{3,1},{3,1},{3,1},{3,1},{3,1},{4,1},{5,2},
    {5,1},{3,1},{3,2},{4,1},{2,1},{2,2},{1,1},{3,1},{5,1},{5,1},{1,4}};
int main()
{
    int i;
    int fd = virbox_open_buzzer();
    for(i=0;i<sizeof(bee)/sizeof(bee[0]);i++)
    {
        virbox_sound_frequency(fd,mid[bee[i].freq_index],BEAT_1*bee[i].delay_time);
    }
    virbox_close_buzzer(fd);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/justin_bkdrong/article/details/81625405