在经过三个星期的实习中,我们做了一个基于ubantu软件上的Linux系统编程的智能家居系统。
在此,总结一下。
ls —》查看当前目录下的所有的目录和文件
ls -l ---》查看当前目录下的所有的目录和文件详细信息
cd —》切换当前路径
cd / 进入根目录
cd ~ 进入家目录
cd 进入家目录
cd /home/gec 进入家目录
cd - 返回上一次所在的路径
cd .. 进入上一级目录
cd . 进入当前目录
cd .. -->上一级目录
cd . -->当前目录
cd/ ---》只有在路径最前面时才有效
touch —》创建文件
touch 文件名
touch 1.txt ---》创建一个叫1.txt的文件
mkdir —》创建目录
mkdir 目录名
mkdir test ---》创建一个叫test的目录
vi、vim —》编辑文件 —》不能使用window里面的快捷键
vi 文件名
1、如果文件不存在,则新建文件后,进入编辑模式
2、如果文件存在,则直接进入编辑模式
按Esc,输入i进入真正的编辑模式
按Esc,输入 :q! , 强制退出,不保存
按Esc,输入 :wq ,保存再退出
gedit —》编辑文件
1、如果文件不存在,则新建文件后,进入编辑模式
2、如果文件存在,则直接进入编辑模式
cat —》打印文件里面的内容输入到屏幕上
cat 文件名
以计算机技术为基础(软件+硬件),软件和硬件是可以裁剪的,在成本、体积、功耗、功能、稳定性等参数有严格要求的计算机系统。
嵌入式系统是软硬件结合的,专用的计算机系统。
1、嵌入式硬件的组成
处理器:----执行代码、处理数据。常见的处理器的架构:x86、ARM、MIPS、RISC-V、......
(51单片机----微控制器,不是微处理器)
S5P6818--ARM---Cortex-A53*8---1.5GHz
内存:存放正在运行的程序和正在处理的数据。(掉电丢失)
DDR3 1GB
硬盘:存放代码和数据(永久保存)
eMMC电子硬盘 8GB
输出设备:液晶屏、VGA、LED灯、蜂鸣器、.....
输入设备:键盘、按键、触摸屏、摄像头、触摸板、.....
通信接口:网络、串口、I2C、SPI、.....
2、嵌入式软件
1)启动引导程序----bios
u-boot----通用的启动引导程序。初始化硬件平台、加载并启动操作系统内核。
2)操纵系统内核----Linux内核
Linux的优点:
免费的、开源的、资料多、系统功能丰富、稳定性好、系统可裁剪、...
3)应用程序
1、SecureCRT ------ 串口终端助手(GEC6818的控制台)
2、VMware-player(VMware-workstation)
虚拟机软件----在windows虚拟一台PC机,我们在虚拟的PC运行linux系统
3、ubuntu16.04
PC ---->ubuntu-16.04 + arm-linux-gcc
GEC6818 ----> 运行交叉编译好的程序
1.开发环境中的交叉编译器
bobeyfeng@ubuntu:/$ arm- —>+Tab键补全
arm-linux-addr2line arm-linux-gprof arm-none-linux-gnueabi-gcc
arm-linux-ar arm-linux-ld arm-none-linux-gnueabi-gcc-5.4.0
arm-linux-as arm-linux-ld.bfd arm-none-linux-gnueabi-gcc-5.4.0.br_real
arm-linux-c++ arm-linux-nm arm-none-linux-gnueabi-gcc-ar
arm-linux-c++.br_real arm-linux-objcopy arm-none-linux-gnueabi-gcc.br_real
arm-linux-cc arm-linux-objdump arm-none-linux-gnueabi-gcc-nm
arm-linux-cc.br_real arm-linux-ranlib arm-none-linux-gnueabi-gcc-ranlib
arm-linux-c++filt arm-linux-readelf arm-none-linux-gnueabi-gcov
arm-linux-cpp arm-linux-size arm-none-linux-gnueabi-gcov-tool
arm-linux-cpp.br_real arm-linux-strings arm-none-linux-gnueabi-gfortran
arm-linux-elfedit arm-linux-strip arm-none-linux-gnueabi-gfortran.br_real
arm-linux-g++ arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-gprof
arm-linux-g++.br_real arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-ld
arm-linux-gcc arm-none-linux-gnueabi-as arm-none-linux-gnueabi-ld.bfd
arm-linux-gcc-5.4.0 arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-nm
arm-linux-gcc-5.4.0.br_real arm-none-linux-gnueabi-c++.br_real arm-none-linux-gnueabi-objcopy
arm-linux-gcc-ar arm-none-linux-gnueabi-cc arm-none-linux-gnueabi-objdump
arm-linux-gcc.br_real arm-none-linux-gnueabi-cc.br_real arm-none-linux-gnueabi-ranlib
arm-linux-gcc-nm arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-readelf
arm-linux-gcc-ranlib arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-size
arm-linux-gcov arm-none-linux-gnueabi-cpp.br_real arm-none-linux-gnueabi-strings
arm-linux-gcov-tool arm-none-linux-gnueabi-elfedit arm-none-linux-gnueabi-strip
arm-linux-gfortran arm-none-linux-gnueabi-g++
arm-linux-gfortran.br_real arm-none-linux-gnueabi-g++.br_real
2.交叉编译器的版本
bobeyfeng@ubuntu:/$ arm-linux-gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/arm/5.4.0/usr/bin/arm-linux-gcc.br_real
COLLECT_LTO_WRAPPER=/usr/local/arm/5.4.0/usr/bin/../libexec/gcc/arm-none-linux-gnueabi/5.4.0/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: ./configure --prefix=/home/geclab/buildroot-2016.11/output/host/usr --sysconfdir=/home/geclab/buildroot-2016.11/output/host/etc --enable-static --target=arm-none-linux-gnueabi --with-sysroot=/home/geclab/buildroot-2016.11/output/host/usr/arm-none-linux-gnueabi/sysroot --disable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib --with-gmp=/home/geclab/buildroot-2016.11/output/host/usr --with-mpc=/home/geclab/buildroot-2016.11/output/host/usr --with-mpfr=/home/geclab/buildroot-2016.11/output/host/usr --with-pkgversion='Buildroot 2016.11' --with-bugurl=http://bugs.buildroot.net/ --disable-libquadmath --enable-tls --disable-libmudflap --enable-threads --without-isl --without-cloog --with-float=soft --disable-decimal-float --with-abi=aapcs-linux --with-cpu=cortex-a15 --with-float=soft --with-mode=arm --enable-languages=c,c++,fortran --with-build-time-tools=/home/geclab/buildroot-2016.11/output/host/usr/arm-none-linux-gnueabi/bin --enable-shared --disable-libgomp
Thread model: posix
gcc version 5.4.0 (Buildroot 2016.11)
3.编写一个测试程序
#include
int main(void)
{
printf("sizeof char = %lu\n",sizeof(char)); //字符、字节
printf("sizeof short = %lu\n",sizeof(short));//半字、短整型
printf("sizeof int = %lu\n",sizeof(int));//字
printf("sizeof long = %lu\n",sizeof(long));//双字、长整型
return 0;
}
4、设置windows和linux的共享路径
bobeyfeng@ubuntu:/mnt/hgfs/day1$ cd /mnt/hgfs/day1/demo/
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ ls
test1.c
5、编译C程序
1)使用gcc来编译---->可以在x86平台
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ gcc test1.c -o test
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=799c7badc28ceb21e0fbe2763184d82fb07e2e6e, not stripped
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ ./test
sizeof char = 1
sizeof short = 2
sizeof int = 4
sizeof long = 8
2)使用交叉编译器来编译程序
arm-linux-gcc ----->嵌入式平台上运行的程序
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ arm-linux-gcc -o test test1.c
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ arm-linux-gcc -o test test1.c
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ file test
test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0, not stripped
将test执行文件下载到GEC6818开班
[root@GEC6818 /]#cd / ----->去linux根目录
[root@GEC6818 /]#mkdir test ----->创建test目录
[root@GEC6818 /]#cd test ---->进入test目录
[root@GEC6818 /test]#ls ---- 查看test目录下的文件
[root@GEC6818 /test]#rx test
C
发送test的方法:secure CRT—>传输—>发送xmodem—>选择test文件—>发送
修改test的权限,给他以可执行权限
[root@GEC6818 /test]#chmod 777 test
[root@GEC6818 /test]#./test
sizeof char = 1
sizeof short = 2
sizeof int = 4
sizeof long = 4
注意:long数据的大小是处理器的位数一致的。或者说和运行平台的位数保持一致。
做小练习:
char *p=“hello world\n”;
sizeof§=??
strlen§=??
深刻理解:sizeof()和strlen()的区别是什么?
====================================================================================================================================
1.液晶屏的结构
像素:800*480
尺寸:7inch
色位:32bits ------>一个像素点是有32bits的数据组成,4个字节有ARGB组成:A—透明度(未用)、R—red,G–Green,B–blue
红-----0x00FF0000
绿-----0x0000FF00
蓝-----0x000000FF
黑-----0x00FFFFFF
白-----0x00000000
2、使LCD显示单色
定义一个存放颜色的数组:
int lcd_buf[800480];
int i;
for(i=0;i<800480;i++)
lcd_buf[i]=0x0000FF00;
需要解决的问题:
将lcd_buf[]写到液晶屏上。液晶屏就会显示纯绿色。
1)打开液晶屏
在linux系统中,“一切皆文件”。液晶屏的驱动也是一个文件。
/dev/fb0
bobeyfeng@ubuntu:/mnt/hgfs/day1/demo$ man 3 open
#include
#include
int open(const char *path, int oflag);
参数说明:
const char *path----要打开的文件的文件名,需要带有文件的路径。如:"/dev/fb0"
int oflag ----- 文件的访问属性:O_RDONLY、O_RDWR、O_WRONLY
返回值:
打开成功,返回一个文件描述符(文件的ID,是唯一的,每打开一个文件,都会得到一个文件描述符,文件描述符是一个正整数)
打开失败,返回-1,并给系统返回一个负数的错误码。
例:
int fd_lcd;
fd_lcd = open("/dev/fb0", O_WRONLY);
if(fd_lcd == -1)
{
perror(“open /dev/fb0”);
return -1;
}
2)向液晶屏这个文件写入颜色数据
#include
ssize_t write(int fildes, const void *buf, size_t nbyte);
参数说明:
int fildes ---- 写入文件的文件描述符,open函数的返回值。
const void *buf -----要写入的文件的地址
size_t nbyte ---- 写入文件的大小
返回值:
正确写入的字节数。
例:
write(fd_lcd, lcd_buf,8004804);//sizeof(lcd_buf);
3)关闭液晶屏
#include
int close(int fildes);
例:
close(fd_lcd);
作业:
小项目:LCD检测程序,循环显示颜色。
循环中使用延时函数:sleep(2)//睡眠延时2秒
arm-linux-gcc -o test test.c