- 博客(12)
- 收藏
- 关注
原创 rt-thread队列使用
线程读写消息队列时,如果读写不成功,可以即刻返回错误,也可以阻塞。消息是一种遵循先进先出的原则,比如装酒的漏斗,先倒进去的先流出来,是一个道理的。哪个线程先放数据,那么其他线程在读的时候,一定是先读到最早放入的那个数据,看下面的示意图就明白了。 多个线程都想写队列,但是队列已经满了,这些线程可以进入阻塞状态:它们都在等待队列有空间。 多个线程都想读队列,但是队列已经空了,这些线程可以进入阻塞状态:它们都在等待队列有数据。 在指定的时间内,别的线程或者中断服务程序写了队列,会把它唤醒。
2024-05-09 01:09:25 392
原创 rt-thread的邮箱理解与举例使用
向邮箱发送数据,如果满了那你就得等(挂起或者超时等待,时间一到就返回 - RT_ETIMEOUT并挂起等待着),等邮箱有空余空间了就会唤醒线程去存。邮箱的创建也比较简单,邮箱名,邮箱的数量。注意这里说的4个字节说的是每个每封邮件的大小,邮箱的数量指邮箱里面有多少封这样的邮件。第三个是先进先出等待,如果谁先被挂起,唤醒的时候就先唤醒谁,老生常谈了。邮箱也有静态和动态之分,这里用动态。前面是邮箱的对象,是给你区分用的是哪个邮箱的,接收邮箱也需要它,这样才能确保我给这个邮箱发,你从这个邮箱获取,形成对应关系。
2024-05-08 01:40:28 525
原创 rt-thread互斥量介绍与使用例子
举个例子,现在有三个优先级不同的线程,高线程(H)、中线程(M)、低线程(L),如果L线程现在正享有信号量且信号量的值为1,L线程执行过程中延时让出CPU资源,理应H线程抢占去执行,但是没有信号量资源可用了只能挂起等待有信号量能用再唤醒,这时候有可能M线程被唤醒就去抢占L了。H线程最高优先级不能得到及时响应,这是我们不允许的。加上互斥锁后,H在等待L释放互斥量时时,L的优先级会被提升到和H一样,这样M就无法去抢占L了,H也能在L释放互斥量第一时间没被唤醒,这就是优先级继承和防止优先级反转混乱。
2024-05-07 01:03:41 311
原创 rt-thread事件集的介绍与使用示例
2.1 创建事件比较简单,rt_event_create()第一个参数是事件名,第二个是线程的属性,RT_IPC_FLAG_FIFO就代表当前线程如果接收不到事件就会一直等待,当有事件来的时候就第一个唤醒的是最早在等待的线程,先进先出。一个线程和多个事件的关系可设置为:其中任意一个事件唤醒 线程,或几个事件都到达后唤醒线程,多个事件集合可以用一个32bit无符号整型变量来表示,变量的每一位代表一个事件,线程通过"逻辑与"或"逻辑或"将一个或多个事件关联起来,形成事件组合。跟信号量、线程创建都是一个套路的。
2024-05-05 02:29:43 542
原创 rt-thread信号量解释与举例使用
如果当前信号量的值是0,再有线程去申请,就会挂在在该链表上等待新的信号量数值,如果数值大于0,就会唤醒在该等待队列的线程,至于唤醒是优先级线程唤醒还是先进先出唤醒,要看创建线程时是设置的什么属性,举例子时我会注释出来。每个信号量对象都有一个信号量值和一个线程等待队列,信号量的值对应了信号量对象的实例数目、资源数目,假如信号量值为 5,则表示共有 5 个信号量实例(资源)可以被使用,当信号量实例数目为零时,再申请该信号量的线程就会被挂起在该信号量的等待队列上,等待可用的信号量实例(资源)。
2024-05-04 01:45:26 684
原创 rt-thread定时器介绍与使用
而 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表示是软件定时器。
2024-04-30 01:52:45 866
原创 rt-thread线程的创建以及点灯
第二个是线程入口函数,填自定义函数的名字即可,因为函数名是地址,这是一个回调,线程创建成功就出触发回调函数执行。/*500tick */的作用就是延时时把CPU使用权给别的线程,不然你就一直循环执行在这,别的线程就不能执行了,这是我们不允许的。rtthread接口rt_thread_create()就是创建动态线程,返回值也是rt_thread_t,所以我们要用rt_thread_t类型去定义一个结构体指针接收rt_thread_create()的返回值,这样我们就可以通过这个指针去访问线程了。
2024-04-29 02:05:41 511
原创 STM32——最好的指针详解
同级指针才能赋值,比如说chara = 0x66;char *p;那p=a就不成立,你可以这样理解,变量a是零级指针,p是一级指针,再往后还有二级、三级指针,不同级指针不能赋值。但是p=&a就成立,因为&之后,就是地址了,地址就是指针。
2023-10-15 03:48:21 3087
原创 STM32F103C8T6-----按键控制LED灯亮灭(一)
*通过RCC里面的APB2外设时钟控制函数打开GPIOX时钟;*通过GPIO_Init()函数自动读取结构体的值,然后自动把外设的各个参数配置好,我们只需要提前把结构体参数配置好即可;我比较喜欢模块化编程,这样下一次使用就不用再写了,直接复制粘贴到工程文件夹里,然后头文件声明就可以调用了。main.c:#include "stm32f10x.h" // Device header#include "LED.h" #include "Delay.h"
2022-01-15 01:37:18 11798 8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人