linux系统怎样写单片机程序,单片机知识是Linux驱动开发的基础之一以及如何学单片机...

这是arm裸机1期加强版第1课第2、3节课程的wiki文字版。

为什么没前途也要学习单片机?

因为它是个很好的入口。

学习单片机可以让我们抛开复杂的软件结构,先掌握硬件操作,如:看原理图、芯片手册、写程序操作寄存器等。在上一节视频里,我刚把单片机贬得一无是处,说单片机没前途了,这节视频,我又要告诉你们,没有前途,也要学习单片机。为什么?

首先,我说不用学习单片机,是指不要使用老一套得学习方法学习单片机。什么叫老一套的方法?

·硬件上:不要使用C51、STM32这些专用的单片机开发板。如果以后,你不打算从事单片机开发,你用这些芯片干嘛,研究了两三个月,把这些寄存器都用清楚了,你又用不上,没必要啊。

· 软件上:不要使用Keil、MDK等集成度太高的软件。你用这些软件,你写个main()就可以了,然后调用各种库,进行傻瓜式操作。这些好用的工具,封装了很多技术细节,使得我们没法了解裸机、单片机的本质。

以后我们会使用新一套的方法来进行单片机的开发。新一套的方法,我们后面再介绍。

126526839_2_20180307113251823

我们之所以还要学习单片机,是因为它里面的知识,对我们后续学习Linux还是有用的。我们首先来看看,一个Linux系统是怎么一回事。 一个嵌入式Linux系统的软件组成: 单片机大全Bootloader–>Linux驱动–>Linux APP–>Linux GUI(Android/QT)。我们PC机一上电的时候,黑色屏幕上会显示BIOS,这个BIOS目的是去启动Windows内核。Windows内核再挂载C盘(系统盘)、D盘(应用盘),最后再去启动应用程序,像QQ、网游等。

同样的道理,我们的Android手机或者工控设备,也有BIOS,但嵌入式Linux系统里面不叫BIOS,叫Bootloader,他的目的是去启动Linux内核。 它首先也是识别应用程序所在的存储设备,挂载根文件系统(在Windows系统里面的C盘、D盘,在Linux里面称为根文件系统)。最后去启动应用程序。

126526839_3_20180307113251948

仔细的分析下Bootloader,它去启动内核,它去哪里启动内核呢? 显然是去某个地方读出内核,就比如说BIOS是去C盘上读出Windows内核,我们的Bootloader是去Flash或者SD卡读取内核。

因此Bootloader要拥有读取Flash或者SD卡的能力。有些Bootloader还要显示logo,因此还要具有操作LCD的能力。Bootloader还要设置开发板的环境,比如,初始化时钟、初始化内存、还要设置网卡等。这么多事情,都是在Bootloader里面实现的,太复杂了,如果你一来就分析整个Bootloader是非常困难的。

那我们怎么学习呢? 把他拆开,写出单独的程序,比如:LED点灯、时钟、网卡、Flash都单独写个程序来练习,这些不就是单片机程序吗?

所以说,Bootloader是单片机程序的大全。我们为了更好的学习Bootloader,我们应该事先一个一个练习硬件,当我们熟悉每个硬件后,再组合起来,就是一个Bootloader。

126526839_4_20180307113252448

我们再来看看Bootloader启动内核之后,内核再去挂载根文件系统,意味着内核也要有操作硬件的能力,这就是驱动程序。我们首先来看看一个简单的驱动程序是什么样子。首先我们的应用程序是调用open()、read()、write()这些标准的接口去访问硬件。那么就进入驱动程序里面,驱动程序里面有对应的drive_open()、drive_read()、drive_write()。

最后在驱动程序里面,去配置硬件。比如一个LED点灯驱动,那么drive_open()要把GPIO设置为输出引脚,drive_read(),返回GPIO状态,driver_write()则写GPIO,让引脚输出高电平或者低电平。

126526839_5_20180307113252605

对于我们的LED驱动程序,你需要提供drive_open()、drive_read()、drive_write()这些接口,这就是它的框架。具体的怎么操作硬件,就是硬件操作。所以说,我们事先在单片机里面,熟悉熟练的掌握硬件操作。即驱动程序的组成:

驱动程序=软件框架+硬件操作

你需要学会看原理图、看硬件怎么连接、看芯片手册、知道怎么读写寄存器。这一切都可以先在单片机里面学习,去掌握。以后学习Linux驱动时,把重点放在软件框架就行了。

我们可以事先学习单片机,单片机的学习可以让我们先抛开复杂的软件结构,先掌握硬件的操作,如:看原理图、芯片手册、写程序操作寄存器等。这就是为什么单片机没有前途,我们也要学习。是因为他里面涉及的硬件操作,对我们后续的学习,非常有用处。

