嵌入式系统原理与应用-基于Cortex-A53微处理器 课件全套 郑洪庆 第1-9章 绪论、Linux基本操作-嵌入式项目实践_第1页
嵌入式系统原理与应用-基于Cortex-A53微处理器 课件全套 郑洪庆 第1-9章 绪论、Linux基本操作-嵌入式项目实践_第2页
嵌入式系统原理与应用-基于Cortex-A53微处理器 课件全套 郑洪庆 第1-9章 绪论、Linux基本操作-嵌入式项目实践_第3页
嵌入式系统原理与应用-基于Cortex-A53微处理器 课件全套 郑洪庆 第1-9章 绪论、Linux基本操作-嵌入式项目实践_第4页
嵌入式系统原理与应用-基于Cortex-A53微处理器 课件全套 郑洪庆 第1-9章 绪论、Linux基本操作-嵌入式项目实践_第5页
已阅读5页,还剩473页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理与应用第一章绪论绪论CONTENTS01.嵌入式系统简介02.嵌入式微处理器03.嵌入式系统04.

开发软件安装05.如何学好嵌入式Linux01PARTONE嵌入式系统简介1、嵌入式系统定义一、嵌入式系统简介

嵌入式产品???1、嵌入式系统定义一、嵌入式系统简介5

实例展示-嵌入式产品嵌入式产品1、嵌入式系统定义一、嵌入式系统简介6什么是嵌入式系统?1、嵌入式系统定义一、嵌入式系统简介77嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。健康码人脸识别测温一体机立式人脸识别测温一体机_捷易科技2、嵌入式系统的结构(1)硬件:一、嵌入式系统简介微处理器外围电路外部设备2、嵌入式系统的结构(2)软件:一、嵌入式系统简介应用程序(ApplicationProgram)应用程序接口(ApplicationProgrammableInterface,API)实时操作系统(RealTimeOperationSystem,RTOS)板级支持包(BoardSupportPacket,BSP)3、嵌入式系统的特点(1)嵌入式系统是面向特定应用(2)嵌入式系统涉及先进的计算机技术、半导体技术、电子技术、通信和软件等各行业。(3)嵌入式系统的硬件和软件都必须具备高度可定制性(可裁剪、移植、优化)。(4)运行环境差异大。(5)高实时性。(6)多任务的操作系统。(7)专门的开发工具和环境。一、嵌入式系统简介3、嵌入式系统的特点嵌入式系统与一般PC(PersonalComputer)系统有何区别?一、嵌入式系统简介3、嵌入式系统的特点一、嵌入式系统简介嵌入式系统专用于特定的应用,而PC是通用计算机。使用多种类型的处理器和处理器体系结构。关注成本。大多有功耗约束。经常在极端的环境下运行。系统资源比PC少的多。需要专用工具和方法进行开发设计。嵌入式系统的数量远远超过PC。1、无操作系统阶段2、简单操作系统阶段简单的进程调度、内存管理、根文件系统、shell3、实时操作系统阶段多任务,处理能被区分优先次序的进程线、文件和目录管理、设备管理、多任务、网络、图形用户界面(GUI)4、嵌入式系统的发展一、嵌入式系统简介4、面向Internet阶段2024/12/1114嵌入式软硬件系统架构

软硬件系统架构

02PARTTWO嵌入式微处理器二、嵌入式微处理器1、嵌入式微控制器(MicroControllerUnit,MCU)2、嵌入式微处理器(MicroProcessorUnit,MPU)3、嵌入式DSP处理器(EmbeddedDigitalSignalProcessor,EDSP)4、嵌入式片上系统(SystemonChip,SoC)嵌入式处理器的分类二、嵌入式微处理器1、Intel公司MCS-51系列微控制器2、Microchip公司PIC系列微控制器3、Freescale公司08系列微控制器4、TI公司TMS320系列DSP5、ARM公司ARM系列微处理器典型的嵌入式处理器二、嵌入式微处理器

ARMARM,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,ARM技术正在逐步渗入到我们生活的各个方面。二、嵌入式微处理器ARM分类二、嵌入式微处理器MIPS系列微处理器最初是在上世纪80年代由美国斯坦福大学Hennessy教授领导的研究小组研制出来的,目前其使用率仅次于ARM。MIPS应用领域覆盖游戏机、路由器、掌上电脑等各个方面。MIPS的系统结构及设计理念比较先进,在设计理念上MIPS强调软硬件协同提高性能,同时简化硬件设计。MIPS二、嵌入式微处理器PowerPCPowerPC处理器品种很多,应用范围非常广泛,从高端的工作站、服务器到桌面计算机系统,从消费类电子产品到大型通信设备,无所不包。(Motorola)

贵03PARTTHERE嵌入式操作系统三、嵌入式操作系统嵌入式操作系统是嵌入式应用软件的基础和开发平台。嵌入式系统具有操作系统的最基本功能:进程调度进程间通信v内存管理v设备管理v文件管理v操作系统接口(API调用)嵌入式操作系统具有的特点:v可裁减,可配置。v有一定的实时性。三、嵌入式操作系统vVxworks:

美国WindRiver公司于1983年开发,具有可靠、实时、 可裁减特性。vWindowsCE:

支持具有丰富应用程序和服务的32位嵌入式系统。v嵌入式Linux:

