P1 嵌入式开发之什么是Linux应用开发

目录

前言

01 .Linux应用与裸机编程、驱动编程之间的区别

1.1裸机编程:

1.2 驱动编程

1.3应用编程


前言

                             

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

🛸推荐专栏3: ​​​​​​《 链表_@ChenPi的博客-CSDN博客 》 ✨✨✨
🌺本篇简介  :  嵌入式Linux应用开发和裸机,驱动开发的区别

 从本章开始,我们要开始写一些关于Linux应用编程的东西了,为后面的嵌入式开发打下基础

讲嵌入式软件开发的时候,我们绕不开三个名词,不管是校园招聘,还是我在BOSS,还是当地招聘会,我总会看到三种岗位

  1. 嵌入式单片机开发工程师
  2. 嵌入式Linux应用开发工程师
  3. 嵌入式驱动工程师

本系列的话主要写关于我学习嵌入式Linux应用开发的过程及心得

然后我们来谈一谈其中的异和同吧

01 .Linux应用与裸机编程、驱动编程之间的区别


1.1裸机编程:

  1. 单片机程序是裸机程序,没有操作系统的概念
  2. 单片机程序是硬件驱动+业务逻辑的集合,
  3. 程序是整体编译一般把没有操作系统支持的编程环境称为裸机编程环境

裸机编程的硬件我用过的就是STC89C52与STM32103了

这个和Linux应用编程给我最直接的区别就是可以直接在KEIL直接编写代码和编译代码,甚至是烧录,而且裸机操作更多的操作都是操作寄存器和配置寄存器

编辑器和写Linux应用还是很大区别,我也试过用别的编辑器写裸机程序,比如微软的VS CODE,后面发现好麻烦

需要将寄存器的库配置好,还要自己写点汇编配置C语言的运行环境,之后才能用C语言写 ,

编译文件还要编写Makefile

1.2 驱动编程

  1. 驱动程序运行在内核空间
  2. 驱动程序完成的是底层硬件操作逻辑
  3. 驱动程序可编译成模块或内置到内核,但都需要依赖于内核源码进行编译

驱动开发的话我了解的还比较少, 只知道Linux 中的三大类驱动:字符设备驱动、块设备驱动和网络设备驱动,还有就是设备树了


1.3应用编程

⭐我们可以看这个图,应用层其实属于最外层的,在我们说裸机开发的时候说过,直接操作寄存器

但是到了Linux应用开发,那就不一样了,我们可以看到属于应用层的我们根本接触不到硬件,也接触不到内核,


🌺那离应用层最近的是哪个层面呢?

可以看到是shell指令和库函数以及系统调用了
所以所我们想要操作硬件,做应用开发的其实不是直接配置寄存器了

🌹那怎么写代码以及沟通硬件呢?

🛸看个小案例

比如要写一个流水灯的程序,驱动编程就是操作寄存器来点灯,而应用程序则是通过系统调用写好的点灯驱动程序来完成业务代码,点亮流水灯

 所以应用开发要的操作是使用系统调用/库函数/shell指令操作硬件,编写逻辑代码,以及利用其他根据,进行上层的开发

  1. 应用程序运行在用户空间
  2. 应用程序完成的是业务逻辑
  3. 应用程序可单独编译

 应用程序可以单独编译,指的是项目可以单独编译执行,可以同时跑很多的应用程序

 

比如我这里可以单独编译,然后网络发送给开发板,开发板能接收文件,还能同时干别的事情

//主函数
int main(int argc,char **argv){
	struct Devices *tmp=NULL;
	pthread_t voiceThread;  //语音RXTX线程
	pthread_t socketThread; //socke线程
	pthread_t fireThread;   //火灾线程
    pthread_t voice_DianPing;
    port = argv[2];    //socket 端口号
    ipAdress = argv[1];  //IP地址
    printf("%s   %s",ipAdress,port);
    if(-1 == wiringPiSetup()){   //
        printf("链接失败");
        return -1;
    }
	//1.指令工厂初始化
	commanderHead = addVoiceControlToIputCommanderLink(commanderHead);
	commanderHead = addSocketControlToIputCommanderLink(commanderHead);
	
    //2设备控制工厂初始化
    pdevicesHead = addBathroomLightToDeviceLink(pdevicesHead);
	pdevicesHead = addupstairLightToDeviceLink(pdevicesHead);
	pdevicesHead = addcanteenLightToDeviceLink(pdevicesHead);   //将厨房灯的节点加入项目的链表节点中
	pdevicesHead = addlivingroomLightToDeviceLink(pdevicesHead);
	pdevicesHead = addFireToDeviceLink(pdevicesHead);
	LED_Init();   
 
	//3线程池建立
	//3.1.1语音线程
	pthread_create(&voiceThread,NULL,voice_thread,NULL);//调用voice_thread
    //3.1.2语音线程电平模式
    //pthread_create(&voice_DianPing,NULL,voiceDianPing_thread,NULL);
	//3.2socket线程
	pthread_create(&socketThread,NULL,socket_thread,NULL);//调用socket_thread

	//3.3摄像头线程
	//3.4 火灾线程
	pthread_create(&fireThread,NULL,fire_thread,NULL);//调用fire_thread

	pthread_join(voiceThread,NULL);
	pthread_join(socketThread,NULL);
	pthread_join(fireThread,NULL);
	//pthread_join(voice_DianPing,NULL);

    return 0;
}

可以简单的看一下,这一段就是用于香橙派的代码 ,做应用编程的时候不需要配置寄存器

配置寄存器是驱动干的,记住

Linux底下一切皆文件

下一章我们讲解一下Linux的文件目录

欢迎大家的点赞关注