现在我们知道了,我们学习单片机,不是为了掌握单片机的开发技能,而是为了掌握Bootloader,掌握硬件操作。

126526839_6_20180307113252761

单片机和Linux都想学_换个两全的方法学习单片机

本节教你如何学习单片机,如何选择合适的开发板和开发工具。

现在我们知道单片机是要学习的,那么怎么去学习单片机?在上一课我们说不要使用老一套的方法学习,实际上是指的两个问题。

第一:选择什么开发板;

第二:使用什么开发工具;

我们学习单片机的目的是干嘛?目的是为后续嵌入式Linux学习服务。在这条学习线路上:

单片机->bootloader->Linux系统/驱动->APP(QT)可以使用同一套开发板。

我们选择开发板的原则是:资料丰富。

126526839_7_20180307113252870

开发板首推三星(SAMSUNG)系列的,资料最开放,

*有S3C2440、S3C6410、S5PV210、Exynos4412;*然后是德州仪器(TI)的,TI开始不开放资料,现在逐渐公开了,有AM437X、AM335X;*然后是飞思卡尔(freescale),有iMX6;*还有其它国产芯片:全志、瑞芯微;

我们用百度进行搜索,看哪个资料最丰富。结果如下:

126526839_8_20180307113252980

再在搜索关键词中加入“教程”后,S3C2440的搜索结果比AM335X更多,因此S3C2440的资料仍是最多的,TI的营销更好,当然,TI作为工控板,其用户也是很多的。

所以,从教程的丰富程度来看,S3C2440为首选开发板;

我们后面会考虑使用TI的芯片重新录制一套视频,但需要2-3年的功夫,所以,现在还是使用S3C2440吧。

现在普遍有个错误观点:S3C2440过时了,它还是ARM9内核,现在Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15都出来了,它的性能太差了。性能差没错,但它是否过时了呢?

那要看学到的知识是否过时。

我们首先来看看一个芯片是怎么组成的,里面有CPU、外设串口、I2C、SPI、LCD等。

126526839_9_20180307113253167

我们写程序的时候,是去操作这些模块的寄存器,访问这些模块,并不是去操作CPU。等你工作的时候,你使用不同的芯片,那么差别在于这些模块,这些硬件的操作,差别不在CPU操作,你写程序的时候,根本不涉及CPU的内部机制。

**不同芯片的差别:在于外设操作,不在于CPU,写程序几乎不涉及CPU,只有涉及中断时,才会跟CPU的机制有点关系,但是不同CPU的架构差异很小,并且我们后面开发Linux驱动时,内核已经帮我们做好了这些处理,根本不需要去关心。**

从上一课我们知道,驱动=软件框架+硬件操作。这个软件框架对于所有的芯片都是一样的,因为都是用Linux内核。而这个硬件操作,你在2440上掌握了串口操作,I2C操作、SPI操作,掌握了这些硬件的语言,你换一种芯片,是完全类似的。

126526839_10_20180307113253323

我假设你选择了2440开发板,那么怎么使用2440开发板来学习单片机的开发呢?又使用什么开发工具呢?以前在Windows开发的时候,我们使用ADS、Keil、MDK等,你直接写个main()函数,所有的细节都帮你实现了,谁来调用main()函数,有他帮你做了。这main()所生成出来的代码,怎么放入到内存里面,这工具也帮你做了,我们基本上只需要写main()函数,只需要写C语言就行了。但是这里掩盖了太多的技术细节,你看看我们官网->学习路线的这篇文章,里面有个比较:

①Windows下的单片机学习,深度不够Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。

它们封装了很多技术细节,比如:

你只会从main函数开始编写代码,却不知道上电后第1条代码是怎么执行的;

你可以编写中断处理函数,但是却不知道它是怎么被调用的;

你不知道程序怎么从Flash上被读入内存;

也不知道内存是怎么划分使用的,不知道栈在哪、堆在哪;

当你想裁剪程序降低对Flash、内存的使用时,你无从下手;

当你新建一个文件时,它被自动加入到工程里,但是其中的机理你完全不懂;

②基于ARM+Linux裸机学习,可以学得更深,并且更贴合后续的Linux学习。

实际上它就是Linux下的单片机学习,只是一切更加原始:所有的代码需要你自己来编写;哪些文件加入工程,需要你自己来管理。

在工作中,我们当然倾向于使用Windows下更便利的工具,但是在学习阶段,我们更想学习到程序的本质。

一切从零编写代码、管理代码,可以让我们学习到更多知识:

你需要了解芯片的上电启动过程,知道第1条代码如何运行;

你需要掌握怎么把程序从Flash上读入内存;

需要理解内存怎么规划使用,比如栈在哪,堆在哪;

需要理解代码重定位;