近年来,Linux在嵌入式领域异军突起。贵贵04PARTFOUR开发软件的安装四、开发软件的安装1、安装Vmware2、安装Ubuntu资料包在code第一章中05PARTFIVE如何学好嵌入式Linux1、为什么要学习嵌入式?2、如何学好嵌入式?五、如何学好嵌入式Linux1、兴趣2、职业发展3、高收入思考学习的目的1、硬件资源2、做中学、学中做3、动手做怎么学1、裸机程序开发2、系统管理3、应用程序开发4、驱动程序开发5、内核开发与系统移植学什么注意事项4231学习一定要按计划,由简入深,系统进行。初学阶段,资料做到少而精,坚持看。多做实验多思考,必修实验必须做。多做多思考作业1342简述嵌入式系统的定义简述常见的嵌入式操作系统采用虚拟机的方法安装Ubuntu简述常见的嵌入式微处理器2024/12/1131GEC6818实验箱2024/12/1132GEC6818实验箱2024/12/1133软件安装1、安装Vmware虚拟机

2、安装Ubuntu/qq_39557270/article/details/1029262823、安装vmtools

嵌入式系统原理与应用电子与电气工程学院第二章Linux基本操作教师:程蔚Linux基本操作CONTENTS01.Linux常用命令02.vi编辑器、gcc编译器、gdb调试器03.make工程管理器04.开发环境搭建01PARTONELinux常用命令

目录结构命令详解作业总结Linux基础命令/bin:存放常用命令的可执行文件/boot:存放启动程序/dev:存放设备文件,字符设备(键盘、lcd,usb)/etc:存放启动,关闭,配置程序与文件/home:用户工作根目录/lib:存放共享链接库/root:超级用户的工作目录/sbin:系统管理员的常用管理程序/tmp:存放临时文件/lost+found:系统出现异常时,用于保存部分资料目录结构/根目录~主目录(家目录)或/home/用户名/misc:一些实用工具/mnt:光驱、硬盘等的挂载点/media:光驱的自动挂载点/proc:操作系统的实时信息/sys:系统中的硬件设备信息/srv:服务启动后需要提取的信息/var:主要存放系统日志/usr:存放用户程序/tftpboot:tftp服务器的服务目录/selinux:redhat提供的selinux安全程序目录结构进入Linux系统,必须输入用户的账号,在系统安装过程中可以创建以下两种帐号:1.root--超级用户帐号(系统管理员),使用这个帐号可以在系统中做任何事情。2.普通用户--这个帐号供普通用户使用,可以进行有限的操作。

一般的Linux使用者均为普通用户,而系统管理员一般使用超级用户帐号完成一些系统管理的工作。如果只需要完成一些由普通帐号就能完成的任务,建议不要使用超级用户帐号,以免无意中破坏系统,影响系统的正常运行。用户登录分两步:第一步,输入用户的登录名,

第二步,输入用户的口令;当用户正确地输入用户名和口令后,就能合法地进入系统。屏幕显示:[root@loclhost/root]#

这时就可以对系统做各种操作了。超级用户的提示符是“#”,其他用户的提示符是“$”。命令详解cd(changedirectory)1、作用:改变当前工作路径2、用法:

cddir/==>将当前工作路径改为dir/cd-==>将当前工作路径改为刚刚去过的目录

cd~==>将当前工作路径改为家目录一些特殊的文件:. 当前目录.. 上一级目录../.. 上上级目录

根目录~ 家目录、主目录/home/用户名命令详解ls(list)1、作用:列出指定目录下的文件信息2、用法:

ls ==>列出当前目录中的文件名

lsdir/ ==>列出指定目录dir/中的文件名

ls-l ==>列出当前目录中的文件的详细信息

ls-a ==>列出当前目录中的文件名(包括以.开头的隐藏文件)pwd1、作用:显示当前所在路径命令详解mkdir(mkdir)1、作用:创建新的目录2、用法:

mkdirdir ==>在当前目录中创建dir目录

mkdir-ptest2/test22==>在当前目录中创建test22目录(不存在也创建)

mkdir–m777test3 ==>在当前目录中创建权限为test3目录touch1、作用:创建新的文件2、用法:

touchmain.c ==>在当前目录中创建main.c命令详解cp(copy)1、作用:复制指定的文件/目录2、用法:

cpfile1file2 ==>将file1复制一份,并命名为file2cpdir1/dir2/-r ==>将dir1/递归地复制一份,并命名为dir2/命令详解rm(remove)1、作用:删除指定的文件/目录2、用法:

rmfile ==>删除文件filermdir/-r ==>递归地删除目录dir/命令详解

mv(move)1、作用:将一个指定的文件/目录移动到另一个地方给一个文件/目录重命名2、用法:

mvfiledir/ ==>将文件file移动到dir/中

mvfile1file2 ==>将文件file1,重命名为file2mvdir1/dir2/ ==>将目录dir1/,重命名为dir2/(dir2/当前不存在)

mvdir1/dir2/ ==>将目录dir1/移动到dir2/中(dir2/当前已存在)注:当mv的第二个参数是一个合法的已存在的目录时,那么就是移动,否则就是重命名。命令详解cat/more/less1、作用:显示文本文件内容/分屏显示文件内容2、用法:catfilemorefilelessfilehead/tail1、作用:查看一个文件的开头/结尾的若干行2、用法:

headfile-n10==>查看文件file的头10行

tailfile-n20==>查看文件file的末20行命令详解find1、作用:查找文件2、用法:

finddir/-name"xxx"==>在dir/查找名字为xxx的文件

