当前位置: 首页 > news >正文

Linux学习笔记1-入门

前言:之前的基于单片机的闭环控制步进电机项目其实已经完成了,但很多时间都花在调试和生产上,实在没时间去做总结笔记,现在又开始做新项目了,从单片机到了Linux,想用这个平台来督促自己继续学习,所以新开一章。之前的单片机项目应该还是会补全的。


Linux到底是什么?
我之前只是听过,并没有深入学习过Linux,我之前会以为它是一个和单片机同级别的概念,现在发现是大错特错且很业余。我现在理解的相关概念是这样的。

- Linux是一个操作系统(OS),和Windows, MACOS, Android, IOS是同级别的概念
- Linux和Android是完全开源的,甚至Android的底层是Linux,但其他几种OS都不是
- 单片机可以说是CPU的一种,之前学习的STM32又是单片机的一种
- 操作系统是运行在CPU之上,例如Windows运行在Intel的CPU上,MACOS运行在苹果的M系列芯片上,IOS运行在A系列芯片上
- Linux操作系统可以运行在很多个CPU上,例如NXP的I.MX6UL(这也是我开发板使用的CPU)
- 之前单片机也学习到了FreeRTOS,是一种轻量化的操作系统,如果需要网络,文件系统,GUI等需要开发者自行移植
- 如果要学习一个功能完善的操作系统,Linux是非常合适的选择
- Linux的多任务管理、存储管理、设备管理、文件管理和网络,都是单片机缺少或者不那么强大的功能

我选择从搞明白Makefile开始Linux的学习

之前学习单片机的时候是有IDE这个东西的,最开始的Keil,后来的Clion,都是很出色的单片机IDE。我们只需要在IDE上写代码,它可以帮我们自动补全代码,加上HAL库CubeMX的支持,单片机的开发难度大大降低。

在Linux中就没有CubeMX这样的神器,至少目前没有,所以系统的初始化需要自己写代码完成。

最重要的是,IDE给我们提供了编译链接的功能,它使我们甚至都不知道编译这件事情的存在,只要点击一个按钮,IDE就会自动给我生成**.hex或者.bin**文件让我们烧写到单片机里。(当然是编译没有错误的情况)

Linux的嵌入式编程情况不太一样:

  • 首先Linux的可执行文件必须在Linux系统中编译,一般是在Windows中用虚拟机建一个Ubuntu系统下使用命令行来做编译和链接(Ubuntu系统和MACOS非常像)
  • 在开发项目的时候,可以先在Windows下的IDE进行代码编写,之后使用FTP(FileZilla)传输到虚拟机中,基于命令行和gcc编译器进行编译、链接
  • 还有种方法是在Ubuntu下直接使用图形化的IDE工具,例如VSCode来做代码编写工具,而且也能进行简单的编译,亲测功能和Windows版本的VSCode基本一致
  • 我看很多文章都说源文件很多的情况下用VSCode编译会有问题,但我目前还没有碰到,用VSCode编译存在的问题用命令行gcc编译一样也会跳出来,可能目前用的源文件还是不够多吧?
    等等,什么是编译?什么又是链接?至少我是一直没有明确概念。

编译是将源文件(C, C++, python等等)转换成中间代码文件,中间代码文件在Windows中是**.obj文件**,在Linux中是**.o文件**,即ObjectFile;编译器需要的是语法的正确,函数与变量声明的正确;
由于一个工程里包含的源文件很多,所以编译得到的ObjectFile也会很多,所以把大量的ObjectFile合成执行文件的动作叫做链接(Link)。链接器会在所有中间文件中找寻函数的实现,如果找不到会报链接错误码。

好了,从这里进入Makefile是一个比较好的时机。上面说了,每一个源文件都需要编译成中间文件,我们当然可以使用合适的IDE实现傻瓜操作,但也可以自己写makefile来证明具备完成大型工程的能力。

makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

接下来详细的学习Makefile
(未完待续)

http://www.lryc.cn/news/214893.html

相关文章:

  • 怎样更有效的运营Etsy店铺?
  • Vue 项目中如何使用Bootstrap5(简单易懂)
  • k8s 资源预留
  • 微信小程序自定义弹窗阻止滑动冒泡catchtouchmove之后弹窗内部内容无法滑动
  • Linux 命令速查
  • 第22期 | GPTSecurity周报
  • JavaScript前端 console 控制台详细解析与代码实例
  • idea中启动多例项目配置
  • Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉
  • Android 默认关闭自动旋转屏幕功能
  • 软文推广方案,媒介盒子分享
  • CSDN热榜分析6:将实时爬取的热榜数据导入sqlite
  • 2023年11月1日,Google全新域名来袭:.ing域名现已问世!
  • 【设计模式】第22节:行为型模式之“状态模式”
  • JavaSE21——ArrayList
  • 找质数(枚举 埃氏筛 线性筛)
  • 第十二章 ObjectScript 系统标志和限定符 (qspec) - 标志
  • 解决Windows Server 2012 由于没有远程桌面授权服务器可以提供需求可证
  • 上位机底部栏 UI如何设置
  • MySQL表的增删改查(基础)
  • uniapp书写顶部选项卡代码详细例子
  • 注册中心ZK、nameServer、eureka、Nacos介绍与对比
  • 杂志详情。
  • 前端知识与基础应用#2
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)
  • 硬件加速器及其深度神经网络模型的性能指标理解
  • 嵌入式每日500(4)231104 (Flash类型定义、Flash常量定义、Flash函数)
  • 21款奔驰GLC300L升级23P驾驶辅助 出行更加的安全
  • 【小黑嵌入式系统第七课】PSoC® 5LP 开发套件(CY8CKIT-050B )——PSoC® 5LP主芯片、I/O系统、GPIO控制LED流水灯的实现
  • 深度学习简史