搭建 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;
}