finddir/-name"*.c"==>在dir/查找后缀名是.c的文件grep1、作用:查找字符串2、用法:

grep"apple"dir/-Hrnw==>在dir/中,递归地(r)按照全字匹配(w)查找"apple"这个字符串,并且找到之后打印出其所在文件名字(H)以及行号(n)命令详解tar1、作用:解压、压缩2、用法:

tarczvfexample.tar.gzfile1file2dir1/dir2/ ==>将file1file2dir1/dir2/统统按照gzip格式压缩成example.tar.gztar-tfexample.tar.gz ==>查看压缩包example.tar.gz中有哪些文件

tarxzvfexample.tar.gz ==>将example.tar.gz中的文件解压到当前目录

tarxzvfexample.tar.gz-Cdir ==>将example.tar.gz中的文件解压到dir/注:将以上命令中的'z'改成'j',那就是针对bzip2格式的命令,bzip2格式的压缩包的后缀是:

example.tar.bz2tarcjvfexample.tar.bz2file1file2dir1/dir2/命令详解man(manual)1、作用:对相应的条目查找帮助2、用法:

manls ==>查找关于ls的默认的帮助条目

man-fread ==>列出所有关于read的帮助手册

man3posixread ==>查找在第三册手册中的关于read的帮助信息注:下载完整的man帮助文档

sudoapt-getinstallmanpages-posixmanpages-posix-devmanpages-dev命令详解1、在家目录中新建一个目录,名为学号_姓名2、切换到新建的目录(学号_姓名)中3、新建文件名为姓名.c(touch姓名.c)4、将姓名.c拷贝到/usr中5、切换到/usr中6、更改名字为:学号.c7、将学号.c拷贝到新建的目录(学号_姓名)8、将目录(学号_姓名)中的姓名.c和学号.c压缩为学号.tar.gz9、将学号.tar.gz拷贝到共享文件夹/mnt/hgfs/share中,进行解压。10、配置IP为192.168.班级.xx,xx为学号最好两位,192033101为,192033201为。作业1、目录结构2、常用命令cd,ls,mkdir,touch,cp,rm,mv,cat/more/less,head/tail,find,grep,echo,tar,man3、思政:《道德经》“天下难事必做于易,天下大事必做于细”。再难的事,也要从容易开始;再大的事,也要从细处着手。Linux系统是个大的工程,包含很多功能,它为了实现整个系统功能,首先按需求分类,然后在各个分类下再细化具体实现,采用分而治之、模块化的思想设计了满足需求的各种命令。蚂蚁精神。蚂蚁具有永不放弃、竭尽所能、团结协作的精神。

Linux命令通常只实现单一功能,但绝大多数命令会提供设置选项,以此尽可能满足用户各种需求。首先从容易的事情做起,理解Linux命令,当需要实现复杂功能时,对不同命令进行组合,合力实现所需功能。

总结THANKYOU!1、mkdir

101_cw2、cd

101_cw3、touch

cw.c4、cp

cw.c

/usr5、cd

/usr6、mv

cw.c

192033100.c7、cp

192033100.c

~/101_cw8、tar

czvf

192033100.tar.gz

cw.c

192033100.c9、cp192033100.tar.gz/mnt/hgfs

tarxzvf192033100.tar.gz编辑器vi编译链接器gcc调试器gdb项目管理器makeLinux下C语言编程基础重点内容02PARTTWOvi、gcc、gdb

文本编辑器vi使用

gcc编译器gdb调试器作业vi是Linux系统的第一个全屏幕交互式编辑器。vi有3种工作模式,分别是命令行模式、插入模式、底行模式。命令行模式:最初进入的一般模式,该模式下可以移动光标进行浏览,整行删除,但无法编辑文字。插入模式:只有在该模式下,用户才能进行文字的编辑输入,用户可以使用[ESC]键回到命令行模式。底行模式:该模式下,光标位于屏幕底行,用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号。文本编辑器vi使用1.vihello.c2.键入i进入插入模式3.编辑自己的程序4.键入[Esc]退回到命令行模式5.键入:wq保存退出文本编辑器vi使用命令行模式插入模式底行模式输入i/a/o按下Esc输入:wq回车:q!

命令行模式功能键:yy:复制当前光标所在行[n]yy:n为数字,复制当前光标开始的n行p:粘贴复制的内容到光标所在行dd:删除当前光标所在行[n]dd:删除当前光标所在行开始的n行/name:查找光标之后的名为“name”的字符串G:

光标移动到文件尾(注意是大写)u: 取消前一个动作(注意是小写)文本编辑器vi使用底行模式功能键::w 保存:q 退出vi(系统会提示保存修改):q! 强行退出(对修改不做保存):wq 保存后退出:w[filename]另存为filename的文件:setnu 显示行号:setnonu 取消行号文本编辑器vi使用Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作之一。gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%~30%。GCC编译器能将C、C++语言源程序、汇编程序编译、链接成可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。使用GCC编译程序时,编译过程可以被细分为四个阶段:(1)预处理(Pre-Processing):对头文件、宏定义展开.i(2)编译(Compiling):检查代码规范性、语法,无误后翻译成汇编语句.s(3)汇编(Assembling):将汇编文件(.S)转化为目标文件(.o).o(4)链接(Linking):动态链接、静态链接成二进制可执行文件gcc编译器hello.c(二进制)可执行文件gcc通过后缀来区别输入文件的类别:gcc编译器.c为后缀的文件C语言源代码文件.a为后缀的文件由目标文件构成的库文件.C,.cc或.cxx为后缀的文件C++源代码文件.h为后缀的文件头文件.i为后缀的文件已经预处理过的C源代码文件.ii为后缀的文件已经预处理过的C++源代码文件.o为后缀的文件编译后的目标文件.s为后缀的文件汇编语言源代码文件.S为后缀的文件经过预编译的汇编语言源代码文件。gcc编译器操作1:a.c内容如下#include<stdio.h>intmain(void){ printf(Helloworld!\n); return0;}编译和运行这段程序:gcca.c-ohello./a输出:Helloworld!gcc编译器gcc最基本的用法是∶

