自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 资源 (2)
  • 收藏
  • 关注

原创 FreeRTOS的Systick和HAL时基

防止在高优先级(优先级高于Systick) 中断服务函数中调用HAL_Delay(),导致中断服务忙等待,这样任何优先级低于该中断的中断都得不到服务(低中断不能打断高中断),当然这里包括os的全部调度。

2023-01-10 18:50:15 193

原创 函数指针和指针函数

首先我们必须明确这两种概念的写法。函数指针:int (*f)(int x, int y)指针函数:int *f(int x, int y)函数指针本质上是一个指针,其指向一个函数。指针函数本质上是一个函数,其返回值为指针。接下来,分别解释这两个概念。

2023-01-06 22:39:04 92

原创 RTOS概念及线程的引入

我们使用的Windows也是操作系统,被称为通用操作系统,使用Windows时,我们经常碰到程序卡死,停顿的现象,日常生活中这可以忍受。但是在电梯系统中,你按住开门键时如果没有即刻响应,即使只是慢个1秒,也会夹住人。在CPU的寄存器里,另一个线程也要用到CPU寄存器,所以CPU寄存器需要保存。局部变量保存在栈里,也是在内存里,只要避免栈不被破坏即可,局部变量无需保存。这种做法,在软件开发上就是使用操作系统,在单片机里叫做使用RTOS。运算的中间值需要保存吗?函数在Flash中,不会被破坏,无需保存。

2022-12-15 20:17:19 1512

原创 LWIP带操作系统的启动流程

【代码】LWIP带操作系统的启动流程。

2022-12-14 17:26:31 43

原创 内核动力之源——内存管理

在平常的编程中,大家都会遇到对动态内存的操作,例如创建一个临时数据区域,在程序的某个阶段结束后释放该区域,这就是动态内存的典型应用了。内存分配函数和内存释放函数,无论使用什么语言工具,都不可避免的为用户提供这两个配套函数,像C语言提到的malloc和free函数就是一个典型代表。那么操作系统内部是如何实现对内存的合理管理与分配的呢?在使用标准C库时,经常见到malloc和free这两个内存管理函数,

2022-12-14 17:08:07 436

原创 LwIP带操作系统的移植

LwIP是支持操作系统的,在操作系统的支持下我们可以使用LwIP提供的另外两种API编程接口编程。没有操作系统的时候,我们只能使用RAW编程,相较于其他两种API编程,RAW编程难度较大,需要用户对LwIP协议栈有较深的了解。使用操作系统之后,我们可以多任务运行,将LwIP作为任务来运行。

2022-12-12 22:09:09 440

原创 LwIP——无操作系统启动流程

