嵌入式Linux应用开发

article/2025/11/5 12:55:52

嵌入式Linux应用开发

    • ubuntu的目录
    • 怎么设置PATH?
    • Linux的命令提示符
    • cd ~ 表示用户 家目录
    • Linux的相对路径
    • Linux的man命令
    • Linux的vi编辑器的使用
    • Linux的which和whereis命令
    • Linux的压缩命令
    • Makefile
    • 文件I/O 读写文件
    • Framebuffer应用编程
    • ASCII字符点阵显示
    • 汉字区位码
    • 输入系统框架

ubuntu的目录

在这里插入图片描述

怎么设置PATH?

在这里插入图片描述

Linux的命令提示符

在这里插入图片描述

cd ~ 表示用户 家目录

在这里插入图片描述

Linux的相对路径

在这里插入图片描述

Linux的man命令

在这里插入图片描述

Linux的vi编辑器的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Linux的which和whereis命令

在这里插入图片描述

Linux的压缩命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Makefile

Makefile的核心------规则:
目标 : 依赖1 依赖2 …
[TAB] 命令

当“目标文件”不存在

某个依赖文件比目标文件“新”,
则:执行“命令”

语法:
a. 通配符:%.o
$@ 表示目标
$< 表示第1个依赖文件
$^ 表示所有依赖文件

b. 假想目标: .PHONY

//makefile例子
test:a.o b.o c.ogcc -o test $^%.o:%.cgcc -c -o $@ $<clean:rm *.o test.PHONY:clean

c. 即时变量、延时变量,export
简单变量(即时变量):

A := xxx   #A的值即刻确定,在定义时即确定
B = xxx    #B的值使用到时才确定:=         #即时变量
=          #延时变量
?=         #延时变量,如果是第一次定义才起效,如果在前面该变量已定义则忽略这句
+=         #附加,它是即时变量还是延时变量取决于前面的定义//makefile例子
A := $(C)
B = $(C)
C = abcall:@echo A = $(A)@echo B = $(B)C += 123

Makefile函数

$(foreach var,list,text)       遍历
$(filter pattern...,text)      在text中取出符合pattern格式的值
$(filter-out pattern...,text)  在text中取出不符合pattern格式的值
$(wildcard pattern)            pattern定义了文件名的格式,wildcard取出其中存在的文件
$(patsubst pattern,replacement,$(var))    从列表中取出每一个值,如果符合pattern,则替换成replacement

改进:支持头文件依赖

gcc -M c.c  //打印出依赖
gcc -M -MF c.d c.c   //把依赖写入文件c.d
gcc -c -o c.o c.c -MD -MF c.d   //编译c.o,把依赖写进文件c.d

在这里插入图片描述

添加CFLAGS
在这里插入图片描述

// Makefile说明
本程序的Makefile分为3类:
1.顶层目录的Makefile
2.顶层目录的Makefile.build
3.各级子目录的Makefile
一、各级子目录的Makefile:
它最简单,形式如下:
EXTRA CFLAGS :=
CFLAGS_file.o :=obj-y += file.o
obj-y += subdir/“obj-y+=file.o”     表示把当前目录下的file.c编进程序里,
"obj-y+= subdir/”   表示要进入subdir这个子目录下去子找文件来编进程序里,是哪些文件由subdir目录下的Makefile决定。
"EXTRA_CFLAGS",     它给当前目录下的所有文件(不含其下的子目录)设置额外的编译选项,可以不设置
"CFLAGS_xxx.o",     它给当前目录下的xxx.c设置它自己的编译选项,可以不设置注意:
1."subdir/"中的斜杠"/"不可省略*
2.顶层Makefile中的cFLAGs在编译任意一个.c文件时都会使用
3.CFLAGS EXTRA_CFLAGS CFLAGS_xxx.o三者组成xxx.c的编译选项二、顶层目录的Makefile:它除了定义obj-y来指定根目录下要编进程序去的文件、子目录外,主要是定义工具链前缀CROSS_COMPILE,定义编译参数CFLAGS,定义链接参数LDFLAGS,这些参数就是文件中用export导出的各变量。三、顶层目录的Makefile.build:这是最复杂的部分,它的功能就是把某个目录及它的所有子目录中、需要编进程序去的文件都编译出来,打包为built-in.o详细的讲解请看视频。四、怎么使用这套Makefile:
1.把顶层Makefile,Makefile.build放入程序的顶层目录在各自子目录创建一个空白的Makefile2.确定编译哪些源文件修改顶层目录和各自子目录Makefile的obj-y:obj-y += xxx.oobj-y += yyy/这表示要编译当前目录下的xxx.c,要编译当前目录下的yyy子目录3.确定编译选项、链接选项修改顶层目录Makefile的CFLAGS,这是编译所有.c文件时都要用的编译选项;修改顶层目录Makefile的LDFLAGS,这是链接最后的应用程序时的链接选项;
修改各自字目录下的Makefile:
"EXTRA_CFLAGS",   它给当前目录下的所有文件(不含其下的子目录)设置额外的编译选项,可以不设置
"CFLAGS_xxx.o",   它给当前目录下的xxx.c设置它自己的编译选项,可以不设置4.使用哪个编译器?修改顶层目录Makefile的CROSS_COMPILE,用来指定工具链的前缀(比如arm-linux-)5.确定应用程序的名字:修改顶层目录Makefile的TARGET,这是用来指定编译出来的程序的名字6.执行"make"来编译,执行"make clean"来清除,执行"make distclean"来彻底清除