gcc[options]filenameoptions:编译器所需要的编译选项,编译选项约有100多个,只介绍常用的参数filenames:要编译的文件名。(1)-ooutput_filename:确定可执行文件的名称output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out。(演示)(2)-c:只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。(3)-g:产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。gcc编译器的基本用法#include<stdio.h>intmain(void){

doublecounter; doubleresult; doubletemp; for(counter=0;counter<2000.0*2000.0*2000.0/20.0+2020; counter+=(5-1)/4){ temp=counter/1979; result=counter; } printf(“Resultis%lf\n”,result); return0;}(4)-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。(5)-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。操作2(optimize.c)gccoptimize.c-ooptimizetime./optimizegcc–Ooptimize.c-ooptimizetime./optimize对比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善gcc编译器的基本用法(6)-Idirname:将dirname所指出的目录加入到程序头文件目录列表中。#include<A.h>#include“B.h”

对于<>,预处理程序cpp在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对于””,cpp在当前目录中搜寻头文件。此选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定dirname目录中去寻找。例:gccfoo.c–I/home/include-ofoogcc编译器的基本用法(7)-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。(8)-lname:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为libm.a”的数学函数库。例:gcctest.c-L/home/lib–lfoo-otestgcc编译器的基本用法操作3,演示-Idirname,-Ldirname,-lname。

gcc编译器的基本用法main.ca.cgcc-ca.carrcsvlibmylib.aa.ogccmain.c–omain–I./include–L./lib-lmylib(9)-static:静态链接库文件例:gcc–statichello.c-ohello

库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 例如:libhello.solibhello.a。当使用静态库时,连接器找出程序所需的函数,然后将它们拷贝到可执行文件,一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样,动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库。演示:静态链接与动态链接可执行文件大小比较。gcca.c–oagcc–statica.c–oals-lllgcc编译器的基本用法(10)-Wall:生成所有警告信息(11)-w:不生成任何警告信息(12)-DMACRO:定义MACRO宏,等效于在程序中使用#defineMACROgcc编译器的基本用法简介GDB是GNU发布的一款功能强大的程序调试工具。GDB主要完成下面三个方面的功能:1、启动被调试程序。2、让被调试的程序在指定的位置停住。3、当程序被停住时,可以检查程序状态(如变量值)。gdb调试器操作1:vitest.c#include<stdio.h>voidmain(){ inti; longresult=0; for(i=1;i<=100;i++) { result+=i; } printf("result=%d\n",result);}gdb调试器gcc-gtest.c-otest//编译生成可执行文件gdbtest //启动GDBlist//查看程序breakmain//在main函数处设置断点run//运行程序next //单步运行continue //继续运行q//退出gdbGDB命令启动GDB(1)gdb调试程序名

例:gdbhelloworld(2)gdb file调试程序名list(l)查看程序break(b)函数名

在某函数入口处添加断点break(b)行号

在指定行添加断点break(b)文件名:行号

在指定文件的指定行添加断点break(b)行号if条件

当条件为真时,指定行号处断点生效.gdb调试器例b5ifi=10 当i等于10时第5行断点生效infobreak 查看所有设置的断点delete断点编号

删除断点run(r) 开始运行程序next(n) 单步运行程序(不进入子函数)step(s) 单步运行程序(进入子函数)continue(c) 继续运行程序print(p)变量名

查看指定变量值finish 运行程序,直到当前函数结束watch变量名

对指定变量进行监控quit(q) 退出gdb操作2gdbfiletestl //bmain //b8 //btest.c:10 //b8ifi=10 //infob //d1 //d2 //d4 //gdb调试器runprintinextnnprintiprintresultstepb3continueqTHANKYOU!总结与作业总结1、vim的使用(命令行模式、插入模式、底行模式)2、gcc的使用(gccxxx.c–oxxx)3、gdb的使用作业1、使用vi新建姓名.c,此源程序功能实现打印输出姓名和学号。2、对姓名.c进行编译3、执行查看结果Mian.c主程序main函数调用其他.c里面的函数main.cadc.cdiaplay.ciic.csub.cdiv.c…..Gccmax.c–omax.o–cGccmin.c–omin.o–c…Gccmain.omax.o…div.o-omain采用make管理器make03PARTTHEREmake工程管理器系统论哲学思想,系统论认为,系统是一个由若干要素以一定结构组成并具有某种功能的有机整体。运用系统论,就要从整体出发分析系统结构,理清系统构成的要素以及要素与要素、结构与要素之间的相互关系,以此确定系统在整体上达到最优的方案。

