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

news2025/6/8 20:59:07

目录

前言

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的文件目录

欢迎大家的点赞关注

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

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

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

相关文章

波奇学C++:智能指针(二):auto_ptr, unique_ptr, shared_ptr,weak_ptr

C98到C11:智能指针分为auto_ptr, unique_ptr, shared_ptr,weak_ptr,这几种智能都是为了解决指针拷贝构造和赋值的问题 auto_ptr:允许拷贝,但只保留一个指向空间的指针。 管理权转移,把拷贝对象的资源管理权转移给拷贝…

Centos7.9搭建zabbix6.4.0过程及报错注意点

搭建参考此链接即可:https://blog.csdn.net/PerDrix/article/details/129624091 报错整理: 一、zabbix6.0以上版本默认必须安装mysql 8.0.30以上版本数据库,否则服务起不来 二、编译安装zabbix时,必须执行如下操作,…

LeetCode算法题解(动态规划)|LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 题目链接:1143. 最长公共子序列 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一…

四、设置主机名和域名映射

目录 1、配置每台虚拟机主机名 2、配置每台虚拟机域名映射 1、配置每台虚拟机主机名

Unity对接后台和加载图片

1、前言 在unity中与后台对接,用await在web端暂时还不支持,所以,协程成为比较好的通用方式,以下适用除post访问外的所有对接 2、对接后台 2.1、安装插件 首先我们需要用到Newtonsoft.dll,如果没有这个.dll的请跟着我…

vue权限管理解决方案

一. 什么是权限管理 权限控制是确保用户只能访问其被授权的资源和执行其被授权的操作的重要方面。而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发 页面加载触发页面上的按钮点击触发 总体而言,权限控制可以从前端路由和视图两个…

QProcess 启动 进程 传参数 启动控制台进程 传参

目录 QProcess 启动外部程序的两种方式 依赖式 分离式: 启动进程前的预处理 设置启动路径 设置启动命令参数 设置启动工作目录 设置启动所需环境: 启动的状态 code smple: QProcess 控制台进程 QProcess启动控制台不显示窗口 注意:…

jvm基本概念,运行的原理,架构图

文章目录 JVM(1) 基本概念:(2)运行过程 今天来和大家聊聊jvm, JVM (1) 基本概念: JVM 是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作…

9.ROS的TF坐标变换(三):坐标系关系查看与一个案例

1 查看目前的坐标系变化 我们先安装功能包: sudo apt install ros-melodic-tf2-tools安装成功! 我们先启动上次的发布坐标变换的节点: liuhongweiliuhongwei-Legion-Y9000P-IRX8H:~/Desktop/final/my_catkin$ source devel/setup.bash liuho…

cyclictest 交叉编译与使用

目录 使用版本问题编译 numactl编译 cyclictest使用参考 cyclictest 主要是用于测试系统延时,进而判断系统的实时性 使用版本 rt-tests-2.6.tar.gz numactl v2.0.16 问题 编译时,需要先编译 numactl ,不然会有以下报错: arm-…

Linux:优化原则

web系统的优化原则: 从单机到集群 对Linux系统自身的优化原则:

TCP报文解析

1.端口号 标记同一台计算机上的不同进程 源端口:占2个字节,源端口和IP的作用是标记报文的返回地址。 目的端口:占2个字节,指明接收方计算机上的应用程序接口。 TCP报头中的源端口号和目的端口号同IP报头中的源IP和目的IP唯一确定一…

【QT】Windows环境下,cmake引入QML

这里使用的QT库为5.7版本。 1、添加环境变量 QT库根目录环境变量 QTDIR QT库平台插件环境变量 QT_PLUGIN_PATH QML支持环境变量 QML2_IMPORT_PATH (该环境变量仅在需要使用QML时添加) QT库动态库环境变量,bin目录下包含了QT程序运行所需的dl…

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

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

第十一届蓝桥杯青少组省赛Python中高级组真题及赏析

练习最好的办法就是实战。拿真题来做,不是解析是赏析。带着欣赏的眼光看,题目不但不难,反倒增加不少乐趣。接下来揭开第十一届蓝桥杯青少组省赛python编程题的神秘面纱,我们来一一赏析,看难不难。 选择题 选择题都比较…

C++核心编程——类与对象基础

C核心编程——类与对象基础 类与对象封装构造函数普通构造拷贝构造初始化成员列表(补充) 析构函数对象数组对象指针指向对象的指针指向对象成员的指针this指针 静态成员静态数据成员静态成员函数 友元普通函数做友元函数友元成员函数友元类 类与对象 C面…

深度学习常见回归分支算法逐步分析,各种回归之间的优缺点,适用场景,举例演示

文章目录 1、线性回归(Linear Regression)1.1 优点1.2 缺点1.3 适用场景1.4 图例说明 2、多项式回归(Polynomial Regression)2.1 优点2.2 缺点2.3 适用场景2.4 图例说明 3、决策树回归(Decision Tree Regression&#…

Linux基础命令(超全面,建议收藏!)

一、Linux的目录结构 /,根目录是最顶级的目录了 Linux只有一个顶级目录:/ 路径描述的层次关系同样使用/来表示 /home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txt 二、Linux命令基础格式 无论是什么…

孩子都能学会的FPGA:第十八课——用FPGA实现定点数的除法

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿…

vivado实现分析与收敛技巧6-策略建议

典型时序收敛策略需运行大量实现策略并选取其中最佳的策略以供在实验室内应用。 ML 策略同样可选 , 且只需您运行3 项策略即可达成类似的 QoR 收益。这些策略使用机器学习来检验布线后设计的各项功能特性 , 以便预测相同设计上不同策略的性能。在 repo…