<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[NRWHF的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/NRWHF</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; NRWHF]]></copyright><item><title><![CDATA[win11关闭防火墙和杀毒（安装软件时候）]]></title><link>https://blog.csdn.net/NRWHF/article/details/143817281</link><guid>https://blog.csdn.net/NRWHF/article/details/143817281</guid><author>NRWHF</author><pubDate>Sat, 16 Nov 2024 14:50:39 +0800</pubDate><description><![CDATA[都关闭。]]></description><category></category></item><item><title><![CDATA[ARM Cortex-M内核中系统堆栈]]></title><link>https://blog.csdn.net/NRWHF/article/details/133243011</link><guid>https://blog.csdn.net/NRWHF/article/details/133243011</guid><author>NRWHF</author><pubDate>Sun, 24 Sep 2023 16:42:18 +0800</pubDate><description><![CDATA[Cortex-M0中采用了两个堆栈指针：主堆栈指针（MSP）和进程堆栈指针（PSP），R13在任何时刻只能是其中一个，默认情况为MSP，可以通过控制寄存器（CONTORL）来改变。进入被调用函数时：将新的栈帧的起始位置指定为上一个栈帧的底部，这个位置需要根据前一个栈帧的大小确定，即 SP 指针移动到新的栈帧的底部位置。接着，将栈指针 SP（stack pointer）移动到新的栈帧的栈顶位置（一般是上一个栈帧的底部位置），然后继续执行被调用的函数。裸机操作时，使用的就是MSP指针。]]></description><category></category></item><item><title><![CDATA[FreeRTOS移植以及核心功能]]></title><link>https://blog.csdn.net/NRWHF/article/details/132910026</link><guid>https://blog.csdn.net/NRWHF/article/details/132910026</guid><author>NRWHF</author><pubDate>Wed, 20 Sep 2023 15:13:58 +0800</pubDate><description><![CDATA[信号量也是队列的一种【因为队列创建的时候，需要传入队列的长度以及队列的大小，而我们的信号量其实就是一种特殊的队列，只不过它的大小是0，毕竟我们的信号量是不需要传递数据，只需要传递信号，然后长度是N，当N=1的时候就是二值信号量，他就只有0和1两个状态，这里的0和1两个状态是指被填入和被拿走这两个状态，当N>1时，就是我们的计数信号量，他也不传递数据，只是传递一个数量值，一般是记录我们设备的资源数量】如果项目对实时性要求较高，或需要丰富的功能和工具支持，而且有购买授权的预算，那么 uC/OS 可能更适合。]]></description><category></category></item><item><title><![CDATA[可重入函数与不可重入函数介绍]]></title><link>https://blog.csdn.net/NRWHF/article/details/132911006</link><guid>https://blog.csdn.net/NRWHF/article/details/132911006</guid><author>NRWHF</author><pubDate>Fri, 15 Sep 2023 21:11:40 +0800</pubDate><description><![CDATA[这个安全的函数又叫可重入函数，所谓可重入是指一个可以被多个任务调用的过程，任务在调用时不必担心数据是否会出错。可重入函数可以在任意时刻被中断， 稍后再继续运行，不会丢失数据。可重入函数要么使用本地变量，要么在使用全局变量时 保护自己的数据。可重入函数可以允许有该函数的多个副本在运行，由于不同任务使用的是分离的栈，所以不会互相干扰。它除了使用自己栈上的变量以外不依赖于任何环境（包括 static）]]></description><category></category></item><item><title><![CDATA[FreeRTOS的信号量和互斥量之间的区别和联系]]></title><link>https://blog.csdn.net/NRWHF/article/details/132623934</link><guid>https://blog.csdn.net/NRWHF/article/details/132623934</guid><author>NRWHF</author><pubDate>Fri, 01 Sep 2023 16:15:23 +0800</pubDate><description><![CDATA[队列(queue)可以用于传输数据：在任务之间、任务和中断之间，消息队列用于传输多个数据，占用时间按也相对较长，但是有时候我们只需要传递状态，这个状态值需要用一个数值表示，一般是用作同步的效果所有的信号量的本质的都是特殊的队列(特殊：信号量只有队列头部，并没有后面的环形存储区，也就是说信号量只负责消息传递，并不传递数据)信号量用来进行共享资源的管理和任务同步【ps：信号量里面的二值信号量用于同步】]]></description><category></category></item><item><title><![CDATA[mq与mqtt的关系]]></title><link>https://blog.csdn.net/NRWHF/article/details/132497565</link><guid>https://blog.csdn.net/NRWHF/article/details/132497565</guid><author>NRWHF</author><pubDate>Fri, 25 Aug 2023 17:07:10 +0800</pubDate><description><![CDATA[传统的消息中间件，例如消息队列 RocketMQ、消息队列 RabbitMQ kafka 等都是面向微服务大数据等领域，负责消息的存储和转发，消息的生产者和消费者都是服务端应用。而移动互联网和 IoT 领域则有所不同，这类场景更侧重于多语言多平台的海量设备接入，消息的生产和消费过程的业务属性很突出，传统的消息中间件并不适合这些领域。在分布式服务器和服务器通信时，RPC可以解决问题。MQTT是在TCP之上的应用层协议，对物联网应用环境做了非常多的优化，TCP是传输层协议，是更通用层的协议。]]></description><category></category></item><item><title><![CDATA[Linux指令]]></title><link>https://blog.csdn.net/NRWHF/article/details/131896945</link><guid>https://blog.csdn.net/NRWHF/article/details/131896945</guid><author>NRWHF</author><pubDate>Sat, 19 Aug 2023 17:09:51 +0800</pubDate><description><![CDATA[大部分内置命令都是内置在shell中的，也有一些内置命令有自己单独的文件。系统启动，会把shell中的内置命令，其他其他不在shell中的内置命令加载到内存中用户输入命令会首先提交给shell，判断是否为内置命令。注意：一个文件（文件夹）改名、删除的权限是由它所在目录的权限控制的，而不是自身的权限控制。用户权限（文件对用户来说的权限，用户操作文件或者文件夹的权限）.开头的文件都是隐藏文件，隐藏文件是配置文件，是为了防止修改。文件的所属者和所属组发生改变，用户对文件的权限也发生改变。]]></description><category></category></item><item><title><![CDATA[STM32——RTC实时时钟]]></title><link>https://blog.csdn.net/NRWHF/article/details/132377472</link><guid>https://blog.csdn.net/NRWHF/article/details/132377472</guid><author>NRWHF</author><pubDate>Sat, 19 Aug 2023 16:25:36 +0800</pubDate><description><![CDATA[BKP（Backup Registers）备份寄存器【需要VBAT引脚供电才能维持，掉电会清零，即使主电源掉电、系统复位也不会清零】【本质是RAM存储器，掉电丢失】BKP可用于存储用户应用程序数据。当VDD（2.0~3.6V）电源被切断，他们仍然由VBAT（1.8~3.6V）维持供电。当系统在待机模式下被唤醒，或系统复位或电源复位时，他们也不会被复位【VBAT和VDD共地即可】TAMPER引脚产生的侵入事件【电平检测】将所有备份寄存器BKP内容清除，会申请中断【VDD断电也会工作】RTC引脚。]]></description><category></category></item><item><title><![CDATA[STM32——SPI外设总线]]></title><link>https://blog.csdn.net/NRWHF/article/details/132367934</link><guid>https://blog.csdn.net/NRWHF/article/details/132367934</guid><author>NRWHF</author><pubDate>Fri, 18 Aug 2023 22:28:26 +0800</pubDate><description><![CDATA[SPI通信外设
硬件I2C读写MPU6050
电路设计