Linux软件工程通常包含多个功能文件,在构建工程目标时,就要理清目标文件与源文件之间、目标文件与目标文件之间的依赖关系,并将这种相互依赖的关系集中体现在Makefile文件中,交由工程管理器管理。make概述Makefile语法及执行Makefile变量总结与作业make工程管理器GNUmake是一种代码维护工具;make工具会根据Makefile文件定义的规则和步骤完成整个软件项目的代码维护工作;一般用来简化编译工作,可以极大地提高软件开发的效率;Windows下一般由集成环境自动生成;Linux下需要由自己按照语法编写;make是个命令,是个可执行程序,用来解析Makefile文件的命令,此命令存放在/usr/bin中;Makefile是个文件,此文件中描述了程序的编译规则,执行make命令时,make命令会在当前目录中找Makefile文件,根据Makefile文件里的规则编译程序;Makefile的好处

简化编译程序时输入的命令,编译时只需要输入make;

节省编译时间,提高编译效率make概述Makefile语法及执行(1)目标:是要产生的文件名称,目标可以使可执行文件、其他obj文件或动作的名称(2)依赖文件:用来输入从而产生目标的文件,一个目标通常有几个依赖文件(可以没有)(3)命令:make执行的动作,一个规则可以含有几个命令(可以没有),多个命令时,每个命令占一行。(4)make命令,名字不为Makefile或makefile,使用:make–f文件名目标:依赖文件列表<tab>命令列表Makefile语法及执行例题1:main.cmain.hmain.cmain.hmakefileC语言有很多函数(scanf/printf/…)/usr/include“”Makefile语法及执行操作1:main.chead.hsub.csum.cmain.cmakefilehead.hsum.csub.cMakefile语法及执行操作1:main.chead.hsub.csum.c,编写Makefile文件。Makefile运行结果Makefile变量变量作用:保存文件名列表、文件目录列表、编译器名、编译参数、编译输出。可以是目标体、依赖文件、命令以及Makefile文件中其他部分。分类: 1、自定义变量 2、预定义变量和自动变量main:main.o

sub.o

sum.o

gcc

main.o

sub.o

sum.o-omain思考1:如果需要添加一个依赖,例如div.o,该如何修改???Makefile变量自定义变量:大小写区分、在Makefile头部定义,几乎可在任何地方使用。

(1)定义变量变量名=变量值

CC=gcc

(2)引用变量$(变量名)或${变量名}$(CC)gcc操作2:详见Makefile2文件Makefile变量预定义变量和自动变量预定义变量含义预定义变量含义自动变量含义AR库文件维护程序的名称,默认值为arARFLAGS库文件维护程序的选项$@目标文件的完整名称AS汇编程序的名称,默认值为asASFLAGS汇编程序的选项$<依赖文件列表中的第一个依赖文件名称CCC编译器的名称,默认值为ccCFLAGSC编译器的选项$^所有不重复的依赖文件,空格分开CPPC预编译器的名称,默认值为$(CC)–ECPPFLAGSC预编译器选项CXXC++编译器的名称,默认值为g++CXXFLAGSC++编译器的选项FCFortran编译器的名称,默认值为f77FFLAGSFortran编译器的选项RM文件删除程序的名称,默认值为rm-f操作3:详见Makefile3和Makefile4(精简版)1、Makefile语法结构

目标:依赖 <tab>命令2、变量:自定义变量,预定义变量、自动变量见Makefile4OBJCCCFLAGS$^$@$<3、思政:

《孟子》“不以规矩,不能成方圆”。 《孟子·告子上》“大匠诲人必以规矩,学者亦必以规矩”。

这些案例说明规则是人们达到目标所必须遵守的准则,利用规则约束行为,树立价值标准,让世界井然有序。

工程中的Makefile包含着一条条的规则,这是make进行处理的依据,执行make时就是按照其中的规则去编译和链接程序的。

总结作业1:编写main.cfun.cmakefile要求:fun.c文件中编写max函数求出两个数的最大值,并返回。main.c文件中,通过scanf函数获得输入的两个数,接着调用fun.c文件中的max函数求得最大值,最后通过printf打印最大值。makefile文件,最终生成可执行文件名为姓名的首字母。作业作业2:编写main.cmax.cmin.cmakefile要求:max.c文件中编写max_fun函数求出两个数的最大值,并返回。min.c文件中编写min_fun函数求出两个数的最小值,并返回。main.c文件中,通过scanf函数获得输入的四个数,调用max.c文件中的max_fun函数求得最大值,用min.c文件中的min_fun函数求得最小值,最后通过printf打印大值,小值。makefile文件,最终生成可执行文件名为姓名的首字母。作业作业3:编写main.cmax.cmin.cadd.csub.cmakefile要求:max.c文件中编写max_fun函数求出两个数的最大值,并返回。min.c文件中编写min_fun函数求出两个数的最小值,并返回。add.c文件中编写add_fun函数求出两个数的和,并返回。sub.c文件中编写min_fun函数求出两个数的差,并返回。main.c文件中,通过scanf函数获得输入的四个数,调用max.c文件中的max_fun函数求得最大值,用min.c文件中的min_fun函数求得最小值,add_fun求和,sub_fun求差,最后通过printf打印大值,小值,和,差。makefile文件,最终生成可执行文件名为姓名的首字母_学号。作业THANKYOU!04PARTFOUR开发环境搭建Vmwaretools安装设置共享文件夹vim安装g++和make的安装TFTP服务安装NFS服务安装交叉编译器安装作业1342安装Vmwaretools安装make和交叉编译安装tftp服务设置共享文件夹THANKYOU!嵌入式系统原理与应用电子与电气工程学院第三章文件I/O编程教师:程蔚文件I/O编程CONTENTS01.系统调用文件访问02.标准I/O文件访问03.S5P6818文件操作实例01PARTONE系统调用文件访问任务实现:在广告屏上显示“中华人民共和国成立75周年”宣传图Linux中文件编程可以使用两种方法:Linux系统调用:依赖于Linux系统C语言库函数:与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。文件编程在数字世界中,文件不仅是数据的载体,更是信息安全的前线,掌握文件操作就像是通往打开数字宝库的钥匙,而Linux下一切皆文件,文件操作尤其重要。

