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_threadpthread_join(voiceThread,NULL);pthread_join(socketThread,NULL);pthread_join(fireThread,NULL);//pthread_join(voice_DianPing,NULL);return 0;
}

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

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

Linux底下一切皆文件

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

欢迎大家的点赞关注

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python练习题(二)

📑前言 本文主要是【Python】——Python练习题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&am…

如何将x和y利用torch转换成小批量数据,打乱数据、标准化或者归一化?

1、如何将x和y利用torch转换成小批量数据,打乱数据、标准化或者归一化? 方法1 将数据转换为小批量数据可以使用PyTorch中的DataLoader类,该类可以自动将数据按照批次划分,并且支持对数据进行随机打乱。下面是一个示例&#xff1…

[传智杯 #5 初赛] A-莲子的软件工程学

题目背景 在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。 对于一名理科生来说,各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么一些函数。 题目描述 具体而言&a…

CF1714C Minimum Varied Number

Minimum Varied Number 题面翻译 题目描述 找出数码和为 s s s 的最小数字,使得其中的所有数字都是不同的(即所有数字都是唯一的)。 例如,如果 s 20 s20 s20 ,那么答案是 389 389 389。这是最小的数字&#xf…

量子光学的进步:光子学的“下一件小事”

量子光学是量子力学和光学交叉领域中发展迅速的一门学科,探索光的基本特性及其与物质在量子水平上的相互作用。通过利用光的独特特性,量子光学为通信、计算、密码学和传感等各个学科的变革性进步铺平了道路。 如今,量子光学领域的研究人员和工…

C++调用GPIB驱动头文件ni488.h内容详细分拆解

ni488.h是一个C语言库文件,用于使用NI-488.2通信协议进行控制和通信,主要包括以下内容: 宏定义:定义了许多常量、变量和函数的宏,如NI488_VERSION、NI488_REN_ADDRESS、NI488_UNL_ADDRESS等。 数据类型定义&#xff1…

C++基础 -33- 单目运算符重载

单目运算符重载格式 a和a通过形参确定 data1 operator() {this->a;return *this; }data1 operator(int) {data1 temp*this;this->a;return temp; }举例使用单目运算符重载 #include "iostream"using namespace std;class data1 {public :int a;data1(int…

【技术分享】RK356X Android11 以太网共享4G网络

本文基于IDO-SBC3566-V1B Android11系统实现开机后以太网自动共享4G网络功能。 IDO-SBC3566基于瑞芯微RK3566研发的一款高性能低功耗的智能主板,采用四核A55,主频高达1.8GHz,专为个人移动互联网设备和AIOT设备而设计,内置了多种功能强大的嵌…

【开源】基于Vue+SpringBoot的服装店库存管理系统

项目编号: S 052 ,文末获取源码。 \color{red}{项目编号:S052,文末获取源码。} 项目编号:S052,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

JAVA全栈开发 集合详解(day14+day15汇总)

一、数组 数组是一个容器,可以存入相同类型的多个数据元素。 数组局限性: ​ 长度固定:(添加–扩容, 删除-缩容) ​ 类型是一致的 对象数组 : int[] arr new int[5]; … Student[] arr …

Effective C++(四): 资源管理

文章目录 一、智能指针驱动的RAII二、shared_ptr 和 weak_ptr三、如何复制 RAII 对象四、在资源管理类中应该提供对原始资源的访问函数 为了防止忘记调用 delete 造成的内存泄露,我们应该尽可能让对象管理资源,并且采用 RAII 机制(Resource Acquisition …

Sql Server数据库跨机器完整恢复(源文件恢复)

问题描述 在操作系统异常的情况下,SQL Server 和相关的业务系统遭受了不可用的情况。由于操作系统问题,导致旧服务器无法正常运行。为了恢复业务功能并确保数据完整性,采取了以下步骤来在新机器上进行 SQL Server 的重新安装和数据恢复。 面…

【超全】React学习笔记 中:进阶语法与原理机制

React学习笔记 React系列笔记学习 上篇笔记地址:【超全】React学习笔记 上:基础使用与脚手架 下篇笔记地址:【超全】React学习笔记 下:路由与Redux状态管理 React进阶组件概念与使用 1. React 组件进阶导读 在掌握了 React 的基…

Verilog 入门(七)(任务、函数)

文章目录 任务任务定义任务调用 函数函数说明部分函数调用 值变转储文件 任务 一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以包含时…

actual combat 24 —— 创建数据库表定义码值字段时,tinyint类型和varchar(2)该如何选择?

tinyint:最大数值为127,占用1字节空间varchar(2):最大数值为99,占用2字节空间,但当存储的数字为个位数时varchar类型是可变的,只占用1个字节空间。 从这个角度来看的话,用tinyint类型来存储码值…

前端开发神器之 VsCode AI 辅助插件 DevChat

目录 前言DevChat介绍DevChat 独特优势注册账号安装插件设置密钥访问指令AI 解疑 最后 #AI编程助手哪家好?DevChat“真”好用 # 前言 我们都有过写代码时反复看了半天也不知道bug在哪,大大浪费了时间。一些基础的代码可能看一会儿能够解决,但…

k8s(三): 基本概念-ReplicaSet与Deployment

PeplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合,通常用来保证给定数量的、完全相同的 Pod 的可用性。 最佳实践 Deployment 是一个可以拥有 ReplicaSet 并使用声明式方式在服务器端完成对 Pod 滚动更新的对象。 尽管 Rep…

oracle sql相关语法

SQL*PLUS 在SQL*PLUS执行,会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面,鼠标右键,点击执行计划,会出现sql的执行计…

matlab 汽车单车模型固定点跟踪算法

1、内容简介 略 29-可以交流、咨询、答疑 2、内容说明 单车模型固定点跟踪算法 单车模型,固定点跟踪算法,动画演示, 汽车单车模型、转弯动画、固定点跟踪算法、pid控制 3、仿真分析 略 A[0,5;0,0];B[0;1]; Q10*eye(2);R1; Klqr(A…

Java高级技术-反射

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