关键代码

]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（线程化处理）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131921365</link><guid>https://blog.csdn.net/NRWHF/article/details/131921365</guid><author>NRWHF</author><pubDate>Tue, 25 Jul 2023 20:00:58 +0800</pubDate><description><![CDATA[发生中断时，系统会立刻调用 handler 函数，然后唤醒某个内核线程，内核线程再来执行 thread_fn 函数。编译好的文件在路径由DTC指定，移植设备树到开发板的共享文件夹中，先保存源文件，然后覆盖源文件，重启后会挂载新的设备树，进入该目录查看是否有新添加的设备节点。注意，如果其他设备树文件也用到该节点，需要设置属性为disabled状态，在arch/arm/boot/dts目录下执行如下指令查找哪些设备树用到该节点。上半部用来处理紧急的事情，下半部用一个内核线程来处理，这个内核线程专用于这个中断。]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（工作队列）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131920476</link><guid>https://blog.csdn.net/NRWHF/article/details/131920476</guid><author>NRWHF</author><pubDate>Tue, 25 Jul 2023 16:38:53 +0800</pubDate><description><![CDATA[structstruct0第 1 个宏是用来定义一个结构体，要指定它的函数。第 2 个宏用来定义一个 delayed_work 结构体，也要指定它的函数。所以“delayed”，意思就是说要让它运行时，可以指定：某段时间之后你再执行。]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（tasklet）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131918435</link><guid>https://blog.csdn.net/NRWHF/article/details/131918435</guid><author>NRWHF</author><pubDate>Tue, 25 Jul 2023 16:10:12 +0800</pubDate><description><![CDATA[阅读Linux 系统中异常与中断可知，Linux 系统对中断处理的演进过程中，实现了中断的扩展：硬件中断、软件中断硬件中断有：GPIO，网络中断（net），系统滴答中断(tick)等定时器，tasklet等内核中的软中断：该数组里面有个action成员，该成员是个函数，函数会调用链表里面每个tasklet结构体的软件中断处理函数，即下面链表的每个成员都是tasklet结构体，有对应的处理函数和flag标志位如何触发软中断？]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（定时器）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131910674</link><guid>https://blog.csdn.net/NRWHF/article/details/131910674</guid><author>NRWHF</author><pubDate>Tue, 25 Jul 2023 15:06:43 +0800</pubDate><description><![CDATA[定时器涉及函数参考内核源码：include\linux\timer.h：主要是初始化 timer_list 结构体，设置其中的函数、参数。]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（阻塞与非阻塞）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131903719</link><guid>https://blog.csdn.net/NRWHF/article/details/131903719</guid><author>NRWHF</author><pubDate>Tue, 25 Jul 2023 09:21:38 +0800</pubDate><description><![CDATA[非阻塞如何让 read 函数既能工作于阻塞方式，也可以工作于非阻塞方式？APP 调用 open 函数时，传入 O_NONBLOCK，就表示要使用非阻塞方式；默认是阻塞方式。在 open 之后，也可以通过 fcntl 函数修改为阻塞或非阻塞。对于字符设备文件，O_NONBLOCK 起作用的注意：在应用程序中设置标记位后，在驱动程序中可以知道该标记位，因为当 APP 打开某个驱动时，在内核中会有一个结构体对应这个驱动【该结构体是虚拟文件系统创建的】，这个结构体中有f_flags，保存所打开文件时的标记位；]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（异步通知）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131902823</link><guid>https://blog.csdn.net/NRWHF/article/details/131902823</guid><author>NRWHF</author><pubDate>Mon, 24 Jul 2023 19:43:38 +0800</pubDate><description><![CDATA[Linux 系统中也有很多信号，在 Linux 内核源文件。]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（POLL 机制）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131898448</link><guid>https://blog.csdn.net/NRWHF/article/details/131898448</guid><author>NRWHF</author><pubDate>Mon, 24 Jul 2023 16:58:16 +0800</pubDate><description><![CDATA[相比于休眠唤醒的程序，只需要调用在file_operations 结构体里面添加poll函数，使用 poll 机制时，驱动程序的核心就是提供对应的 drv_poll 函数。编译驱动程序，在Makefile文件目录下执行make指令，此时，目录下有编译好的内核模块gpio_key_drv.ko和可执行文件button_test文件移植到开发板上。编译好的文件在路径由DTC指定，移植设备树到开发板的共享文件夹中，先保存源文件，然后覆盖源文件，重启后会挂载新的设备树，进入该目录查看是否有新添加的设备节点。]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（休眠与唤醒）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131891564</link><guid>https://blog.csdn.net/NRWHF/article/details/131891564</guid><author>NRWHF</author><pubDate>Mon, 24 Jul 2023 16:58:08 +0800</pubDate><description><![CDATA[内核调度器负责维护该链表，链表里面保存的是线程，如果线程的状态为RUNNING，则会找到合适的时间就会让它运行，如果是非RUNNING，内核的调度器就不会让它运行。编译好的文件在路径由DTC指定，移植设备树到开发板的共享文件夹中，先保存源文件，然后覆盖源文件，重启后会挂载新的设备树，进入该目录查看是否有新添加的设备节点。注意，如果其他设备树文件也用到该节点，需要设置属性为disabled状态，在arch/arm/boot/dts目录下执行如下指令查找哪些设备树用到该节点。对于一个引脚要用作中断时，]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——按键驱动（中断）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131850568</link><guid>https://blog.csdn.net/NRWHF/article/details/131850568</guid><author>NRWHF</author><pubDate>Mon, 24 Jul 2023 14:33:32 +0800</pubDate><description><![CDATA[编译好的文件在路径由DTC指定，移植设备树到开发板的共享文件夹中，先保存源文件，然后覆盖源文件，重启后会挂载新的设备树，进入该目录查看是否有新添加的设备节点。注意，如果其他设备树文件也用到该节点，需要设置属性为disabled状态，在arch/arm/boot/dts目录下执行如下指令查找哪些设备树用到该节点。，然后将共享文件夹里面的设备树文件拷贝到boot目录下，这样的话设备树文件就在boot目录下。查看原理图确定按键使用的引脚，再在设备树中添加节点，在节点里指定中断信息。对于一个引脚要用作中断时，]]></description><category></category></item><item><title><![CDATA[Linux 系统中异常与中断]]></title><link>https://blog.csdn.net/NRWHF/article/details/131849184</link><guid>https://blog.csdn.net/NRWHF/article/details/131849184</guid><author>NRWHF</author><pubDate>Sun, 23 Jul 2023 20:24:26 +0800</pubDate><description><![CDATA[本节内容，可以从函数(头文件：include/linux/interrupt.h)一路分析得到。注意：如果内核配置了CONFIG_SPARSE_IRQ，那么它就会用基数树(radixtree)来代替irq_desc数组。SPARSE的意思是“稀疏”，假设大小为1000的数组中只用到2个数组项，那不是浪费嘛？所以在中断比较“稀疏”的情况下可以用基数树来代替数组。]]></description><category></category></item><item><title><![CDATA[STM32MP157驱动开发——LED 驱动（ GPIO 子系统）]]></title><link>https://blog.csdn.net/NRWHF/article/details/131824686</link><guid>https://blog.csdn.net/NRWHF/article/details/131824686</guid><author>NRWHF</author><pubDate>Sat, 22 Jul 2023 15:47:07 +0800</pubDate><description><![CDATA[视频，可以使用stm32cubemx去生成设备树文件，指定引脚的功能。编译好的文件在路径由DTC指定，移植设备树到开发板的共享文件夹中，先保存源文件，然后覆盖源文件，重启后会挂载新的设备树，进入该目录查看是否有新添加的设备节点。注意，如果其他设备树文件也用到该节点，需要设置属性为disabled状态，在arch/arm/boot/dts目录下执行如下指令查找哪些设备树用到该节点。，需要在Pinctrl里面设置，所以不用用到STM32CubeMX去生成设备Pinctrl，只需要修改设备树文件，添加设备节点。]]></description><category></category></item></channel></rss>