自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 Linux文件系统解析

文件系统定义在计算机出现之前其实就有文件系统的概念了,此时的文件系统指的是用于管理(存储和检索)纸质文件的系统,而在计算机发明之后,文件系统逐渐指的是管理存储介质的系统,它通过简单的接口给用户,方便用户使用存储设备。在学习 Linux 的时候,我们通常会看到这样一句话,Linux中一切皆文件,也就是说,不管是普通的文件和目录,还是包括块设备、管道、socket等,也都是交给文件系统去管理的。文件系统是操作系统中负责管理持久数据的子系统,换言之,也就是负责把用户的文件存到磁盘硬件中,它是一个磁盘上的目录结

2021-06-06 16:17:17 337

原创 程序是如何在 CPU 中运行的(二)

前言在上一篇文章中《程序是如何在 CPU 中运行的(一)》笔者讲述了程序中一条一条指令以及一条一条数据是如何在 CPU 中运行的,在本文笔者将以 ARM Cortex M3 的内核为背景分析指令是如何有序的执行。寄存器组介绍为了更好地介绍指令是如何在 ARM Cortex M3 内核中运行的,在这里先介绍一下 ARM Cortex M3 的寄存器组,引用 ARM Cortex M3 权威指南的一张图,图片如下:如上图所示,寄存器组主要包含四种类型的寄存器,分别是:通用寄存器:用于数据操作

2020-05-12 10:47:46 1020 1

原创 union 的概念及在嵌入式编程中的应用

union 概念union 在中文的叫法中又被称为共用体,联合或者联合体,它定义的方式与 struct 是相同的,但是意义却与 struct 完全不同,下面是 union 的定义格式:union 共用体名{ 成员列表}共用体变量名;那么它与结构体的定义方式相同,那么区别是什么呢,下面通过一个 struct 与 union 的嵌套来说明两者的区别所在。struct my_struct...

2020-04-15 23:21:49 923 1

原创 STM32 内存分配解析及变量的存储位置

内存映射在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。然后在对于RAM紧缺的嵌入式系统中,是缺少MMU内存管理单元的。因此在一些嵌入式系统中,比如常用的STM32来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。STM32 的 Flash 和 RAM 地...

2020-04-09 00:41:54 9105 8

原创 C 语言跳转表的实现及在嵌入式设备中的应用