需要知道中断发生后,软硬件怎么保护现场、跳到中断入口、调用中断程序、恢复现场;

你会知道,main函数不是我们编写的第1个函数;

你会知道,芯片从上电开始,程序是怎么被搬运执行的;

你会知道,函数调用过程中,参数是如何传递的;

你会知道,中断发生时,每一个寄存器的值都要小心对待;

你掌握了ARM+Linux的裸机开发,再回去看Windows下的单片机开发,会惊呼:怎么那么简单!并且你会完全明白这些工具没有向你展示的技术细节。

如果我们基于ARM+Linux,不使用这些Windows工具,你可以学得更深,并且单片机的大全Bootloader,他就是ARM+Linux开发的,他并不使用Windows下的工具。

你基于ARM+Linux学裸板、学单片机,你可以学得更多,因为我们一切都从零开始的。我们既管理这些代码,也可以知道芯片上电的时候做了什么事情,知道程序自己怎么把自己读到内存,且知道怎么去规划内存,知道怎么代码重定位……

我说的这些概念,你可能听都没听过,这是因为Windows下这些好用的工具把这些统统都给屏蔽了。

我们使用ARM+Linux进行裸板开发,一旦掌握了ARM+Linux开发这套机制,再回过头去看这些Windows工具、看STM32的话,你只需要几分钟就可以搞定。并且你可以无缝进入后续的学习,因为你已经熟练掌握了Linux的操作环境,后面的Bootloader是在Linux下开发的,后面的Linux驱动也是在Linux下开发的。

126526839_11_20180307113253448

所以我们怎么去学习单片机的开发呢?

使用S3C2440开发板,在Linux环境(Ubuntu)下使用arm-Linux-gcc工具来编译程序。你编写代码的时候,可以使用Windows下各种好用的工具,文本工具等,但编译的时候,使用arm-Linux-gcc来编译。

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

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

相关文章

bat 批处理 常用命令和乱码问题

