zhoutanooi
码龄3年
关注
提问 私信
  • 博客:165,978
    社区:1
    165,979
    总访问量
  • 143
    原创
  • 60,973
    排名
  • 1,234
    粉丝
  • 0
    铁粉
  • 学习成就

个人简介:感谢各位关注,我会继续努力,发布更多文章

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:广东省
  • 加入CSDN时间: 2021-09-08
博客简介:

纵行山河万里~

查看详细资料
  • 原力等级
    成就
    当前等级
    5
    当前总分
    1,394
    当月
    14
个人成就
  • 获得1,635次点赞
  • 内容获得52次评论
  • 获得1,300次收藏
  • 代码片获得1,348次分享
创作历程
  • 125篇
    2024年
  • 18篇
    2023年
  • 1篇
    2022年
成就勋章
兴趣领域 设置
  • 编程语言
    pythonc++c语言
  • 嵌入式
    单片机stm3251单片机物联网嵌入式硬件
创作活动更多

HarmonyOS开发者社区有奖征文来啦!

用文字记录下您与HarmonyOS的故事。参与活动,还有机会赢奖,快来加入我们吧!

0人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

汇编指令——ARM Cortex-M指令分析

这条指令用于确保在执行到该指令时,处理器中的指令流水线中的指令按顺序执行。这条指令用于确保在执行到该指令时,所有对内存的数据访问操作都已经完成,并且对这些访问所做的修改对后续的访问可见。是 ARM 汇编语言中的一条指令,代表 “OR with immediate”,用于将一个寄存器的值与一个立即数进行按位或运算,并将结果存储回目标寄存器中。指令会保在执行到该指令时,之前的指令已经对后续指令的影响生效,并且后续的指令按顺序执行。是 ARM 汇编语言中的一个指令,用于加载寄存器中的数据。
原创
发布博客 2024.06.07 ·
1854 阅读 ·
36 点赞 ·
0 评论 ·
8 收藏

C语言中typedef的四种用法(附带详细解析!!)

其中,枚举类型名 表示定义的枚举类型的名称,枚举常量1、枚举常量2 等表示枚举类型中的常量。每个枚举常量都有一个整数值,它们的默认值从 0 开始,依次递增 1。
原创
发布博客 2024.06.07 ·
7293 阅读 ·
19 点赞 ·
0 评论 ·
36 收藏

嵌入式Linux学习——Makefile语法函数