跳转表的概念沿用笔者在 Wikipedia 上看到的关于跳转表的概念,In computer programming, a branch table or jump table is a method of transferring program control (branching) to another part of a program (or a different program...

2020-04-02 21:17:14 695 5

原创 C语言如何实现继承及容器

继承的概念继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义,追加属性和方法。面向对象中的重要概念就是类,在我们熟知的编程语言 C++ 、Python 中都存在类的概念,通过现有的类从而继承得到新的类。但是对于 C 语言来讲,其中并不存在类的概念,那又如何实现继承呢 ?C 语言继承的实现笔者了解到 C 语言实现继承...

2020-03-31 21:49:16 1526 1

原创 ZSWatch 开源项目介绍

今天要介绍的开源项目是 ZSWatch。ZSWatch 基于 Zephyr 操作系统而制作,因此,也被称之为 Zephyr Smatwatch,简称为 ZSWatch。该项目的软件和硬件都是开源的。

2024-06-27 22:37:26 408

原创 keil 分散加载文件(scatter file)分析

keil分散加载分析

2022-09-13 22:10:27 2672 1

原创 单链表知识详解

定义在学习数据结构的时候,最开始接触到的一种数据结构就是线性表,对于线性表的定义是:零个或多个数据元素的有限序列,那对于线性表来讲,又分为顺序存储结构和链式存储结构,对于顺序存储结构来说,也就是数组,数组的每个元素之间的地址是连续的;对于链式存储来说,也就是平常所说的链表,链表每个元素之间的地址并不是连续的,而是分散的,他们之间的联系通过结点的 next 指针来建立。本文尽可能地将链表的知识详细地叙述,所涉及的链表类型包括:单链表,双链表,循环链表,每个链表的操作涉及到创建链表,删除链表,插入链表结点,删

2021-07-28 10:42:41 736

原创 TCP 和 UDP 的区别及流量控制、拥塞控制,快重传,快恢复算法详解

UDP 和 TCP 的区别在上一则文章中,对 TCP 的三次握手建立连接和四次挥手释放连接进行了详细地阐述,本节教程针对于 TCP 的其他内容进行讲解,首先是同处于传输层协议的UDP协议,这两者有什么区别与联系呢?相同点那就是说:UDP 和 TCP 是 TCP/IP 体系结构运输层中的两个重要协议,下图是TCP/IP的体系结构图:额外补充的一点就是说,在 TCP和 UDP 协议下层的IP协议,IP协议可以为各种网络应用提供服务,使用IP层协议互连不同的网络接口,下面是一个结构图:TCP和UDP的

2021-07-28 00:07:09 1531

原创 Linux进程通信之管道解析

概述管道是 UNIX系统 IPC的最古老的形式,所有的UNIX系统都提供此种通信。所谓的管道,也就是内核里面的一串缓存,从管道的一段写入的数据,实际上是缓存在内核中的,令一端读取,也就是从内核中读取这段数据。对于管道传输的数据是无格式的流且大小受限。对于管道来说,也分为匿名管道和命名管道,其中命名管道也被叫做 FIFO,下面则分别阐述这两种管道。匿名管道默认情况下,在 Shell命令执行过程中,任何一个命令都有一个标准输入设备(键盘)、标准输出设备(显示器)和标准输出设备(显示器),使用管道"|"可以

2021-07-06 19:39:11 285 1

原创 TCP “三次报文握手,四次报文挥手”详解

TCP 的基本认识TCP 中文又被称之为传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。这个特性的解释如下:面向连接的:面向连接也就是说一对一才能连接。可靠的:无论网络中出现了什么变化,TCP都能保证一个报文一定能够到达接收端字节流:消息是没有边界的,所以无论消息有多大都可以进行传输学习过网络的朋友就知道,对于一个协议来说,往往会分成多个层,层与层之间解耦,对于 TCP 传输控制层协议来讲,它也是这样的,下面是 TCP 协议的一个结构示意图:可以看到,TCP 的应用层

2021-07-05 20:36:52 5142 13

原创 Linux 进程控制解析

引言在上一则发表的关于 Linux 的文章中,叙述了 Linux 的相关概念,其中就包括进程的资源,进程的状态,以及进程的属性等相关内容,在本则教程中,将着重叙述 Linux 进程管理的内容,其中就包括 Linux 进程的创建,进程的终止,进程的等待相关内容。Linux 进程的创建函数 fork现有的一个进程可以调用 fork 函数创建一个新进程:#include <unistd.h>pid_t fork(void);/* 返回值:子进程返回 0,父进程返回子进程 ID;若出错,

2021-06-28 19:51:34 212

原创 Linux进程概述

进程的概念进程是 Linux 事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源。进程的环境由当前系统状态及其父进程信息决定和组成,将某个可执行文件加载到内存中运行,那么就会演变成一个或者是多个进程。(产生多个进程的原因是进程在运行的时候可以再创建新的进程,但是加载的时候只有一个进程),为了更好的理解进程,以我们平时在 Linux 环境下运行一个 C 程序为例进行说明:代码很简单,hello world:#include <stdio.h>int main(void)

2021-06-20 10:28:30 311

原创 适合具备 C 语言基础的 C++ 入门教程(十五)

前言在上一则教程中,叙述了当处于多线程环境下时,智能指针所指向的引用计数可能会因为此导致引用计数出问题,因此,引入了原子操作的相关概念,换句话说,这种操作也被称之为是轻量级指针,那对于这种轻量型指针又会存在什么问题呢?本节内容将着重叙述这个问题。另外需要注意的是,关于最近几次的内容互相之间都是息息相关的,需要结合上下文进行理解,同时,因为涉及到的代码比较多,如果哪里没有说明白的地方,需要下载对应的源代码进行对照分析。好了,接下来,进入本次内容的分享。强指针在说明强指针这个概念之前,我们先从代码的角度慢

2021-03-13 15:15:35 265

原创 适合具备 C 语言基础的 C++ 入门教程(十四)

前言在上一则教程中,我们引入了智能指针的相关概念,并详细地说明了智能指针的用法,而且我们也对智能指针进行了一些完善,使其更加具备普适性,在前一则教程中,我们也提到了说虽然已经完善了很多,但是仍然存在着问题,这个问题是什么呢?我们本节教程将着重叙述这个内容。多线程下存在的问题在讲述多线程下存在的问题之前,我们需要了解一下在一个系统中,当要对一个变量进行操作的时候,需要经历哪些步骤,步骤如下:由上述示意图可知,如果要进行 count++,那么这个时候要进行读入,+1,写入三个操作。而正是因为这个操作,

2021-03-07 14:31:22 246

原创 STM32 在 keil 环境下如何使用 cm_backtrace进行错误追踪

引言我们在平常使用STM32单片机的时候,往往会碰到程序跑飞的情况,出现hard_fulat等错误,而我们在定位错误的时候,采用的方法往往是连上仿真器,一步一步单步调试,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这样一个过程很是痛苦,而且在实际情况中,很多产品真机调试时必须断开仿真器或者说,问题确实存在,但是极难出现,所以在基于这样一个问题背景下,RTT 的大佬armink开发了一个基于 ARM Cortex-M系列的 MCU错误追踪库,用于帮助开发者解决上述问题。CmBacktrace 的作

2021-03-06 13:40:06 2145 1

原创 适合具备 C 语言基础的 C++ 入门教程(十三)

前言无论是在C还是C++中,指针都是在使用的时候需要非常谨慎的一个点,而在C++中,我们引入一个智能指针的概念,以此来规避在使用指针时可能出现的问题。智能指针的引入我们以之前的一个程序为例子,也就是Person类,如下是Person类的代码:class Person { public: Person() { cout <<"Pserson()"<<endl; } ~Person() { cout << "~Person()"

2021-03-02 19:06:40 283

原创 适合具备 C 语言基础的 C++ 入门教程(十二)

引言在前面的教程中,叙述了模板函数以及模板类的相关概念,在本节教程中,笔者将着重叙述 C++中的异常机制,所谓异常,是程序在执行期间产生的问题,异常提供一种转移程序控制权的方式。而且异常处理主要涉及到三个关键字:try、catch、throw,下面将对异常这个概念进行详细叙述。异常的引入为什么要引入异常这个机制呢,假设有如下一个调用关系:A ----> B ----> C那如果说是,C函数中出现了一个问题,那要将这个问题找到,就需要在 C函数里返回一个值,然后根据这个值一级一级地向上

2021-02-28 16:10:45 269

原创 适合具备 C 语言基础的 C++ 入门教程(十一)

前言在上一则教程中,着重叙述了抽象类界面以及函数模板的相关内容,在本节教程中,笔者将详细阐述函数模板重载的概念,将从具体的实例中阐述函数模板重载要注意的内容。函数模板重载函数重载是在教程最开始就阐述过的概念,那么函数模板重载又该如何理解呢,我们以上一节教程中比大小的函数模板为背景,具体阐述函数模板重载的概念,代码如下所示:template<typename T>const T& mymax(const T& a, const T& b){ cout<&

2021-02-26 10:45:34 273

原创 适合具备 C 语言基础的 C++ 入门教程(十)

前言在上一则教程中,叙述了抽象类以及动态链接库的相关内容,本节来叙述一下抽象类界面的相关内容,以及本节即将引入一个新的概念,模板。抽象类界面何为抽象类界面呢?要说清楚这个概念,需要回顾上一则教程中所述的类编程和应用编程两个概念,为了实现应用编程和类编程,引入了动态链接库的概念,要达到的效果就是当更改类的代码的时候,而不更改应用程序的代码的时候,只需要重新生成动态链接库,而不需要重新生成可执行文件。那么我们回顾之前的代码,看应用编程里面的内容,也就是主函数里面的内容:#include "Human.h

2021-02-24 23:14:04 467

原创 适合具备 C 语言基础的 C++ 入门教程(九)

前言在上一则教程中,叙述了关于C++类型转换的相关内容,在本节教程中,将叙述 C++的另一个内容,也就是抽象,这也是 C++相对于 C语言来说独特的一点,下面我们就来着重叙述这一点。纯虚函数在介绍抽象类之前,需要弄明白何为纯虚函数,下面假定我们有这样一个需求:做一个“各个国家的人的调查”,调查各个国家的人的:饮食、穿衣、开车要完成这样一个事情,那我们现在就需要实现这样几个类,一个是 Human类,其他国家的人从 Human类里派生而来,就比如说是Chinese和Englishman,我们再回过

2021-02-24 16:58:48 276

原创 适合具备 C 语言基础的 C++ 入门教程(八)

前言在前一则教程中,我们阐述了多态的相关概念,其中就包括实现多态所必须的虚函数,以及使用多态这个性质时一些限制的内容,本节教程将着重讲解 C++中的类型转换问题,其中就包括:dynamic_cast、static_cast、reinterpret_cast以及const_cast。C语言的类型转换隐式类型转换我们在使用C语言进行编程的时候,时常会涉及到类型转换的问题,我们首先就隐式的类型转换进行阐述,话不多说,我们来看一段代码:#include <stdio.h>int main(

2021-02-22 14:43:16 409

原创 适合具备 C 语言基础的 C++ 入门教程(七)

前言在前面的教程中,阐述了继承的相关内容,其中就包括继承之后数据成员的访问控制以及多重继承,虚拟继承等内容,本节的内容即将阐述另外一个面向对象的特性:多态,多态是面向对象编程三大特性之一。定义如何通俗的话来解释多态呢?我们印出来这样一个例子:首先,我们说:人类用手吃饭是本能,而英国人是用刀叉吃饭,中国人则是用筷子吃饭,那现在有一个问题了,当我们问这个人是怎么吃饭的,就不能简单地回答说用筷子或者是用刀叉吃饭,应该根据其所在地国别不同而采用不同的吃饭方式,这就是多态。代码实现上述用通俗的话解释了一下,

2021-02-21 11:05:13 355

原创 适合具备 C 语言基础的 C++ 入门教程(六)

前言再上一则教程中,着重讲述了派生类继承于父类之后的一些访问控制,在本次教程中,将介绍如下几个点:派生类扩展父类功能,派生类的空间分布,以及多重继承的相关概念。派生类扩展父类的功能在前文所述的 Father类我们通常也称之为父类或者说称之为基类,而 Son类我们则称之为子类或者是派生类,我们知道通过public继承的方式Son类可以继承到父类的 it_skill,那么我们可不可以将这个继承得到的 it_skill发扬光大呢?实际上是可以的,用更加专业的话来讲就是覆写,也就是 override,代码如下

2021-02-20 10:08:06 317 4

原创 适合具备 C 语言基础的 C++ 入门教程(五)

前言在上述教程中,我们已经完成了 C++相对于 C语言来说独特的语法部分,在接下来的教程中,我们将叙述 C++中面向对象的语法特性。我们在学习面向对象的这种编程方法的时候,常常会听到这三个词,封装、继承、派生,这也是面向对象编程的三大特性,在本节我们将依次阐述封装、继承、派生的具体用法,在这里,我们先叙述的是封装这个属性的的相关内容。下图是关于 封装 这个特性所包含的一些内容。封装下图就是封装所具备的相关特性:那么上图所示的抽象出数据成员以及成员函数具体的含义是什么呢,正如前面教程所述,在前面的教

2021-02-12 20:58:53 325 1

原创 适合具备 C 语言基础的 C++ 入门教程(四)

前言在上一则教程中,我们讲述了重载运算符中前 ++和后++的重载函数的实现,阐述了在 C++中可以将运算符进行重载的方法,这种方法大大地便利了程序员编写代码,在接下来地叙述中,我们将着重讲述运算发重载时地一些更为细致地内容,其中就包括当重载地运算符返回值为引用和非引用两种状态时,代码执行效率地高低以及采用在类内实现运算符重载函数的方法。返回值为引用和非引用的区别在上述所示的类当中,增加一部分代码,加入析构函数以及拷贝构造函数,代码如下所示:class Point{private: int x;

2021-02-11 09:05:47 283

原创 适合具备 C 语言基础的 C++ 入门教程(三)

前言在上一则教程中,着重地阐述了构造函数以及析构函数地相关概念,这也是C++中非常重要地两个概念之一。在今天地教程中,笔者将继续叙述 C++相对于 C语言来说不同的点,将详细叙述命名空间,静态成员,友元函数以及运算符重载这几个知识点。C++ 命名空间命名空间的存在是为了区分不同库的相同的函数名,用一个简单的例子来说明这个问题就是在 windows的文件系统中,不同文件夹下可以有相同名字的文件,相同文件夹下因为这相同文件处在不同的范围内,用 C++ 说白了也就是处在不同的命名空间中。文件系统的一个结构图

2021-02-10 09:42:42 320 1

原创 适合具备 C 语言基础的 C++ 入门教程(二)

前言在上一则教程中,通过与 C 语言相比较引出了 C++ 的相关特性,其中就包括函数重载,引用,this 指针,以及在脱离 IDE 编写 C++ 程序时,所要用到的 Makefile的相关语法。本节所要叙述的是 C++的另外两个重要的特性,也就是构造函数和析构函数的相关内容,这两部分内容也是有别于 c语言而存在的,也是 c++的一个重要特性。构造函数类的构造函数是类的一种特殊的成员函数,它会在每次创建新的对象的时候执行,构造函数的名称和类的名称是完全相同的,并不会返回任何的类型,也不会返回 void。

2021-02-09 10:44:51 334

原创 适合具备 C 语言基础的 C++ 入门教程(一)

引言C 语言通常被认为是一种面向过程的语言,因为其本身的特性更容易编写面向过程的代码,当然也不排除使用 C 语言编写面向过程的代码,比如 Linux 的源代码以及现在很火的国产物联网操作系统 RT-Thread,其内核的实现方式都是使用 C 语言实现的面向对象的代码。相比于 C 语言来说,C++ 更能够实现面向对象的程序设计,其具有的特性也要比 C 语言要多的多。下面假设有这样一个需求。现要描述两个人的信息,姓名,职业,年龄,并输出。我们首先先使用 C 语言的设计思路实现这个功能。C语言描述

2021-02-08 14:31:35 976 2

翻译 卡尔曼滤波入门教程————概述

概述关于这份教程卡尔曼滤波是一个简单的话题。然而,许多教程却不是那么好去理解。大多数的教程需要深厚的数学背景从而导致了它非常难以理解。与此同时,大多数的教程也缺乏一个实际的例子。我之前决定去写一份基于实际例子并且提供简单且直观的解释的教程。许多例子是从雷达的领域而来的,这也是卡尔曼滤波用的最广泛的地方,主要是用在目标跟踪上,然而,这里介绍的原则可以应用于任何需要进行估计和预测的领域。这份教程包含三部分:第一部分:介绍了卡尔曼滤波,这部分是基于 8 个数值例子。在这份教程里并不需要有一个好的数学

2020-12-25 14:06:21 775

原创 LwIP 协议栈之 udp 协议解析

前言之前在做一个关于数据传输的时候,使用到了 WiFi 传输数据,而在传输数据时使用到的协议就是 LwIP 协议栈中的 udp 协议。现在来回顾总结一下。要叙述 LwIP 协议栈,那自然得明白 LwIP 协议栈具体是个啥。总的来说,LwIP 是 TCP/IP 协议中一种独立、简单的实现,其设计目的在于保证嵌入式产品拥有完整 TCP/IP 功能的同时,又能够保证协议栈对处理器资源的有效消耗,其运行一般仅需要几十 KB 的 RAM 和 40KB 左右的 ROM。上述所说便是关于 LwIP 协议栈的相关叙述。那

2020-12-23 09:36:29 4376

原创 WiFi 的起源、发展、信道划分及网络结构解析

Wi-Fi 的发源地Wi-Fi 的发源地是夏威夷,Wi-Fi 是一种无线局域网协议。而对于网络协议中的多址接入协议的历史可以追述到 1971 年的 ALOHAnet,按照 WiKi 的记录,ALOHAnet 是一个在夏威夷大学开发的一个无线网络,为什么要构建这个无线网络,是因为夏威夷岛屿之间不易布置有线链路,如果布置的话,其成本也会很高。所以当时就采用了一种相对成本比较低廉的无线设备,构造一个以 Oahu 岛为中心和其他夏威夷岛屿通信的无线链路。这也就是 Wi-Fi 最开始的雏形。Wi-Fi 的定义及发

2020-11-15 15:04:06 1741 2

原创 lvgl 库 V7版本相关应用

笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~前言在使用 lvgl 库的时候,笔者使用的 V7 版本的库,使用过程中发现网上关于 V7 版本的资料非常少,官网有文档介绍其如何使用,但有些方面还不是很全面,而且网上现在的中文教程大多数是针对于 V6 版本的,V6 和 V7 使用上的差异在有些方面还是挺大的,所以笔者也就想把自己在使用 V7 版本的库的时候的一些心得记录下来,这篇文章不能覆盖全面,只是笔者就最近几天所使用到的 lvgl V7 版本的一部分功能的一.

2020-11-09 19:01:29 1219

原创 野火指南者开发板移植 lvgl 库

前言由于近期要做一个装置 ,想着把装置做的好看一点,就打算使用 GUI 来做一个信息的相关显示,之前听说过一款比较轻量级的图形库,也就是 lvgl,手头又正好有一块搭配屏幕的野火指南者开发板,单片机型号是 STM32F103VET6,Flash 为 512KB,RAM 为 64KB,屏幕为 3.2 寸电阻触摸屏,我们在来看一下运行 lvgl 这个 GUI 需要的资源,所需资源如下图所示:几个比较关键的就是控制器的主频需要大于 16 MHz,对于 STM32F103来说,主频可以达到 72MHz,满足要

2020-11-05 12:35:52 3999 15

原创 C 语言编程习惯总结

笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~引言编程习惯的培养需要的是一个长期的过程,需要不断地总结,积累,并且我们需要从意识上认识其重要性,一个良好的编程习惯对于我们能力的提高也是由巨大的帮助的。下面是笔者在阅读《专业嵌入式软件开发》这本书时所看到的一些关于编程好习惯的总结,特此记录和分享一下、判断失败而非成功下面是一段简化过后的代码片段:if (physap_alarm_init() == RV_SUCC){ if (trx_alarm_.

2020-10-29 20:05:35 352

原创 RTOS 中采样任务的设计

引言在现实生活中,大多数我们所接触到的信号都是一种模拟信号,电压、电流、声音信号等。我们在嵌入式开发过程中,有时候会涉及到模拟信号的采集,在采集过程中,为了更好地还原出信号原本的样子,有这个一个采样定理,被称之为 Nyquist 采样定理,采样定理的内容是这样的:要从采样信号中不失真地恢复原始信号,那么采样频率应该大于原始信号最高频率的两倍,所以在编写程序中,我们为了能够从采样信号中不失真的恢复出原始信号,那么我们必须设置合适的采样率,下面笔者将不同地角度阐述几种确定采样率的方法,也就是确定采样周期。使

2020-09-27 15:57:23 642

原创 C++ 内联函数的相关概念

C++ 内联函数的概念介绍内联函数之前,需要说明一下 C ++ 在执行普通函数时的一个过程,在调用普通函数时,执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳转到标记函数起点的内存单元,执行函数代码,然后调回到地址被保存的指令处,下图是关于 C ++ 普通函数调用的一个示意图:...

2020-09-27 10:46:11 577

原创 RTOS 是如何进行任务划分的?

任务的相关概念任务的定义在嵌入式开发中,面对的都是单个 CPU 的情况,而在这个开发过程中,我们会涉及到裸机开发或者是跑操作系统的开发,在裸机开发的过程中,整个系统是以模块的角度来看的,也就是系统在运行完了这个模块之后,再去运行另外一个模块。当时在有操作系统的情况下,我们是把系统处理的一件一件事情也任务的角度来进行划分的,这任务与任务之间是并发执行的。每个任务的运行看起来是独立的,从宏观的角度看是多个任务同时在占据着 CPU 的执行,就像是多 CPU 一样,在真正的多 CPU 系统中,每个 CPU 都有

2020-09-12 13:25:15 954 1

原创 STM32F103如何实现 FFT?

引言数字信号在我们生活中随处可见,自然而然地就会涉及到对于数字信号的处理,最为典型的一个应用就是示波器,在使用示波器的过程当中,我们会通过示波器测量到信号的频率以及幅值,同时我们也可以通过示波器对测量到的信号进行 FFT ,从而能够观察到待测信号的频谱,方便直观的看出信号的高频分量和低频分量,从而帮助我们去除信号中携带的噪声。而在嵌入式方面的应用,我们可以直接使用 DSP 芯片对信号进行处理,同时, ARM 公司推出的 Cortex-M4F 内核是带有 FPU ,DSP 和 SIMD 单元的,针对于这些单

2020-09-05 20:46:02 16767 22

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除