<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[hgfjv的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/hgfjv</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; hgfjv]]></copyright><item><title><![CDATA[rt-thread队列使用]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138591441</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138591441</guid><author>hgfjv</author><pubDate>Thu, 09 May 2024 01:09:25 +0800</pubDate><description><![CDATA[线程读写消息队列时，如果读写不成功，可以即刻返回错误，也可以阻塞。消息是一种遵循先进先出的原则，比如装酒的漏斗，先倒进去的先流出来，是一个道理的。哪个线程先放数据，那么其他线程在读的时候，一定是先读到最早放入的那个数据，看下面的示意图就明白了。 多个线程都想写队列，但是队列已经满了，这些线程可以进入阻塞状态：它们都在等待队列有空间。 多个线程都想读队列，但是队列已经空了，这些线程可以进入阻塞状态：它们都在等待队列有数据。 在指定的时间内，别的线程或者中断服务程序写了队列，会把它唤醒。]]></description><category></category></item><item><title><![CDATA[rt-thread的邮箱理解与举例使用]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138551328</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138551328</guid><author>hgfjv</author><pubDate>Wed, 08 May 2024 01:40:28 +0800</pubDate><description><![CDATA[向邮箱发送数据，如果满了那你就得等（挂起或者超时等待，时间一到就返回 - RT_ETIMEOUT并挂起等待着），等邮箱有空余空间了就会唤醒线程去存。邮箱的创建也比较简单，邮箱名，邮箱的数量。注意这里说的4个字节说的是每个每封邮件的大小，邮箱的数量指邮箱里面有多少封这样的邮件。第三个是先进先出等待，如果谁先被挂起，唤醒的时候就先唤醒谁，老生常谈了。邮箱也有静态和动态之分，这里用动态。前面是邮箱的对象，是给你区分用的是哪个邮箱的，接收邮箱也需要它，这样才能确保我给这个邮箱发，你从这个邮箱获取，形成对应关系。]]></description><category></category></item><item><title><![CDATA[rt-thread互斥量介绍与使用例子]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138476176</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138476176</guid><author>hgfjv</author><pubDate>Tue, 07 May 2024 01:03:41 +0800</pubDate><description><![CDATA[举个例子，现在有三个优先级不同的线程，高线程（H）、中线程（M）、低线程（L），如果L线程现在正享有信号量且信号量的值为1，L线程执行过程中延时让出CPU资源，理应H线程抢占去执行，但是没有信号量资源可用了只能挂起等待有信号量能用再唤醒，这时候有可能M线程被唤醒就去抢占L了。H线程最高优先级不能得到及时响应，这是我们不允许的。加上互斥锁后，H在等待L释放互斥量时时，L的优先级会被提升到和H一样，这样M就无法去抢占L了，H也能在L释放互斥量第一时间没被唤醒，这就是优先级继承和防止优先级反转混乱。]]></description><category></category></item><item><title><![CDATA[rt-thread事件集的介绍与使用示例]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138455593</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138455593</guid><author>hgfjv</author><pubDate>Sun, 05 May 2024 02:29:43 +0800</pubDate><description><![CDATA[2.1 创建事件比较简单，rt_event_create（）第一个参数是事件名，第二个是线程的属性，RT_IPC_FLAG_FIFO就代表当前线程如果接收不到事件就会一直等待，当有事件来的时候就第一个唤醒的是最早在等待的线程，先进先出。一个线程和多个事件的关系可设置为：其中任意一个事件唤醒 线程，或几个事件都到达后唤醒线程，多个事件集合可以用一个32bit无符号整型变量来表示，变量的每一位代表一个事件，线程通过"逻辑与"或"逻辑或"将一个或多个事件关联起来，形成事件组合。跟信号量、线程创建都是一个套路的。]]></description><category></category></item><item><title><![CDATA[rt-thread信号量解释与举例使用]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138429479</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138429479</guid><author>hgfjv</author><pubDate>Sat, 04 May 2024 01:45:26 +0800</pubDate><description><![CDATA[如果当前信号量的值是0，再有线程去申请，就会挂在在该链表上等待新的信号量数值，如果数值大于0，就会唤醒在该等待队列的线程，至于唤醒是优先级线程唤醒还是先进先出唤醒，要看创建线程时是设置的什么属性，举例子时我会注释出来。每个信号量对象都有一个信号量值和一个线程等待队列，信号量的值对应了信号量对象的实例数目、资源数目，假如信号量值为 5，则表示共有 5 个信号量实例（资源）可以被使用，当信号量实例数目为零时，再申请该信号量的线程就会被挂起在该信号量的等待队列上，等待可用的信号量实例（资源）。]]></description><category></category></item><item><title><![CDATA[rt-thread定时器介绍与使用]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138330415</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138330415</guid><author>hgfjv</author><pubDate>Tue, 30 Apr 2024 01:52:45 +0800</pubDate><description><![CDATA[而 rt_tick 随着硬件定时器的触发一直在增长（每一次硬件定时器中断来临，rt_tick 变量会加 1） ，50个tick以后，rt_tick从20增长到70，与Timer1的timeout值相等，这时会触发与Timer1定时器相关联的超时函数，同时将Timer1从rt_timer_list链表上删除。rt_timer_create（）参数依次是定时器的名，定时器的超时函数，定时器的超时函数的输入参数，定时时间，定时设置的属性。RT_TIMER_FLAG_HARD_TIMER表示是软件定时器。]]></description><category></category></item><item><title><![CDATA[rt-thread线程的创建以及点灯]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/138296689</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/138296689</guid><author>hgfjv</author><pubDate>Mon, 29 Apr 2024 02:05:41 +0800</pubDate><description><![CDATA[第二个是线程入口函数，填自定义函数的名字即可，因为函数名是地址，这是一个回调，线程创建成功就出触发回调函数执行。/*500tick */的作用就是延时时把CPU使用权给别的线程，不然你就一直循环执行在这，别的线程就不能执行了，这是我们不允许的。rtthread接口rt_thread_create（）就是创建动态线程，返回值也是rt_thread_t，所以我们要用rt_thread_t类型去定义一个结构体指针接收rt_thread_create（）的返回值，这样我们就可以通过这个指针去访问线程了。]]></description><category></category></item><item><title><![CDATA[STM32——最好的指针详解]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/133827295</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/133827295</guid><author>hgfjv</author><pubDate>Sun, 15 Oct 2023 03:48:21 +0800</pubDate><description><![CDATA[同级指针才能赋值，比如说chara = 0x66;char *p;那p=a就不成立，你可以这样理解，变量a是零级指针，p是一级指针，再往后还有二级、三级指针，不同级指针不能赋值。但是p=&a就成立，因为&之后，就是地址了，地址就是指针。]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6----ADC+DMA+串口显示]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/126568114</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/126568114</guid><author>hgfjv</author><pubDate>Sun, 28 Aug 2022 13:36:52 +0800</pubDate><description><![CDATA[ADC+DMA+串口显示]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6串口发送字符串与代码详细讲解说明]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/125973736</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/125973736</guid><author>hgfjv</author><pubDate>Mon, 25 Jul 2022 14:57:02 +0800</pubDate><description><![CDATA[STM32串口发送字符串]]></description><category></category></item><item><title><![CDATA[【STM32】数码管显示按键控制舵机转动的角度（二）]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/125582956</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/125582956</guid><author>hgfjv</author><pubDate>Sun, 03 Jul 2022 12:35:50 +0800</pubDate><description><![CDATA[舵机控制]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6-----按键控制LED灯亮灭(一)]]></title><link>https://blog.youkuaiyun.com/hgfjv/article/details/122505202</link><guid>https://blog.youkuaiyun.com/hgfjv/article/details/122505202</guid><author>hgfjv</author><pubDate>Sat, 15 Jan 2022 01:37:18 +0800</pubDate><description><![CDATA[*通过RCC里面的APB2外设时钟控制函数打开GPIOX时钟；

*通过GPIO_Init()函数自动读取结构体的值，然后自动把外设的各个参数配置好，我们只需要提前把结构体参数配置好即可；

我比较喜欢模块化编程，这样下一次使用就不用再写了，直接复制粘贴到工程文件夹里，然后头文件声明就可以调用了。



main.c:


#include "stm32f10x.h"                  // Device header
#include "LED.h" 
#include "Delay.h"]]></description><category></category></item></channel></rss>