文件I/O 读写文件

文件从哪里来?

  1. 磁盘、flash、SD卡、U盘
    对于硬件上真实的文件需要挂载才能访问到,要先mount
  2. Linux提供的虚拟文件系统,也要先mount
  3. 特殊文件 /dev/xxx 设备节点

Framebuffer应用编程

在这里插入图片描述
bpp:bits per pixel 每个像素用多少位来表示它的颜色
在这里插入图片描述
首地址+offset,就可以确定这个地址在Framebuffer的哪里
在这里插入图片描述

ASCII字符点阵显示

在这里插入图片描述
实现代码

汉字区位码

HZK16里每个汉字使用32字节来描述,如下图所示:
在这里插入图片描述
跟ASCII字库一样,每个字节中每一位用来表示一个像素,位值等于1时表示对应像素被点亮,位值等于0时表示示对应像素被熄灭。

HZK16中是以GB2312编码值来查找点阵的,以“中”字为例,它的编码值是“0xd6-0xd0”,其中的0xd6表示“区码”,表示在哪一个区:第“0xd6–0xa1”区;其中的0xd0表示“位码”,表示它是这个区里的哪一个字符:第“0xd0-0xa1”个。每一个区有94汉字。区位码从0xa1而不是从0开始,是为了兼容ASCII码。

所以,我们要显示的“中”字,它的GB2312编码是d6d0,它是HZK16里第(0xd6-0xal)*94+(0xd0-0xa1)个字符。
在这里插入图片描述
程序运行的一些基础知识

  1. 编译程序时去哪找头文件?
    系统目录:就是交叉编译工具链里的某个include目录;
    也可以自己指定:编译时用“-I dir”选项指定。
  2. 链接时去哪找库文件?
    系统目录:就是交叉编译工具链里的某个lib目录;
    也可以自己指定:链接时用“-L dir”选项指定。
  3. 运行时去哪找库文件?
    系统目录:就是板子上的/lib、/usr/lib目录;
    也可以自己指定:运行程序用环境变量LD_LIBRARY_PATH指定。
  4. 运行时不需要头文件,所以头文件不用放到板子上

常见错误的解决方法
1.头文件问题
编译时找不到头文件。在程序中这样包含头文件:#include-<xxx.h>对于尖括号里的头文件,去哪里找它?
系统目录:就是交叉编译工具链里的某个include目录;
也可以自己指定:编译时用“.-I dir”选项指定。
怎么确定“系统目录”?
执行下面命令确定目录:

echo ‘main() {}’ | arm-linux-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH)。
你需要在头文件目录中确定有没有这个文件,或是自己指定头文件目录。
2.库文件问题
链接程序时如果有这样的提示:undefined-refference-to “xxx”,它表示xxx函数未定义。
那么解决方法有2:
① 去写出这个函数
② 或是使用库函数,那需要在链接时指定库
怎么指定库?想链接libabc.so,那链接时加上:-l abc。
库在哪里?
① 系统目录:就是交叉编译工具链里的某个lib目录
② 也可以自己指定:链接时用 “ -L dir ” 选项指定
怎么确定 “系统目录” ?执行下面命令确定目录:

echo ‘main() {}’ | arm-linux-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH),你编译出库文件时,可以把它放入系统库目录。
3. 运行问题
运行程序时找不到库:

error while loading shared libraries: libxxx.so:
cannot open shared object file: No such file or directorye

找不到库,库在哪?
① 系统目录:就是板子上的/lib、/usr/lib目录
② 也可以自己指定:
运行程序用环境变量LD_LIBRARY_PATH指定,执行以下的命令:

export LD_LIBRARY_PATH=/xxx_dir ;  ./test
或
LD_LIBRARY_PATH=/xxx_dir ./test

在这里插入图片描述

输入系统框架

在这里插入图片描述


http://chatgpt.dhexx.cn/article/mmKX8NQk.shtml

相关文章

【Linux学习】基础开发工具的使用

文章目录 前言一、Linux编译器 — gcc/g的使用1. gcc/g的安装2. gcc/g编译编译指令编译过程函数库 3. gcc/g编译选项 二、Linux调试器 — GDB的使用1、什么是GDB2. GDB常用调试命令 三、Linux项目自动化构建工具 — make/Makefile的使用1. make/makefile背景2. 实例3. make 的工…

Linux基础开发工具学习

文章目录 1 软件包管理工具---yum2.Linux编辑器---vimvim的基本概念vim的基本操作 3.Linux编译器---gcc/g背景知识gcc如何完成gcc选项 4.Linux调试器---gdb5.Linux项目自动化构建工具---make/makefile6. git三板斧一板斧 --- git add二板斧 --- git commit三板斧 --- git push …

linux内核开发

内核编程常常看起来像是黑魔法&#xff0c;而在亚瑟 C 克拉克的眼中&#xff0c;它八成就是了。Linux内核和它的用户空间是大不相同的&#xff1a;抛开漫不经心&#xff0c;你必须小心翼翼&#xff0c;因为你编程中的一个bug就会影响到整个系统。浮点运算做起来可不容易&#x…

linux篇(三)linux开发工具的简单使用

作者介绍&#xff1a; 关于作者&#xff1a;东条希尔薇&#xff0c;一名喜欢编程的在校大学生 主攻方向&#xff1a;c和linux 码云主页点我 作者CSDN主页地址 我们学习linux,不仅要学会它的使用&#xff0c;也要必须掌握以linux平台做c/c开发的基本方法&#xff0c;软件 本文将…

linux应用程序的开发

linux应用程序的开发 一、通过SDK开发应用程序二、通过petalinux开发linux应用程序三、通过vim开发应用程序 一、通过SDK开发应用程序 在赛灵思官网下载SDK工具后&#xff0c;安装。 1.打开SDK&#xff0c;创建linux应用程序工程 2.编写代码 3.编译代码 4.将可执行文件复制到开…

Linux 基础开发工具

一.Linux编译器-gcc/g 1. 背景知识 1.预处理&#xff08;进行宏替换&#xff09; 2.编译&#xff08;生成汇编&#xff09; 3.汇编&#xff08;生成机器科识别代码&#xff09; 4.链接&#xff08;生成可执行文件或程序&#xff09; 2. gcc 如何完成 预处理 ( 进行宏替换 ) …

linux 系统开发

4、Linux的安装&#xff08;Windows环境下&#xff09;&#xff1a; 1&#xff09;Windows环境需要借助虚拟机来安装Linux系统&#xff0c;这个推荐使用的软件是VMWare&#xff0c;官网能下载到的最新版本是Workstation Pro15.0&#xff0c;下载地址&#xff1a;https://my.vmw…

Linux基础开发工具

提示&#xff1a;本文内容较长&#xff0c;请参考左侧目录阅读 Linux基础开发工具 1.软件包管理器yum1.1 yum的基本操作1.2 关于lrzsz 2.Linux编辑器vim2.1 安装vimforcpp插件2.2 修改vim配置2.3 常见错误2.4 三种模式的转换关系2.5 正常模式指令移动光标删除文本复制替换撤销…

Linux应用开发自学之路

前言 在 「关于我 」那篇博文里&#xff0c;朋友们应该知道了我不是科班出身&#xff0c;是由机械强行转行到Linux应用开发方向。下面我就详细向大家介绍自己这一路上的转行历程&#xff0c;希望对大家有所启发。 我是学机械专业的&#xff0c;对于机械专业我还是很感兴趣&…

Linux的开发工具