如果有写的不好的,可以提醒我修改,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210859.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯物联网竞赛_STM32L071_7_LORA发送接收

理论: LoRa(长距离低功耗无线射频)是利用无线电频谱中的电磁波进行通信的一种技术。它使用无线电频段中的射频信号来传输数据。电磁波是一种波动形式的能量,具有特定的频率和波长,可以传播在真空和大多数介质中&#x…

腾讯云云服务器功能与优势

腾讯云云服务器(Cloud Virtual Machine,CVM)是腾讯云提供的可扩展的计算服务。使用云服务器 CVM 避免了使用传统服务器时需要预估资源用量及前期投入的问题,帮助您在短时间内快速启动任意数量的云服务器并及时部署应用程序。 云服…

代码生成器——MyBatisX插件

MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率。 但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题,例如一些复杂的SQL,多表联查,我们就需要自己去编写代码和SQ…

Linux常见指令大全及周边知识:让你的命令行变得更加强大

文章目录 目录 文章目录 前言 一,Linux操作系统是啥? 二,Linux操作系统具有以下特点 三,指令的学习 1,指令是什么? 2,ls 指令及其常用的衍生指令: 周边知识: ls…

uniapp 微信小程序连接蓝牙卡死

解决方法,需要同意隐私保护协议,否则不能开启蓝牙权限和定位权限,会导致定位失败

C#-串口通信入门及进阶扩展

目录 一、串口相关参数介绍 1、端口(COM口) 2、波特率(Baud rate) 3、起始位 4、停止位(StopBits) 5、数据位 6、校验位 7、缓存区 二、串口通信助手 三、虚拟串口工具 四、进阶扩展 1、位运算…

五子棋AI算法自动测试方法

先前发了几篇五子棋游戏程序设计的博文,设计了游戏程序,也设计了AI智能奕棋的算法,运行程序检测算法的可行性,完成人机模式游戏功能的设置。 本文主要介绍自动测试算法的方法。 AI智能奕棋的算法testAIq( ),主要是检测…

利用段落检索和生成模型进行开放域问答12.2

利用段落检索和生成模型进行开放域问答 摘要引言2 相关工作3 方法 摘要 事实证明,开放域问答的生成模型具有竞争力,无需借助外部知识。虽然很有希望,但这种方法需要使用具有数十亿个参数的模型,而这些模型的训练和查询成本很高。…

opencv知识库:利用cv2.resize()函数进行图像缩放

引言 在numpy知识库:深入理解numpy.resize函数和数组的resize方法中,小编较为详细地探讨了numpy的resize函数背后的机理。从结果来看,numpy.resize函数并不适合对图像进行缩放操作。而opencv中的resize函数虽然和numpy的resize函数同名&…

结构体||联合体

1.结构体 1.1实际生活中一些东西往往有多个元素组成。如一名学生有身高、体重、名字、学号等。这时候就需要用到结构体。 结构体是一些值的结合,这些值被称为成员变量。结构体的每个成员可以是不同类型的变量,如:标量、数组、指针、甚至是其…

Mysql行格式(记录格式)详解

1.InnoDB行格式简介: 我们平时向表中插入数据,是以行为基本单位,这些行在磁盘上的存储方式成为行格式。在innodb中有四种行格式:Compact、Redundant、Dynamic和Compressed。 默认的行格式是Dynamic: 1.1 Compact行格式 1.1.1 …

Linux 匿名页反向映射

1. 何为反向映射 正向映射: 用户进程在申请内存时,内核并不会立刻给其分配物理内存,而是先为其分配一段虚拟地址空间,当进程访问该虚拟地址空间时,触发page fault异常,异常处理流程中会为其分配物理页面&am…

Docker部署Plik临时文件上传系统并且实现远程访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik8. 结语 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…

【Qt开发流程】之事件系统1:事件系统描述及事件发生流程

Qt的事件系统 在Qt中,事件是对象,派生自抽象的QEvent类,它表示应用程序内部发生的事情或作为应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理,但它们与小部件特别相关。以下描述了在典型应用程序中…

电子学会C/C++编程等级考试2022年03月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:拦截导弹 某国为了防御敌国的导弹袭击, 发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷: 虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天, 雷达捕捉到敌国的导弹来袭。…

Java高级技术-反射

认识反射、获取类 获取类的方法 获取类的构造器 获取类的构造器、并对其进行操作 获取构造器的作用:依然是初始化对象返回 获取成员变量 获取成员变量的方法 获取成员变量的作用:赋值、取值 获取类的成员方法 方法 作用:依然是执行 作用、…

什么是DDoS攻击

DDoS攻击 1. 定义2. DDoS攻击类型2.1 网络层攻击2.2 传输层攻击2.3 应用层攻击 3.DDoS攻击态势特点 1. 定义 分布式拒绝服务(DDoS)攻击是一种常见的网络攻击形式。攻击者利用恶意程序对一个或多个目标发起攻击,企图通过大规模互联网流量耗尽…

【Element-ui】Icon 图标与Button 按钮

文章目录 前言一、Icon 图标1.1 作用1.2 使用方法1.3 图标集合 二、Button 按钮2.1 基础用法2.2 禁用状态2.3 文字按钮2.4 图标按钮2.5 按钮组2.6 加载中2.7 不同尺寸 总结 前言 在前端开发中,界面的设计和交互是至关重要的一部分。一个直观、易用的界面往往离不开…

HarmonyOS应用开发——程序框架UIAbility、启动模式与路由跳转

前言 UIAbility简单来说就是一种包含用户界面的应用组件,用于和用户进行交互。每一个UIAbility实例,对应于一个最近任务列表中的任务。 一个应用可以有一个UIAbility,也可以有多个UIAbility。一个UIAbility可以对应于多个页面,建议…