目录启动流程虚拟网卡控制块发送流程接收流程 总结通过阅读正点原子的无操作系统移植工程的源码,可以总结出LwIP的无操作系统的启动流程。前面一些都是基于其他的外设的初始化,我们只关心这里lwip_comm_init(),这个函数的总流程先给出。 ethernet_mem_malloc:为描述符及缓冲区申请内存,除了这种用算法实现的内存申请函数可以申请内存之外,ST官方给出的例程是使用简单的使用数组来实现申请内存。ethernet_init:配置以太网环境、初始化RMII的IO(通过调用的HAL_E

2022-12-11 15:05:26 444

原创 LwIP——以太网描述符

发送:不需要CPU参与下,把描述符指向的缓冲区数据传输到TX FIFO当中接收:不需要CPU参与下,把RX FIFO中的数据传输到描述符指向的缓冲区当中。其中,ST把描述符分为两种:对应于在HAL库中的头文件stm32f4xx_hal_eth.h中的结构体ETH_DMAInitTypeDef{/*!

2022-12-11 14:04:50 456 1

原创 LWIP——无操作系统移植

目录移植说明LwIP前期准备 以太网DMA描述符LwIP移植流程添加网卡驱动程序添加LwIP源文件 移植头文件网卡驱动编写移植总结 LwIP的移植可以分为两大类:第一类是只移植内核核心,此时用户应用程序编写只能基于RaW/CallBack API进行;第二类是移植内核核心和上层API函数模块,此时用户可以使用所有三种API进行编程,即除了RaW/CallBack API外,还有Netconn API和Socket API。第一种移植比较简单,只需完成头文件的定义以及根据使用的具体网卡完成ethernetif

2022-12-09 22:48:16 511

原创 LWIP框架

在操作系统中,TCP/IP 协 在用户应用程序和协议栈内核之间也会保持着很明显的分层结构.在操作系统中,TCP/IP协议往往被设计为内核代码的一部分,用户可以使用的只是协议为用户提供的几个API函数, 议往往被设计为内核代码的一部分,用户可以使用的只是协议为用户提供的几个api函数,或者操作系统对网络通信函数进行了完全的封装,用户可以像操作简单文件那样来处理网络连 或者操作系统对网络通信函数进行了完全的封装,用户可以像操作简单文件那样来处理网络连接中的数据(例如常见的BSD socket)。

2022-12-08 16:23:01 582

原创 庐山真面目之——LWIP初探

目录LWIP简介网络层协议分层模型介绍 LWIP源代码结构lwip源码文件说明lwip的contrib包文件说明 以太网接入MCU方案LWIP结构框图lwIP 是 Light Weight(轻型)IP 协议,有无操作系统的支持都可以运行。lwIP 实现的重点 是在保持 TCP/IP 协议主要功能的基础上减少对 RAM 的占用,它只需十几 KB 的 RAM 和 40K 左右的 ROM 就可以运行,这使 lwIP 协议栈适合在低端的嵌入式系统中使用。lwIP 的设计理 念下,既可以无操作系统使用,也可以带操作系

2022-12-06 17:37:34 597

原创 Python闭包

注意:首先输出了3,这表明print(a)语句执行了,但是第二个print语句没有执行,一开始我个人觉得会打印6出来,因为有个全局变量b,而且是在print(b)之后为局部变量b赋值的,可事实是,python编译函数时,它判断b是局部变量,因为在函数内部给它赋值了.生成的字节码证实了这种判断,python会尝试从本地环境中获取b,而后调用f2(3)时,f2的定义体会获取并打印局部变量a的值,但是尝试获取局部变量b的值时,发现b没有绑定值.所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

2022-11-25 20:42:44 208

转载 softmax激活函数理解

这篇讲的非常详细易懂!

2022-11-19 17:31:31 85

原创 Verilog结构语句和函数、任务语句

若在函数声明中使用了关键字automatic,那么该函数将成为自动的或可递归的,即仿真器为每一次函数调用动态地分配新的地址空间,每一个函数调用对各自的地址空间进行操作,因此,自动函数的局部变量不能通过层次名进行访问,而自动函数本身可以通过层次名来访问。函数的目的是通过返回一个值来响应输入信号的值。上面的例子中,仿真器连续监视count_enable信号的值,若值为0,则不执行后面的语句,仿真会停顿下来,若其值为1,则在20个时间单位之后执行后面的语句,如果一直为1,那么count每隔20个时间单位加1.

2022-11-14 20:26:06 287

原创 Verilog语句

对块语句禁用导致紧接在后面的那条语句被执行。阻塞赋值和非阻塞赋值是C语言所没有的,阻塞语句,如果没有写延迟时间看起来是在同一时刻运行的,但实际上是有先后的,即在前面的先运行,然后再运行下面的语句,阻塞语句的秩序与逻辑行为具有很大的关系,而非阻塞的就不同了,在begin end之间的所有非阻塞语句都在同一时刻被赋值,因此逻辑行为与非阻塞语句的次序就没有关系。循环生成语句的主要目的是简化我们的代码书写,利用循环生成语句,我们可以将之前需要书写很多条比较相似的语句才能实现的功能用很简短的循环生成语句来代替。

2022-11-09 20:01:33 848

原创 Verilog模块的结构、数据类型、变量和基本运算符号

模块的端口声明了模块的输入输出口,其格式如下:module 模块名(口1,口2,口3,口4,......);在Verilog模块中所有过程块(如initial块、always块)、连续赋值语句、实例引用都是并行的。它们表示的是一种通过变量名互相连接的关系。在同一模块中这三者出现的先后顺序没有关系。只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分以上的内容是和以往学习的C语言最大的不同,C语言是顺序执行的语句,这就是二者之间的差异。

2022-11-08 18:07:42 352

原创 Verilog数字系统教程学习——Verilog语法的基本概念

这就是说,无论描述电路功能行为的模块或描述元器件或较大部件互联的模块都可以用Verilog语言来建立电路模型。,它可以对上面介绍的电路模块(无论是行为的或者结构的)进行全面的测试。通过观测被测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和结构正确与否,并及时发现问题修改。如果门级结构模块和具体的工艺技术结合起来,并加上布局布线引入的延迟模型,此时进行的仿真称为。Verilog还可以用于描述变化的测试信号,描述测试信号的变化和测试过程的模块也称为。把示例1或者示例2转换为示例3的过程称为。

2022-11-08 14:00:43 1040

原创 data_prepeocess

由于“巷子”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”,pandas可以自动将此列转换为两列“Alley_Pave”和"Alley_nan"。巷子类型为“Pave”的行为将"Alley_Pave"的值设置为1,"Alley_nan"的值设置为0.缺少巷子类型的行为会将"Alley_Pave"和"Alley_nan"分别设置为0和1.通过位置索引iloc,我们将data分成inputs和outputs,其中前者为data的前两列,而后者为data的最后一列。

2022-10-30 15:54:48 27

原创 电机基础知识

中心对齐模式:中心对齐模式就是该模式下计数器先从0开始递增计数,直到计数器的值等于自动重装载寄存器的值-1时,定时器上溢,同时生成更新事件,然后自动重载寄存器影子寄存器的值开始递减计算,直到计数值等于1时,定时器下溢,同时生成更新事件,然后又从0开始递增计数,依次循环。更新事件:更新事件产生有两种情况,其一是由软件产生,将TIMx_EGR寄存器的UG置位1,产生更新事件后,硬件自动会将UG位清0,二是由硬件产生,满足以下条件时即可,计数器的值等于自动重装载寄存器的影子寄存器的值,这时产生更新事件。

2022-10-20 18:09:04 1870

原创 Python——字符串格式化

input函数默认接收到的数据都是字符型的数据,如果要转换为其他类型的数据,比如数字,请自行转化。还可以通过占位符控制输出数据的宽度和精度(浮点数默认会四舍五入)快速格式化要控制精度输出。

2022-10-20 09:20:45 122

原创 python——基础语法

,Python 提供了非常丰富的内置函数,我们只需要直接调用即可,例如 print() 的功能是“打印到屏幕”,input() 的作用是接收用户输入(注:Python3 用 input() 取代了 Python2 的 raw_input()内置函数,python中内置了一些函数,可以使用dir(__builtins__)打印出内置函数,共有68个内置函数,不信你可以数一数!如果要输出一段包含\的字符串,可以有两种办法,一种是使用转义字符\,一种是使用''和”“搭配使用。python保留关键字。

2022-10-17 21:56:27 277

原创 FreeRTOS概述与体验

FreeRTOS的配置文件,比如 选择调度算法,configUSE_PREEMPTION每个demo都必定含有FreeRTOSConfig.h,建议去修改demo中的FreeRTOSConfig.h,而不是从头去写一个。在FreeRTOS.h之后,再去包含其他头文件,比如:task.h、queue.h、semphr.h、event_group.h。文件在FreeRTOS/Source/portable/MemMang下,它也是放在portable目录下,表示你自己可以提供自己的函数。

2022-10-11 18:03:55 634

原创 RT-Thread线程创建和切换分析

提出问题:什么叫线程?思考这个问题之前,先想想怎么切换线程?怎么保存线程?想要回答以上的问题,需要了解一些微机原理和ARM架构及汇编的知识。

2022-10-06 18:57:04 489

原创 RT-Thread互斥量

举个例子:怎么独享厕所?自己开门上锁,完事了自己开锁。相比于信号量,信号量是只要有钥匙,谁都可以开锁,互斥量相当于里面的人反锁了,只能谁拥有谁释放。这需要有两个前提:任务B很老实,不撬门(一开始不"give"信号量)没有坏人,别的任务不会give信号量可以看到,使用信号量确实也可以实现互斥访问,但是不完美它的核心在于:谁上锁,就只能由谁开锁。

2022-10-02 18:18:52 372

原创 RT-Thread信号量

信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。信号量就像一把钥匙,把一段临界区给锁住,只允许有钥匙的线程进行访问,线程拿到了钥匙,才允许它进入临界区,而离开后把钥匙传递给排队在后面的等待线程,让后续线程一次进入临界区。

2022-10-01 15:03:23 541

原创 RT-Thread任务间同步及通信

在多实时任务操作系统中,一项工作的完成往往可以通过多个任务协调的方式共同来完成。例如,一个任务从传感器中接收数据并且将数据写到共享内存中,同时另一个任务周期性的从共享内存中读取数据并发送显示,如下图两个线程间的数据传递如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它。这将引起数据一致性的问题,例如在显示线程显示数据之前,,传感器线程还未完成数据的写入,那么显示将包含不同时间采样的数据,造成显示数据的迷惑。

2022-09-28 19:45:34 236

原创 RT-Thread消息队列

消息队列名称,内存缓冲区,消息大小以及队列长度等,同时每个消息队列对象中包含着 多个消息框,每个消息框可以存放一条消息,消息队列中的第一个和最后一个消息框被分别称为消息链表头和消息链表尾,对应于消息队列控制块中的msg_queue_head和msg_queue_tail;这个长度可以在创建消息队列时指定。发送紧急消息的过程与发送消息几乎一样,唯一不同的是,当发送紧急消息时,从空闲消息链表上取下来的消息块不是挂到消息队列的队尾,而是挂到队首,这样接收者就能够优先接收到紧急消息,从而及时的进行消息处理。

2022-09-28 13:38:13 315

原创 RT-Thread定时器

当指定的flag为RT_TIMER_FLAG_HARD_TIMER时,如果定时器超时,定时器的回调函数将在时钟中断的服务例程上下文调用,当指定的flag为RT_TIMER_FLAG_SOFT_TIMER,如果定时器超时,定时器的回调函数将在系统时钟timer线程的上下文中被调用。当定时器设定的时间到了,即超时时,执行的动作函数称之为定时器的超市函数。定时器,是指从指定的时刻开始,经过一个指定的时间,然后触发一个事件,类似定个时间提醒第二天能够按时起床,定时器有软件定时器和硬件定时器之分;

2022-09-27 15:35:17 1381

原创 RT-Thread邮箱

通过邮箱,线程或中断服务函数可以将一个或多个邮件放入邮箱中,同样,一个或者多个线程可以从邮箱中获得邮件消息,当有多个邮件发送到邮箱时,通常应将先进入邮箱的邮件先传给线程,也就是说,线程先得到的是最先进入邮箱的消息,即先进先出原则(FIFO),同时RT-Thread中的邮箱支持优先级,也就是说在所有等待邮件的线程中优先级最高的会先获得邮件。如果邮箱中存在邮件,那么接收线程将复制邮箱中的4个字节邮件到接收线程中,通常来说,邮件收取过程中可能是阻塞的,这取决于邮箱中是否有邮件,以及收取邮件时设置的超时时间。

2022-09-26 16:59:09 198

原创 RT-Thread对象容器的实现

对象容器是一个全局变量的数组,数据类型为struct rt_object_information,这是一个结构体类型,包含对象的三个信息,分别为对象类型,对象列表节点头和对象的大小,在rt_def.h中定义,具体实现见下面代码所示。初始化对象容器——线程,线程是RTT中最基本的对象,是必须存在的,它和其他对象不一样,没有通过宏来选择,接下来下面的信号量,邮箱都通过对应的宏定义来控制是否初始化,即只有在创建了相应的对象之后,才在对象容器里面初始化。

2022-09-24 22:13:46 325

原创 RT-Thread启动流程

第二种我称之为小心翼翼,十分谨慎法,这种方法是在main函数中将硬件和RTOS系统初始化好,然后创建一个启动线程后就启动调度器,然后再启动线程里面在创建各种应用线程,当所有的线程都创建好之后,启动线程把自己删除,具体的伪代码实现如下。、应用线程的优先级比初始线程的优先级高,那创建完后立马去执行刚 刚创建的应用线程,当应用线程被阻塞时,继续回到初始线程被打断的地方继续往下执行, 直到所有应用线程创建完成,最后初始线程把自己关闭,完成自己的使命;到所有应用线程创建完成,最后初始线程把自己关闭,完成自己的使命。

2022-09-24 14:23:56 327

原创 RT-Thread线程管理与调度

创建线程主要可以看成四个步骤:1、动态分配或者静态分配线程控制块2、动态分配或者静态分配线程栈3、创建入口函数4、构造栈内容(线程控制块结构体的成员)上述函数的作用:调整sp和虚构栈内容线程调度由抢占式优先级和时间片轮转调度算法进行调度RT-Thread启动流程。

2022-09-24 13:30:30 491

原创 RTOS的基本概念与线程基础知识

它有一个栈底的地址, 是一开始就确定的,当有数据进栈或者出栈时,地址就会连续变动,不然就放到同一个存储地址中了,CPU需要有个地方保存这个不断变化的地址,这就是栈指针(SP)寄存器。RTOS的意思是:Real Time Operating System,即实时操作系统,但使用Windows,我们经常碰到程序卡死、停顿的现象,日常生活中,这是可以忍受的,但是在电梯系统中,你按住开门键时如果没有即刻反应,即使知识慢个一秒钟,也会夹住人,在专用的电子设备中,实时性很重要。回答这个问题之前,先想想怎么切换线程?

2022-09-19 19:29:40 2799 4

原创 RT-Thread——概述与体验

RT-Thread启动代码统一入口为rtthread_startup(),芯片启动文件在完成必要工作(初始化时钟、配置中断向量表、初始化堆栈、初始化PC指针、调用C库函数-main最终去到C的世界)后,最终会在程序跳转市,跳转至RT-Thread的启动入口中,RT-Thread的启动流程如下;可以分析看到,在stm32的启动代码中,先调用SystemInit:系统初始化、比如初始化时钟,调用__main函数:重定位,比如把代码段从Flash复制到内存,然后执行$Sub$$main。

2022-09-16 18:04:40 399

原创 数据结构和算法——绪论

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-5行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)总结:逻辑结构是独立于计算机的,总体可以划分为线性结构和非线性结构,其中线性结构是指每个元素都有且仅有一个前驱和后继,而非线性结构是一个结点可能有多个直接前驱和多个直接后继。根据指针找出相邻元素的位置。数据结构是相互之间存在一种或者多种特定关系的数据元素的集合,同样是结构,从不同角度来讨论,会有不同的分类,如下图所示。..

2022-08-30 22:58:27 178

原创 FreeRTOS概述与体验

1.1 FreeRTOS目录结构以Keil工具下的STM32F103芯片为例,它的FreeRTOS目录如下:主要涉及2个目录:1.2 核心文件FreeRTOS的最核心的文件严格来说只有2个:广义上的 queue.c一般也是经常用到的,但不是必须要的,有的地方也会把queue.c这个文件也认为是必须的。其他文件的作用也一起列表如下:1.3 移植时涉及的文件移植FreeRTOS时涉及的文件放在FreeRTOS/Source/portable/[complier]/[architecture]目录下,比如:RVD

2022-06-15 11:48:30 714

原创 python——列表简介

序列是python中最基本的数据结构。序列中的每个元素都分配一个数字-它的位置,或索引,第一个索引是0,第二个索引是1,以此类推。python中有6个序列的内置类型,但最常见的是列表和元组。序列都可以进行的操作包括索引,切片,加,乘,检查成员。此外,python已经内置确定序列的长度以及确定最大和最小的元素的方法。列表是最常用的python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型,创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。列表是什么列表由一系列

2022-06-07 14:39:16 733

原创 Python笔记——变量和简单的数据类型

变量:变量是标签,是可以赋给值得标签,也可以说变量指向特定的值。变量的命名与使用变量名只能包含字母、数字、下划线。变量名能以字母或下划线开头,但不能以数字开头。 变量名不能包含空格,但能使用下划线来分隔其中的单词。 不要将python的关键字和内置函数名作为变量名来使用。 变量名应该既简短又具有描述性,比如name比n要好。 慎用l和字母O,l和o和1、0有时候非常类似。字符串字符串就是一系列得字符组成,用引号括起的都是字符串,引号可以是单引号也可以是双引号。使用方法修改字符串的大

2022-05-31 18:16:53 57

原创 MDK编译过程和文件详解

MDK编译过程编译生成的不同的文件将在后面进行详细说明1) 编译:MDK软件使用的编译器是armcc和armasm,它们根据每个c/c++和汇编文件编译成对应的以".o"为后缀的对象文件(Object Code,也称目标文件),其内容主要是从源文件编译得到机器码,包含了代码、数据以及调试使用的信息。2)链接:链接器armlink把各个.o文件以及库文件链接成一个映像文件".axf"或“.elf”3)格式转换:一般来说windows或linux系统使用的链接器直接生成可执行映像文件elf后

2022-05-29 16:50:06 839

原创 电阻屏和电容屏的区别

电阻屏电阻触摸屏的屏体部分是一块多层复合薄膜,有一层玻璃或者有机玻璃作为基层,表面涂有一层透明的导电层(ITO)膜,上面再盖有一层外表面经过硬化处理、光滑防刮的塑料层。它的内表面也涂有一层ITO,在两层导电层之间有许多细小的(小于千分之一英寸)的透明隔离点把它们隔开。当手指接触屏幕时,两层ITO之间发生接触,电阻发生变化,控制器根据检测到的电阻变化来计算接触点的坐标,再依照这个坐标来进行相应的操作,因此这种技术必须是要施力到屏幕上,才能获得触摸效果。(这里我看野火视频,有点像ADC采集的味道)电阻式

2022-05-16 22:07:33 1347

10_I2C_EEPROM.rar

基于野火STM32开发板的I2C读写EEPROM

2022-01-09

Template.rar

STM32固件库模板

2022-01-04

空空如也

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

TA关注的人

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