最近一周,由于学校安排,进行了为期一周的华清远见的基础嵌入式培训,主要包含Linux基础操作和ARM环境搭建,虽然一周时间实际上上不了多少东西,但这算是我第一次正式使用Linux虚拟机进行嵌入式开发吧,最后成功响了蜂鸣器,也算是最备考期间一次难得的体验了。此篇文章为这段时间所所学内容的记述,便于自己以后复习。
目录一些理论知识
1:Linux
类Unix操作系统 , Linux是仿照unix来写,林纳斯·托瓦斯,开源免费,GNU开源组织。
Unix:作者为肯·汤普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie),两人也是C语言的创始人,具体故事可以去搜一下,简单来说就是两人为了玩游戏,写出了C语言,又为了玩的更好,就自己编写了一套操作系统。
Linux:Linus Torvalds(林纳斯·托瓦兹)于1991年正式发布的一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
GNU计划,有译为“革奴计划”,是由理查德·斯托曼在1983年9月27日公开发起的自由软件集体协作计划。它的目标是创建一套完全自由的操作系统GNU。自由软件基金会发展的重点。
2:Linux操作系统
Ubuntu:桌面应用为主,操作接近Windows
centos: 服务器
deepin: 深度linux操作系统
Redhat: 红帽linux
kali: 安全
3:vim命令行编辑器
文本编辑器
开源免费 可定制
4:C语言:
面向过程的编译型语言
编译型: 借助编译器, 将源码编译成二进制可执行文件(.exe)
解释型: 借助解释器, 将源码一条一条的翻译执行(python,php,shell,脚本语言)
开发环境
系统:
Ubuntu12
VMware
虚拟机: 可以模拟计算机的硬件环境(cpu,显卡,硬盘,内存等)
硬件:
Exynos 4412开发板
采用三星32nm HKMG工艺,是三星的第一款四核处理器。
Linux基础
基础操作
- 打开终端
ctrl + alt + t - 关闭终端
alt + f4 - 放大终端
ctrl + shift + '+' - 缩小终端
ctrl + '-' - 方向左键+上下键,切换历史命令
命令提示符
fs@ubuntu:~$
用户名@主机名:当前所在工作路径 权限标志
$: 表示当前用户是普通用户
: 表示当前用户是管理员用户(root)
路径:
windows: 以盘符形式划分路径, 在不同盘符下挂载不同文件
Linux: 以根目录('/')为起点, 管理多个目录的树形结构
/:
etc: 存放系统配置文件
bin: 存放常用指令
dev: 存放设备文件
home: 普通用户的主目录, 所有普通用户的文件都创建在这个目录下(普通用户的工作路径)
root: root用户的主目录
家目录(~): 普通用户的工作路径
/home/fs
pwd: 显示当前所在工作路径
文件详情
基础命令
-
ls (list)
显示当前文件夹下的所有文件
ls -a:显示当前文件夹下的所有文件,包括隐藏文件(以'.'开头的文件)
ls . : 表示当前所在路径
ls .. : 表示上一级所在路径
ls -l: 显示文件的详细信息 -
cd (change directory)
切换工作路径
cd + 路径: 切换到相应的路径下
eg:
cd : 回家
cd /: 切换至根目录下
cd ~: 回家
cd 目录名: 切换到相应的目录下 -
mkdir (make directory)
创建文件夹
mkdir + 目录名: 创建一个空目录
mkdir -p 子目录1/子目录2: 先创建子目录1, 再在子目录1下创建子目录2 -
touch
创建文件,如果文件存在, 则修改文件时间戳为当前时间
touch 路径/文件名: 在指定路径下创建文件
eg:
touch ./day1/test1/1.txt -
cp
复制文件
cp 源文件 目标目录: 复制源文件到目标目录下
复制目录
cp -a 源目录 目标目录: 复制整个源目录至目标目录下 -
mv(move)
移动文件
mv 源文件 目标目录: 将源文件移动到目标目录下, 源文件可以是多个文件
重命名文件
mv 源文件 目标文件: 当目标文件不存在时为重命名操作 -
rm (remove)
删除文件
rm -rf 文件名: 直接删除指定路径下的文件
删库跑路: rm -rf /* -
×××su
切换用户
su + 用户名: 切换至相应用户, 并获得该用户的权限
eg: su root
su fs
修改密码: passwd root: 设置root用户密码 -
sudo
sudo + 指令: 以管理员的身份执行指令
修改密码: sudo passwd root: 设置root用户密码
删库跑路: sudo rm -rf /* -
clear :清屏
Vim命令行编辑器
文本编辑器,开源免,可定制
vim基本操作
- 打开文件
vim + 文件名: 以vim打开一个文件 - 模式切换
一般模式 -> 插入模式: 按'a','i','o','A','I','O'
插入模式 -> 一般模式: 按'Esc'
一般模式 -> 底行模式: 按 shift + ':' 或 按空格键
底行模式 -> 一般模式: 按'Esc'
vim工作模式
-
一般模式
使用vim打开文件默认进入的模式, 文本的复制粘贴撤销剪切等
复制------yy
粘贴------p
剪切------dd
撤销------u
恢复------ctrl + r -
插入模式
文本编辑
a: append, i:insert o:open
a: 从光标的下一个位置进入插入模式
i: 从光标的位置进入插入模式
o: 从光标的下一行新建一行进入插入模式 -
底行模式(在编辑器底行,用于以下操作)
可以执行vim的指令, 文本的保存退出等
保存-------w
退出-------q
保存并退出-wq
强制保存---w!
强制保存并退出-wq!
C语言编译环境
GCC编译器
C语言编译过程
预处理, 处理所有以#号开头的文件, #include,#define等
gcc -E hello.c -o hello.i
编译, 将预处理之后的文件翻译成汇编文件
gcc -S hello.i -o hello.s
汇编, 将汇编文件翻译成二进制文件
gcc -c hello.s -o hello.o
链接, 将二进制的目标文件和二进制的库文件链接生成可执行文件
gcc hello.o -o hello
编译
gcc 源文件.c -o 可执行文件名
gcc hello.c -o hello
gcc 源文件.c
gcc hello.c 默认生成可执行文件名为a.out
执行
./可执行文件名
如:
./hello
如图,打印hello,word!
环境搭建包括两部分:主机和开发板
搭建主机开发环境
网络 设置静态IP地址
TFTP: 简单文本传输协议 FTP简版
NFS: 网络文件系统 ,共享目录
搭建开发板环境
配置u-boot 2013
网络 设置静态IP地址
TFTP: 简单文本传输协议 FTP简版
NFS: 网络文件系统 ,共享目录
搭建主机开发环境
搭建交叉开发环境
交叉编译工具
pc :x86
target: arm
安装: 手动安装
芯片厂商提供
arm-none-linux-gnueabi-gcc hello.c -o hello
arm: 编译器编译出来的体系结构
none: 厂商名, 开源
linux: 针对linux操作系统
eabi: 嵌入式的标准接口, oabi
步骤
将gcc-4.6.4.tar.xz拷贝到虚拟机中(Ctrl+cv),解压至特定目录,添加环境变量,并检验。
cd ~
mkdir toolchain(创建工具环境)
mv gcc-4.6.4.tar.xz toolchain
cd toolchain
tar -xvf gcc-4.6.4.tar.xz
sudo vim /etc/bash.bashrc
在文件最后一行添加:
export PATH=$PATH:/home/fs/toolchain/gcc-4.6.4/bin/
source /etc/bash.bashrc
arm-n按下Tab键自动补全后,输入gcc -v出现版本为4.6.4为成功
配置主机IP地址
- sudo vim /etc/network/interfaces
在配置文件中添加:
auto eth0
iface eth0 inet static
address 192.168.1.66
netmask 255.255.255.0
gateway 192.168.1.0 - 重启网卡: sudo /etc/init.d/networking restart,出现OK即可
- 以管理员模式运行虚拟机,点击左上角编辑->虚拟网络编辑器->选择桥接模式->桥接有线网卡
(含Realtek GbE Family Controller的选项)
- 重启网卡: sudo /etc/init.d/networking restart
出现OK即可 - ifconfig查看IP地址
TFTP协议配置
将exynos4412-fs4412.dtb和uImage文件拷贝到虚拟机中
- cd /
- sudo mkdir tftpboot
- sudo mv ~/exynos4412-fs4412.dtb /tftpboot
- sudo mv ~/uImage /tftpboot
- sudo chmod 777 /tftpboot -R
- sudo vim /etc/default/tftpd-hpa
修改配置文件为:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s" - 重启服务: sudo service tftpd-hpa restart
出现进程号为成功, 进程号随机显示
NFS配置
将rootfs.tar.xz拷贝到虚拟机中
- sudo mkdir /src
- sudo mv ~/rootfs.tar.xz /src
- cd /src
- sudo tar -xvf rootfs.tar.xz
- sudo chmod 777 /src -R
- sudo vim /etc/exports
在配置文件中添加:
/src/rootfs/ *(rw,sync,no_root_squash,no_subtree_check) - 重启服务: sudo /etc/init.d/nfs-kernel-server restart
出现四个ok即可
注:上述虚拟机环境搭建好后,每次重启虚拟机,都会重新连接网络,需要几分钟的时间。
搭建开发板环境
调试工具
SecureCRSecureFXPortable64
- 点击快速连接
- 选择协议: Serial
- 选择端口号(COM)
- 设置波特率: 115200
- 点击连接(RTS/CTS选项要去掉)
开发板配置
开发板上电, 在倒计时结束之前按下回车键, 进入到u-boot配置界面
print: 查看环境变量
setenv: 设置环境变量
saveenv: 保存环境变量
配置开发板IP地址
setenv serverip 192.168.1.66 #虚拟机的IP地址
setenv netmask 255.255.255.0
setenv gatewayip 192.168.1.1
setenv ipaddr 192.168.1.88 #开发板IP地址
saveenv #保存
ping 192.168.1.66: 出现is alive表示配置成功
可以print看一下设置项
配置TFTP协议
setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
saveenv
配置NFS协议
setenv bootargs root=/dev/nfs nfsroot=192.168.1.66:/src/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.88
saveenv
若上述开发板配置均完成,则会出现以上情况,此时虚拟机和开发板共享目录/src/rootfs,并可以进行操作。
驱动编写
驱动前准备
将linux-3.14-fs4412.tar.xz拷贝到虚拟机中
tar -xvf linux-3.14-fs4412.tar.xz
cd linux-3.14-fs4412
make uImage -j2 #进行编译,不要忘
驱动编写
四个部分组成:
- 头文件
- 驱动模块装载和卸载函数的声l明
- 驱动模块装载和卸载函数的实现
- GPL声明
驱动加载: insmod hello.ko
驱动卸载: rmmod hello
查看代码: dmesg
示例 hello.c
编写程序
编写以下两个文件,并保证在同一目录。
hello.c
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk("-----%s----\n",__FUNCTION__ );
return 0;
}
static void helli_exit(void)
{
printk("-----%s----\n",__FUNCTION__ );
}
module_init(hello_init);
module_exit(helli_exit);
MODULE_LICENSE("GPL");
Makefile
ifeq ($(KERNELRELEASE), )
KDIR = /home/fs/motor/linux-3.14-fs4412 #编译器所在目录
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
install:
cp -rf *.ko /src/rootfs/test/
#此处为和开发板共同的/src/rootfs目录下,/test是自己创建的存放驱动的目录
else
obj-m += hello.o
endif
进行编译
虚拟机端
make all
sudo make install
开发板端
cd test
insmod hello.ko #安装驱动,每次重启开发板都需要
./hello #运行
(无运行结果图)
示例 蜂鸣器1
将CD和pwm.ko移动至共享目录下/src/rootfs/test中
开发板端
chmod 777 CD #给予权限
insmod pwm.ko #安装驱动
./CD #运行程序
示例 蜂鸣器2
蜂鸣器程序,驱动依然为pwm.ko
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define MAGIC_NUM 'k'
#define BEEP_ON _IO(MAGIC_NUM,0)
#define BEEP_OFF _IO(MAGIC_NUM,1)
#define BEEP_SETFRE _IO(MAGIC_NUM,2)
int int main(int argc, char const *argv[])
{
int len;
#5 3 5 3 5 3 1 2 4 3 2 5 5 3 5 3 1 2 4 3 2 1
int pitch_frame[] = {784,659,783,659,784,659,523,622,698,659,
622,783,783,659,783,659,523,587,698,659,622,523} ;‘
int i;
int fd = open("/dev/pwm",O_RDWR);
len= sizeof(pitch_frame)/sizeof(pitch_frame[0]);
if(-1 == fd)
{
perror("open()");
exit(1);
}
if(i=0;i<len;i++)
{
ioctl(fd,BEEP_SETFRE,pitch_frame[i]);
ioctl(fd,BEEP_ON);
usleep(100000000);
ioctl(fd,BEEP_OFF);
}
close(fd);
return 0;
}
运行步骤同上
标签:文件,gcc,20,sudo,开发板,本科,实习,vim,hello From: https://www.cnblogs.com/cloudraysun/p/16756704.html