的所返回的每个字符串会以空格分隔,最后当整个循环结束时,;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell (/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。如果中也包含“%”,那么,中的这个“%”将是中的那个“%”所代表的字串。
原创
发布博客 2024.06.05 ·
250 阅读 ·
2 点赞 ·
0 评论 ·
5 收藏

嵌入式Linux学习——链接脚本

链接脚本描述了要链接的文件,以及链接顺序、链接首地址。上面语句中我们是通过“-Ttext”来指定链接地址是 0X87800000 的,这样的话所有的文件都会链接到以 0X87800000 为起始地址的区域。但是有时候我们很多文件需要链接到指定的区域,或者叫做段里面,比如在 Linux 里面初始化函数就会放到 init 段里面。因此我们需要能够自定义一些段,这些段的起始地址我们可以自由指定,同样的我们也可以指定一个文件或者函数应该存放到哪个段里面去。
原创
发布博客 2024.06.05 ·
1072 阅读 ·
27 点赞 ·
0 评论 ·
16 收藏

嵌入式Linux学习——Makefile语法

GCC 编译器的编译流程是:预处理、编译、汇编和链接。预处理就是展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题。通过在终端执行 gcc 命令来完成 C 文件的编译,如果我们的工程只有一两个 C 文件还好,需要输入的命令不多,当文件有几十、上百甚至上万个的时候用终端输入
原创
发布博客 2024.06.04 ·
1170 阅读 ·
20 点赞 ·
0 评论 ·
20 收藏

FreeRtos进阶——FreeRtos内部链表逻辑分析

xLIIST_ITEM 是一个普通链表项,与迷你链表项不同,它多了两个元素,一个元素pwOwner用来指示该链表项被包含在哪个TCB中,即哪个任务所拥有。xLIST是一个链表,链表的作用主要是用来查看链表项的使用信息的,在链表中我们可以通过pxIndex查看当前指针在哪个链表项的位置,通过uxNumberOfItems查看链表中有多少链表项。当我们要在链表中添加一个新的链表项时,如果是根据执行的先后顺序,我们会在当前执行链表项的前一位进行添加操作,以确保的最后来最后执行。
原创
发布博客 2024.06.03 ·
251 阅读 ·
6 点赞 ·
0 评论 ·
5 收藏

FreeRtos进阶——各种堆的实现方式

"堆"就是一块或者多块内存,我们可以从中申请一小块内存来使用,使用完毕后可以释放这一小块内存。
原创
发布博客 2024.06.03 ·
1184 阅读 ·
13 点赞 ·
0 评论 ·
21 收藏

FreeRtos进阶——通用链表的实现方式

在此链表中,node结构体被放在了最前面,因此当我们用node结构体存储不同类型(dog或者person)结构体信息时,node 结构体位置就是dog或者person结构体的位置。在想要使用dog或者person时,只需要使用强制类型转换的方法即可。与前面俩种方法类似,如果直接在contianer存储person或者dog的结构体地址,那么就不需要再去计算或者反推对应结构体的地址了。在此链表中,node结构体的位置在最后面,因此我们需要根据person或者dog结构体的大小反推出他们的指针起始位置。
原创
发布博客 2024.06.01 ·
353 阅读 ·
5 点赞 ·
0 评论 ·
4 收藏

FreeRtos进阶——中断的内部逻辑

在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断,具体PendSV中断服务函数是 PendSV_Handler,并且任务切换的具体任务是在PendSV中断服务函数中完成的。而在中断api中,会先记录更高优先级的任务,在中断里的任务处理完成后,在中断末尾对任务进行切换。注意:即使最低优先级的中断 也比最高优先级的任务 优先级要高。
原创
发布博客 2024.05.31 ·
645 阅读 ·
8 点赞 ·
0 评论 ·
10 收藏

FreeRtos进阶——软件定时器内部逻辑

在创建定时器任务后,在每一次SysTick中断中,会将定时器时钟到的任务写入定时器任务队列。在prvTimerTask任务(守护任务)中会不断的读取最新一个定时器任务队列,并且调用其回调函数,守护任务的优先级基本上就是最高的。prvTimerTask()函数是FreeRTOS中的一个定时器任务函数,它的主要作用是实现定时器的管理和调度。具体来说,它会不断地从定时器列表中获取下一个到期的定时器,并进行处理,包括执行定时器回调函数、删除定时器等操作。
原创
发布博客 2024.05.31 ·
671 阅读 ·
16 点赞 ·
0 评论 ·
0 收藏

FreeRtos进阶——任务通知内部逻辑

在任务通知中,无需再次创建对应的任务通知变量,因为任务通知的所需要的变量就存储在任务TCB中,可以很方便的设置通知状态,以及通知值。对于任务通知而言,和消息队列的操作逻辑非常相似,都是通过关中断设置的方式实现,但是不需要依赖队列。因为任务通知,是对指定的任务TCB直接进行通知,单个对单个,如果任务通知值来不及接收,下个任务通知值就来了,可以设置发出任务通知的一方避免数据被覆盖直到被通知任务状态被修改。
原创
发布博客 2024.05.30 ·
213 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

FreeRtos进阶——事件组内部逻辑

例如在使用等待事件函数时,第一个参数代表事件组,第二个代表等待的时间,第三个代表对应的事件位发生后退出时是否清除标志位,第四个代表是否需要等待所有事件发生,第五个参数代表愿意等待的时间。在中断中,我们通过对应中断事件组设置函数,其实是无法直接设置事件组的,中断中做的操作仅仅只是将需要设置的事件组写入一个定时器任务的就绪队列,无法直接设置事件组的对应的位。在内部函数中,我们会发现要想实现互斥访问数据对事件组的位进行操作时,首先需要关闭调度器,而不是关中断,因为在中断中无法对位进行操作。
原创
发布博客 2024.05.30 ·
357 阅读 ·
8 点赞 ·
0 评论 ·
3 收藏

FreeRtos进阶——队列的特殊用途

信号量与互斥量都一样,都是特殊的队列。但是只有互斥量实现了优先级继承机制。信号量与互斥量与队列一样,在操作增加或者减少时,必须先关中断在进行操作!
原创
发布博客 2024.05.28 ·
451 阅读 ·
7 点赞 ·
0 评论 ·
3 收藏

FreeRtos进阶——消息队列的操作逻辑

在我们进行读写数据时采用环形缓冲区类似循环指针,会有俩个指针,一个是读指针用于指示当前队列存在的最早消息,一个是写指针用于指示当前可以写的队列的位置。这俩种情况都需要进入俩个等待队列,一个是等待读队列,一个是等待写队列。当写操作完成后,会唤醒等待读队列的任务,提示当前列表有数据了。在不同的任务之间,如果我们需要互相之间通信,使用全局变量进行通信,是一种不安全的通信的方式。为保证线程的安全,在FreeRtos使用消息队列进行读写时,如果要实现互斥访问,我们都会采取关中断的操作。
原创
发布博客 2024.05.28 ·
431 阅读 ·
5 点赞 ·
0 评论 ·
3 收藏

FreeRtos进阶——关于任务的深入探究

在我们创建任务中,会有几个比较神奇的参数,例如函数名称,以及栈大小。在我们创建任务时,也相应的要为每一个任务创建栈。这里面的栈除了用于任务数组开辟的空间外,还可以用于保存现场,例如有SP,LP,PC以及R0等寄存器用于保存当前栈顶,返回地址,当前指令。当有多个任务都想运行时,这时候就要依靠各种链表来实现任务的调度。每个任务在被创建时,要使用prvAddNewTaskToReadyList()根据其优先级被分配到不同的就绪列表中。在有多个任务创建时,最先执行的任务永远是优先级最高,且最晚被创建的任务。
原创
发布博客 2024.05.27 ·
281 阅读 ·
6 点赞 ·
0 评论 ·
0 收藏

FreeRtos进阶——栈保存现场的几种场景

在我们的CPU中有着很重要的一个模块——寄存器(R0-R15),其中R13,R14,R15的别称分别为SP栈顶指针、LR返回地址、PC当前指令地址。Code是指ROM即存储代码的地方,在底层讲是存储汇编指令的地方,当程序运行时,PC就从这里一条条取出指令执行。在函数调用时,传参会用到R0,R1,R2时,这些寄存器就不用保存,因为这些寄存器被用来传参了,仅需要保存一些用到的寄存器。硬件中断时,硬件会自动保存(R0,R1,R2)这些寄存器到栈中,仅需要保存一些用到的寄存器。
原创
发布博客 2024.05.27 ·
636 阅读 ·
17 点赞 ·
0 评论 ·
0 收藏

STM32之HAL开发——ADC入门介绍

模数转换,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件,比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101,这样ADC就建立了模拟世界的传感器和数字世界的信号处理与数据转换的联系。
原创
发布博客 2024.04.28 ·
1092 阅读 ·
16 点赞 ·
0 评论 ·
20 收藏

STM32之HAL开发——电容按键

现在最主要的任务就是测量充电时间。这样先测量得到无触摸时的充电时间作为比较基准,然后再定时循环测量充电时间与无触摸时的充电时间作比较,如果超过一定的阈值就认为是有手指触摸。在电路板未上电时,可以认为电容 Cx 是没有电荷的,在上电时,在电阻作用下,电容 Cx 就会有一个充电过程,直到电容充满,即 Vc 电压值为 3.3V,这个充电过程的时间长短受到电阻 R 阻值和电容 Cx 容值的直接影响。之前的分析是在电路板上电时会有充电过程,现在我们要求在程序运行中循环检测按键,所以必须可以控制充电过程的生成。
原创
发布博客 2024.04.28 ·
1050 阅读 ·
8 点赞 ·
0 评论 ·
6 收藏

嵌入式Linux学习——Linux常用命令(下)

注意:“tar – czvf”与“ tar czvf”是一样的效果,所以说,后面统一取消“ -”。例 1: tar 打包、 gzip 压缩。在一般模式下,可以执行以下命令。
原创
发布博客 2024.04.27 ·
984 阅读 ·
15 点赞 ·
0 评论 ·
5 收藏

嵌入式Linux学习——Linux常用命令(上)

Shell 的意思是“外壳”,在 Linux 中它是一个程序,比如/bin/sh、/bin/bash 等。它负责接收用户的输入,根据用户的输入找到其他程序并运行。比如我们输入“ ls”并回车时, shell 程序找到“ ls”程序并运行,把结果打印出来。Shell 有很多种实现,我们常用 bash。
原创
发布博客 2024.04.27 ·
1099 阅读 ·
36 点赞 ·
0 评论 ·
18 收藏
加载更多