系统调用创建文件(creat)filename:要创建的文件名(包含路径,缺省为当前路径)mode:创建模式,常见创建模式有S_IRUSR 可读4S_IWUSR 可写2S_IXUSR 可执行1S_IRWXU 可读可写可执行7intcreat(constchar*filename, mode_tmode)系统调用access功能:判断文件是否可以进行某种操作(读,写,存在等)pathname:文件名称mode:要判断的访问权限。可以取以下值或者是他们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK:文件存在。返回值:当测试成功时,函数返回0,否则如果一个条件不符时,返回-1。intaccess(constchar*pathname,intmode)系统调用打开文件(open)pathname:要打开的文件名(包含路径,缺省为当前路径)flags:打开标志mode:被打开文件的权限返回值:成功为文件描述符,失败为-1intopen(constchar*pathname,intflags)intopen(constchar*pathname,intflags,mode_tmode)系统调用关闭文件(close)fd:文件描述符返回值:成功为0,失败为-1intclose(intfd)操作3.1:open_count.c操作3.2:access_creat.c系统调用read功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中。fd:文件描述符buf:读出数据的缓冲区length:读出的字节数返回值:成功为实际读取的字节数,到达文件结尾为0,失败为-1。intread(intfd,constvoid*buf,size_tlength)系统调用write功能:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。fd:文件描述符buf:写入数据的缓冲区length:写入数据的字节数返回值:成功已写的字节数,失败为-1intwrite(intfd,constvoid*buf,size_tlength)操作3.3:my_copy.c系统调用lseek功能:将文件读写指针相对whence移动offset个字节。fd:文件描述符offset:偏移量,负(向前移),正(向后移)whence:相对位置SEEK_SET:当前位置为文件的开头 SEEK_CUR:当前位置为文件指针的位置 SEEK_END:当前位置为文件的结尾返回值:成功为文件的当前位移,失败为-1intlseek(intfd,offset_toffset,intwhence)操作3.4:read_wav.c1、open、close、read、write、creat、lseek、access2、作业3、思政:在数字世界中,文件不仅是数据的载体,更是信息安全的前线,掌握文件操作就像是通往打开数字宝库的钥匙。

总结与作业THANKYOU!02PARTTWO标准I/O文件访问标准I/O打开文件(fopen)path:要打开的文件名(包含路径,缺省为当前路径)mode:文件打开的状态返回值:成功为文件指针,失败为NULLFILE*fopen(constchar*path,constchar*mode)标准I/O关闭文件(fclose)stream:已打开的文件指针返回值:成功为0,失败为EOFintfclose(FILE*stream)标准I/O错误处理s:在标准错误流上输出的信息返回值:无voidperror(constchar*s);errnum:错误码返回值:错误码对应的错误信息char*strerror(interrnum);标准I/O文件定位stream:需要定位的文件指针offset:相对于基准值的偏移量whence:基准值,SEEK_SET:文件起始位置SEEK_CUR:文件当前读写位置SEEK_END:文件结束位置返回值:成功为0,失败为EOF。intfseek(FILE*stream,longoffset,intwhence);标准I/O文件定位stream:需要定位的文件指针返回值:成功为当前读写位置,失败为EOF。longftell(FILE*stream);标准I/O(指定大小进行读写)文件读ptr:存放读入记录的缓冲区size:读取的记录大小nmemb:读取的记录数stream:要读取的文件流返回值:成功为返回实际读取到的nmemb数目

失败为EOF。size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream)标准I/O(指定大小进行读写)文件写ptr:存放写入记录的缓冲区size:写入的记录大小nmemb:写入的记录数stream:要写入的文件流返回值:成功为返回实际写入的nmemb数目

失败为EOF。size_tfwrite(void*ptr,size_tsize,size_tnmemb,FILE*stream)操作3.5:fread_fwrite.c标准I/O(按字符(字节)输入/输出)文件读写stream:要输入的文件流返回值:成功为下一个字节

失败为EOF。intgetc(FILE*stream)intfgetc(FILE*stream)intgetchar(void)标准I/O(按字符(字节)输入/输出)文件读写c:需要写的内容stream:要写入的文件流返回值:成功为字符

失败为EOF。intputc(intc,FILE*stream)intfputc(intc,FILE*stream)intputchar(intc)操作3.6:fgetc_fputc.c标准I/O(按行输入/输出)文件读写s:要输出的字符串stream:对应的文件流返回值:成功为s;失败为NULL。intputs(constchar*s)intfputs(constchar*s,FILE*stream)操作3.7:fgets_fputs.cchar*gets(char*s)charfgets(char*s,intsize,FILE*stream)s:要输入的字符串size:输入的字符串长度stream:对应的文件流返回值:成功为s,失败为NULL。1、fopen、fclose、fread、fwrite、fseek、fgetc/fputc、fgets/fputs2、作业3、思政:

总结与作业THANKYOU!03PARTTHERES5P6818文件操作实例S5P6818显示图片原理在Linux中,一切皆文件,LCD显示屏对应的设备文件为/dev/fb0。如果想让LCD显示屏显示颜色,就是把颜色写入到LCD显示屏对应的设备文件中,查看LCD设备文件相关信息。[root@GEC6818/IOT]#ls-l/dev/fb0crw-rw1rootroot29,0Jan11970/dev/fb0颜色基于RGB模型,即红、绿、蓝,其范围是[0,255],每种颜色分量都占一个字节。LCD显示屏显示接收的颜色信息是aRGB,a为透明度,一般为0,总共4个字节,正好是int类型数据。如果要显示红色,可以定义一个变量等于0x00ff0000,绿色为0x0000ff00,蓝色为0x000000ff。10寸LCD显示屏的大小为1024*600,7寸LCD显示屏的大小为800*480,写入顺序是从左到右,从上到下。图片的格式有很多,比如bmp、png、gif、jpg等。bmp格式图片包含54字节的bmp格式的文件头和像素值,其像素值以BGR形式排列,每一个像素占有3字节。S5P6818显示图片操作3.8:bmp.c编译运行结果[root@GEC6818/IOT]#rxbmp[root@GEC6818/IOT]#

chmod777bmp[root@GEC6818/IOT]#./bmpcw@dell:/mnt/hgfs/share/day1_io$arm-none-linux-gnueabi-gccbmp.c-obmpS5P6818获取坐标值操作3.9:ts.c编译运行结果cw@dell:/mnt/hgfs/share/day1_io$arm-none-linux-gnueabi-gccts.c-ots[root@GEC6818/IOT]#rxts[root@GEC6818/IOT]#

chmod777ts[root@GEC6818/IOT]#./ts(132,418)[root@GEC6818/IOT]#./ts(103,519)1、编写程序实现自动播放显示图片,时间间隔可以设置为1s。2、编写程序实现点击LCD屏幕左边显示一张图片,点击右边显示另一张图片。作业THANKYOU!嵌入式系统原理与应用电子与电气工程学院第四章进程与线程教师:程蔚进程与线程CONTENTS01.进程02.进程间通信03.多线程01PARTONE进程进程简介进程创建和退出wait()和waitpid()

exec函数族进程1、什么是进程进程是一个程序的执行过程,是动态的,包括动态创建、调度、消亡整个过程。资源分配的最小单元。程序是静态的,是一些保存在磁盘上的指令的有序集合,没有任何执行的概念。2、进程的标识进程号(PID,ProcessIdentityNumber):进程的标识,获取当前进程的PID的函数是getpid()。父进程号(PPID,ParentProcessIdentityNumber),获取父进程号为getppid()。进程简介进程简介演示:process.c3、父进程和子进程进程A创建进程B,那进程A就是进程B的父进程,进程B是进程A的子进程。所有进程都是由它的父进程创建出来的,init是所有进程的祖先。4、进程如何被中止进程的中止可以分为两种:正常终止和异常中止正常终止: 1.main函数调用return返回,终止进程。 2.库函数exit终止进程 3.系统调用_exit或者_Exit终止进程。异常中止: 1.调用abort函数终止进程 2.被信号终止进程简介5、进程空间在Linux系统中,进程的用户空间是独立的,相互不影响的;一个进程不能读取或者修改另一个进程的数据,只这样提高了安全性和稳定性。

新进程被创建出来后,便是一个独立的进程,拥有自己独立的进程空间,拥有自己唯一的进程号(PID)、拥有自己独立的PCB(进程控制块),新进程会被内核同等调度执行,参与到系统调用中。进程简介6、进程的生命周期创建、就绪、运行(执行)、等待(阻塞)、退出(终止或者结束)主要由进程调度完成进程状态转换进程简介进程的创建和退出1、进程的创建#include<unistd.h>pid_tfork(void)返回值:成功:0或者大于0的整数

失败:-1注意:当一个进程调用fork()成功后,fork()在父子两个进程中都会返回,父进程返回值子进程的PID;子进程返回0。操作4.1:fork_sample.c进程的创建和退出2、进程的退出:exit和_exit函数exit和_exit都是C语言标准库中的函数,用于终止程序的执行#include<stdlib.h>voidexit(intstatus);参数:status进程终止的状态,零这表示正常终止。

如果status为非零,这表示进程异常终止。intatexit(void(*)(void));这个函数会注册一个函数,该函数会在程序正常终止时被调用。进程的创建和退出2、进程的退出exit和_exit函数exit和_exit都是C语言标准库中的函数,用于终止程序的执行#include<unistd.h>void_exit(intstatus)参数:status进程终止的状态。 _exit函数则立即终止程序,不会执行任何清理操作,也不会关闭打开的流或释放动态分配的内存。exit函数最后会调用_exit函数来终止程序。进程的创建和退出2、进程的退出-

exit和_exit函数操作4.5:exit.c等待子进程退出wait()和waitpid()子进程的状态变化:1.子进程终止2.子进程因为收到停止信号而停止运行。(SIGSTOP、SIGSTP)3.子进程在停止状态下因为收到恢复信号而恢复运行。(SIGCONT)父进程监视子进程进程退出时会关闭所有文件描述符,释放在用户空间分配的内存,但是进程控制块PCB会暂时保留,里面存放退出状态。比如一个进程正常退出,进程控制块PCB里就存放进程的退出状态(退出码);如果是异常退出,那么进程控制块PCB里存放导致该进程终止的信号进程等待等待子进程退出wait()和waitpid()1.确保时序问题:子进程先退出,父进程再退出2.资源回收,防止内存泄露的问题进程等待的必要性wait()函数waitpid()函数进程等待的方式等待子进程退出wait()和waitpid()status:子进程退出状态;pid:<-1