文章目录 vim的介绍Linux编译器 gcc / g的使用动态库和静态库Linux调试工具 gdb的使用Linux项目自动化构建工具make 和 makefile进度条程序的编写 vim的介绍 什么是vim&#xff1f; 简而言之&#xff0c;vim就是一个文本编辑器&#xff0c;我们用来写代码的工具。 所以当最开始…

Linux开发工具

目录 一、yum工具 1.yum 背景知识 &#xff08;1&#xff09;商业生态 &#xff08;2&#xff09;开源生态 &#xff08;3&#xff09;软件生态本土化 2.yum 的基本使用 &#xff08;1&#xff09;查看软件包 &#xff08;2&#xff09;软件包名称构成 &#xff08;3&a…

【linux】linux开发工具的使用

linux开发工具的使用 一、linux软件管家-yum1.1 软件包的概念1.2 yum的使用1.2.1 查看安装包1.2.2 安装软件1.2.3 卸载软件 二、linux下的编辑器-vim2.1 插入模式下的命令2.2 命令模式下的命令2.3 底行模式的命令2.4 vim的配置 三、linux下的编译器-gcc/g3.1 预处理3.2 编译3.3…

Linux系统:开发工具

开发工具 如 Visual Studio、IDEA 这样的集编写编译调试运行以及各种复杂功能于一身的开发工具&#xff0c;叫做集成开发环境 IDE。Linux 下一般使用代码编辑工具 vi/vim&#xff0c;编译工具 gcc/g&#xff0c;调试工具 gdb。 1. 编辑工具 vim vim&#xff0c;它是一款十分强…

Linux的开发流程

嵌入式linux开发流程 在嵌入式学习的过程中&#xff0c;嵌入式linux的学习是不可少的&#xff0c;可以说嵌入式linux是学习比较困难的&#xff0c;会遇到各种各样的问题&#xff0c;那么嵌入式linux学习有一个重要的点就是嵌入式linux开发的流程&#xff0c;这是必须要知道的&a…

Linux开发速记教程之第一篇

一、Linux职业方向 ①、服务器运维&#xff1b;②、应用软件开发&#xff1b;③、设备驱动开发。 二、设备驱动开发 Linux 系统的一个重要设计哲学是一切皆文件。包括硬件设备&#xff0c;对于系统来说也是一个文件&#xff0c;所以系统向上层应用程序提供 open、 write、 re…

Linux开发工具详解

目录 前言一.Linux编辑器-vim使用1.vim的基本概念2.vim命令模式命令集3.vim底行模式命令集4.简单的vim配置 二.Linux编译器-gcc/g使用1.背景知识2.gcc如何完成a.预处理(进行宏替换)b.编译(生成汇编)c.汇编(生成机器可识别代码)d.链接(生成可执行文件或库文件)e.重要概念f.动态链…

直接跳转与间接跳转

转载自: https://www.csdn.net/tags/MtjaIg1sNDE1MDYtYmxvZwO0O0OO0O0O.htmlhttps://www.csdn.net/tags/MtjaIg1sNDE1MDYtYmxvZwO0O0OO0O0O.html 正常执行的情况下&#xff0c;指令按照它们出现的顺序一条一条地执行。跳转(jmp)指令会导致执行切换到程序中一个全新的位置。 …

Vue路由跳转传参或打开新页面跳转

1. 通过路由中的name属性 使用params传递参数, 使用this.$route.params获取参数 这种方式传递相当于post请求, 传递的数据不会显示在url地址栏,但是页面刷新,参数会丢失 1 2 3 4 5 6 7 8 9 // 传递参数 this.$router.push({ name: "首页", params: { …

Nginx 跳转

目录 一.Nginx常见模块1.http2.server3.location 二.location1.一般分为普通和正则2.location 常用的匹配规则3.location 示例4.location优先级排列说明 三.REWRITE模块1.功能2.跳转场景3.跳转实现4.执行顺序5.语法格式6.实例6.1域名跳转6.2基于客户端IP 访问跳转6.3基于旧域名…

pyqt5的页面跳转

前言&#xff1a; 正在学习python&#xff0c;学到了文件读取操作&#xff0c;想用pyqt5实现一下&#xff0c;发现我对于pyqt5还是不够了解。 现在记录一下我用pyqt5实现页面跳转的过程 方便以后查阅 pycharm使用pyqt5的话建议解释器用python3.7 由于目前我的水平还是太菜&…