为什么80%的码农都做不了架构师?>>> rem echo off ECHO OFF XCOPY E:\test.bat D:\ IF ERRORLEVEL 1 ECHO 文件拷贝Failure IF ERRORLEVEL 0 ECHO 文件拷贝Success :start set /p first"1记事本,2远程:" if %first% LEQ 2 (IF %first% …

SuperMap iServer发布的ArcGIS REST 地图服务如何通过ArcGIS API加载

作者:yx 文章目录 一、发布服务二、代码加载三、结果展示 一、发布服务 SuperMap iServer支持将地图发布为ArcGIS REST地图服务,您可以在发布服务时直接勾选ArcGIS REST地图服务,如下图所示: 也可以在已发布的地图服务中&#x…

new file会创建文件吗_Rust 文件系统处理之文件读写 Rust 实践指南

Rust 中,文件读写处理简单而高效。代码也很紧凑,容易阅读。我们从读取文件的字符串行、避免读取写入同一文件、使用内存映射随机访问文件这三个文件处理中的典型案例来了解一下。文件处理场景大家都很熟悉,因此闲言少叙,直接看代码…

【Maven学习笔记(二)】Maven的安装与配置

为什么80%的码农都做不了架构师&#xff1f;>>> 1、默认本地仓库路径 C:\Users\97449\.m2\repository 2、修改本地仓库路径 打开D:\apache-maven\conf\settings.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apa…

npm 全局安装vuecli报错_cnn explainer本地使用--被npm坑惨

最近在知乎上面看到&#xff0c;看到一个cnn解释器&#xff0c;把每个步揍都很清楚的展示了出来&#xff0c;我想自己搞来玩玩。第一次使用npm&#xff0c;很多地方不会&#xff0c;第一步&#xff1a;先在网页上下载下来cnn_explainer&#xff0c;然后解压在没有中文路径的文件…

Python程序从给定的N个数字中找到最大倍数

Here, we will be framing code for finding the maximum multiple of a number x from a given set of a number (set of 5 numbers in this program). 在这里&#xff0c;我们将使用成帧代码&#xff0c; 从给定的一组数字(此程序中的5个数字组成的集合)中找到x的最大倍数 。…

openmpi安装_Intel Parallel Studio XE 2019安装设置

1.Intel Parallel Studio XE 2019简介Intel Parallel Studio XE 是Intel在单独一款软件开发套件中整合了英特尔公司业界领先的 C/C 和 Fortran 编译器、性能和MPI并行库、错误检查、代码健壮和性能分析的工具&#xff0c;有助于大幅提升应用程序性能&#xff0c;同时提高代码质…

[Android] 开源View组件(一)

Material Design系列&#xff0c;自定义Behavior实现Android知乎首页 仿今日头条最强顶部导航指示器&#xff0c;支持6种模式 MagicIndicator系列之一 —— 使用MagicIndicator打造千变万化的ViewPager指示器 Android 优雅的为RecyclerView添加HeaderView和FooterView Android …

sql server修改字段编码格式_关于MySQL如何修改character_set_client的编码问题

问题引入&#xff1a;我们经常会遇到一些向MySQL数据库中插入中文&#xff0c;但是select出来的时候&#xff0c;却发现是乱码的情况。如我们向表a出入这样一段记录&#xff1a;iinsert into a values(‘你好helloworld你好’,’helloworld’);可能当你访问它的时候&#xff0c…

通用apdu指令_8086微处理器中的通用指令格式

通用apdu指令Introduction: 介绍&#xff1a; In this article, we are going to discuss about the 6 general formats of instructions. 在本文中&#xff0c;我们将讨论6种通用指令格式。 One byte instruction: 一字节指令 &#xff1a; This is only one byte long an…

Win10系统怎样让打开图片方式为照片查看器

打开注册表编辑器之后&#xff0c;我们双击左侧的目录&#xff0c;依次打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft目录&#xff0c;如下图所示。 在Microsoft目录下&#xff0c;我们需要找到Windows Photo Viewer\Capabilities\FileAssociations目录项&#xff0c;直到看到该子…

c语言插入排序算法_插入排序算法,流程图和C,C ++代码

c语言插入排序算法In the last article, we discussed about the bubble sort with algorithm, flowchart and code. In this article, we are going to discuss about another basic sorting technique i.e. insertion sort. 在上一篇文章中&#xff0c;我们讨论了用算法&…

EF使用CodeFirst方式生成数据库技巧经验

前言 EF已经发布很久了&#xff0c;也有越来越多的人在使用EF。如果你已经能够非常熟练的使用EF的功能&#xff0c;那么就不需要看了。本文意在将自己使用EF的方式记录下来备忘&#xff0c;也是为了给刚刚入门的同学一些指导。看完此文&#xff0c;你应该就学会以CodeFirst的方…

对象过滤某个属性 循环 php_37道PHP面试题(附答案)

1、什么事面向对象&#xff1f;主要特征是什么&#xff1f;面向对象是程序的一种设计方式&#xff0c;它利于提高程序的重用性&#xff0c;使程序结构更加清晰。主要特征&#xff1a;封装、继承、多态。2、SESSION 与 COOKIE的区别是什么&#xff0c;请从协议&#xff0c;产生的…

oracle   SQL执行过程

1.sql执行过程1>解析&#xff08;判断对象是否存在&#xff0c;是否有权限查询&#xff0c;语义解析&#xff0c;检查缓存中是否有相同的SQL等等&#xff09;2>优化&#xff08;CBO确定优化模式&#xff0c;确定访问路径&#xff0c;联接顺序&#xff0c;过程中通过很多综…

vue-video-player修改src就会报错_4、修改入口点代码

在riscv上电时&#xff0c;会进行CPU自检&#xff0c;然后跳转到bootloader处执行。bootloader设置好kernel的运行环境后&#xff0c;从硬盘加载kernel到内存&#xff0c;最后再跳转到kernel入口地址。我们采用的bootloader为OpenSBI&#xff0c;被加载到0x80000000地址&#x…

社交应用动态九宫格图片的规则

这里主要以微信和QQ空间为作为研究对象&#xff0c;得到的结论如下。 QQ空间里的动态 iOS设备&#xff0c;以iPhone6为分界 iPhone6及以上分辨率的设备&#xff1a; 当宽且高同时 > 512px时&#xff0c;判断 宽/高的比例值&#xff1a;大于 2时&#xff0c;以高度为基准&…

splunk中 如何隐藏input_翻糖制作中,如何避免裂缝,如何隐藏裂缝,如何防粘?...

翻糖蛋糕 因精致的样子和栩栩如生的各种造型深得人们的喜爱&#xff0c;它不仅满足了人们对蛋糕口味及装饰日益多样化的需求&#xff0c;同时也在动手制作的过程中&#xff0c;享受到美食与生活的无穷乐趣。不过裂缝&#xff0c;不平整&#xff0c;干燥对翻糖作品来说无疑是噩梦…

wpf中groupbox有什么用_展示设计中的标摊是什么 用的什么材料

经常听从事展示设计的工作人员说起标摊&#xff0c;那什么是标摊呢&#xff1f;顾名思义&#xff0c;标摊就是通用标准的国际展会摊位的缩写。但是不少人看到干巴巴的词语还是不能理解。那么这篇文章从用途、材料等方面来详细介绍标摊究竟是什么。 标摊的主要材质是什么一般来说…

ActiveX: 如何用.inf和.ocx文件生成cab文件

ActiveX: 如何用.inf和.ocx文件生成cab文件 转载于:https://www.cnblogs.com/time-is-life/p/5977962.html