表示等待进程组ID等于pid绝对值的任何子进程。-1 表示等待任何子进程。0 表示等待任何子进程,其进程组ID等于调用进程的进程组ID。

>0 表示等待子进程ID等于pid的值。options:

WNOHANG

没有子进程退出立即返回(非阻塞等待)#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);等待子进程退出wait()和waitpid()头文件#include<sys/types.h>和<sys/wait.h>1.pid_twait(int*status)用于使父进程阻塞,直到一个子进程结束或该进程接到了一个指定的信号为止。参数:status用于存放子进程终止时候的状态信息返回值:成功返回终止的子进程号。失败返回-12.pid_twaitpid(pid_tpidint*status,intoption)等待指定pid的进程,可以是非阻塞的。参数:pid用于表示需要等待的某个具体的子进程 status用于存放子进程终止时候的状态信息 option是一个选项标志,用于控制waitpid()的行为。返回值:成功返回终止的子进程号。失败返回-1等待子进程退出wait()和waitpid()status:子进程退出状态;WIFEXITED(status):子进程正常退出,此宏为真WEXITSTATUS(status):子进程正常退出,获取子进程的退出值WIFSIGNALED(status):子进程被信号杀死,此宏为真WTERMSIG(status):子进程被信号杀死,获取导致子进程死亡的信号WCOREDUMP(status):子进程被信号杀死或生成核心存储文件,此宏为真WIFSTOPPED(status):子进程被信号暂停,options=WUNTRACED,此宏为真WSTOPSIG(status):WIFSTOPPED(status)为真,获取导致子进程暂停的信号值WIFCONTINUED(status):子进程被SIGCONT重置,此宏为真等待子进程退出wait()和waitpid()操作4.3:wait.c操作4.4:waitpid.cexec函数族path和file:被加载的执行的文件或脚本路径;arg:列表形式的参数;argv:数组形式的参数;envp:用户自定义的环境变量数组。#include<unistd.h>intexecl(constchar*path,constchar*arg,...);intexeclp(constchar*file,constchar*arg,...);intexecle(constchar*path,constchar*arg,...);intexecv(constchar*path,char*constargv[]);intexecvp(constchar*file,char*constargv[]);intexecvpe(constchar*file,char*constargv[],char*constenvp[]);exec函数族path和file:被加载的执行的文件或脚本路径;arg:列表形式的参数;argv:数组形式的参数;envp:用户自定义的环境变量数组。l:参数以列表(list)的方式提供v:参数以矢量(vector)数组方式提供p:利用环境变量PATH来指定可执行文件e:用户提供自定义的环境变量(environment)exec函数族1.child.c写一个main程序,传入参数为字符串数组,将传入的参数打印出来。编译程序,生成二进制可执行文件child2.exec.c写一个main函数,调用fork()创建一个子进程,在子进程中调用execl函数去执行另一个程序child。编译验证是否可以正常执行child。操作4.2:exec.cchild.c1、fork()、wait()、waitpid()、exit()/_exit()、exec函数簇2、作业

编写程序实现生成5个子进程。3、思政:

总结与作业THANKYOU!02PARTTWO进程间通信进程间通信概述无名管道、有名管道通信消息队列信号共享内存信号量进程间通信进程间通信

每个进程是操作系统中独立的执行体,彼此隔离,并具有自己的生命周期。为了合作完成指定任务,进程之间也需要进行数据交互和同步。Linux系统通过不同方式实现进程间通信和同步。不同的方式适用于不同的场合,用户可根据实际需要选择合适的进程间通信和同步机制。进程间的通信方式:管道通信、信号、内存共享、消息队列、信号量、套接字管道通信管道通信管道是Linux系统中进程间的半双工通信方式。如果进程A和进程B通过管道连接起来,那么数据就能够通过管道由进程A流向进程B,或者由进程B流向进程A。管道是单向的、先进先出的。管道通信的类型:无名管道:用于父进程和子进程间的通信有名管道:可用于运行于同一系统中的任意两个进程间的通信管道的创建所需头文件#include<unistd.h>函数原型intpipe(intpipefd[2]);函数传入值pipefd[2]:管道的两个文件描述符,pipefd[0]用于管道的读端,pipefd[1]用于管道的写端。函数返回值成功:0失败:-1所需头文件#include<sys/types.h>#include<sys/stat.h>函数原型intmkfifo(constchar*pathname,mode_tmode);函数传入值pathname:要创建的管道,创建之前不能存在mode:管道的访问权限,如0666函数返回值成功:0失败:-1无名管道有名管道管道通信管道的关闭关闭管道只需将这两个文件描述符关闭即可,可以使用普通的close函数逐个关闭。操作4.6:pipe.c操作4.7:w_fifo.cr_fifo.c消息队列管道只能传输无格式的字节流,会给应用程序开发带来不便,而消息队列克服了此缺点。消息队列就是一个消息的链表,可以把消息看作一个具有特定格式的记录。进程可以从消息队列中添加消息,另一些进程则可以从消息队列中读取消息。消息结构体必须自己定义,但必须按照系统的要求定义,消息结构体如下:structmsgbuf{ longmsgtype;//消息类型,必须是long型 charname[SIZE];//消息正文};消息队列消息

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论