Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024-RSOC】day3-RTT IPC学习
发布于 2024-07-24 19:35:34 浏览:418
订阅该版
[tocm] # day3-RT-thread IPC学习 ## 1.学习内容 今天主要学习了RT-Thread中的信号量和互斥量,邮箱和消息队列等,这些是操作系统中用于线程同步和互斥控制的重要工具。 ### 信号量 信号量是一种用于控制多个线程对共享资源访问的机制。它允许多个线程等待某个条件的发生。 **创建与销毁**:使用`rt_sem_init`和`rt_sem_detach`进行信号量的初始化和销毁。 **等待与释放**:通过`rt_sem_take`和`rt_sem_release`控制对共享资源的访问。`rt_sem_take`会阻塞直到信号量可用,而`rt_sem_release`会增加信号量的计数,从而可能唤醒等待的线程。 ### 互斥量 互斥量用于保护代码段,确保同一时间**只有**一个线程可以访问某个资源。 **创建与销毁**:使用`rt_mutex_init`和`rt_mutex_detach`进行互斥量的初始化和销毁。 **锁定与解锁**:通过`rt_mutex_take`和`rt_mutex_release`来锁定和解锁互斥量。锁定互斥量会阻塞其他线程访问受保护的资源,直到互斥量被解锁。 ## 2.示例代码 ```c /* * Copyright (c) 2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-07-06 Supperthomas first version * 2023-12-03 Meco Man support nano version */ #include
#include
#include
#ifndef RT_USING_NANO #include
#endif /* RT_USING_NANO */ #define PIN_KEY0 GET_PIN(C, 0) // PC0: KEY0 --> KEY #define GPIO_LED_B GET_PIN(F, 11) #define GPIO_LED_R GET_PIN(F, 12) #define THREAD_PRIORITY 25 //线程优先级 #define THREAD_STACK_SIZE 1024 //栈大小 #define THREAD_TIMESLICE 5 //时钟节拍数 static rt_thread_t tid1 = RT_NULL; //线程1 static rt_thread_t tid2= RT_NULL; //线程2 static rt_sem_t dynamic_sem = RT_NULL; //信号量 static void key_name_entry(void *parameter); //按键线程入口函数 static void led_name_entry(void *parameter); //led灯线程入口函数 int main(void) { rt_pin_mode(GPIO_LED_R, PIN_MODE_OUTPUT); //定义led的gpio为输出 rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT_PULLUP);//定义按键gpio为上拉输入 rt_pin_write(GPIO_LED_R, PIN_HIGH); //初始化led为高电平 dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO);//创建信号量 if (dynamic_sem == RT_NULL) { rt_kprintf("create dynamic semaphore failed.\n"); return -1; } else { rt_kprintf("create done. dynamic semaphore value = 0.\n"); } //创建按键线程 tid1 = rt_thread_create("key_thread", key_name_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid1 != RT_NULL) //如果创建线程成功则启动线程 rt_thread_startup(tid1); //创建led灯线程 tid2 = rt_thread_create("led_thread", led_name_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid2 != RT_NULL) //如果创建线程成功则启动线程 rt_thread_startup(tid2); } //按键线程入口函数 static void key_name_entry(void *parameter) { rt_uint32_t count = 0; while (1) { if (rt_pin_read(PIN_KEY0) == PIN_LOW)//简单的按键检测 { rt_thread_mdelay(100); if (rt_pin_read(PIN_KEY0) == PIN_LOW) { rt_kprintf("KEY0 pressed!\r\n");//打印信息 rt_sem_release(dynamic_sem); //释放信号量 } } rt_thread_mdelay(10); } } //led线程入口函数 static void led_name_entry(void *parameter) { rt_uint32_t result = 0; while (1) { //以RT_WAITING_FOREVER状态等待信号量 result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER); if (result == RT_EOK) //得到信号量 { rt_kprintf("LED LOW\r\n"); rt_pin_write(GPIO_LED_R, PIN_LOW); //led灯亮 } else { rt_kprintf("LED HIGH\r\n"); rt_pin_write(GPIO_LED_R, PIN_HIGH); } } } ``` 我来讲一下我自己的理解,这个程序就是一个简单的按键点灯程序,而且有bug点亮之后只能通过重启熄灭。不过也无伤大雅,用来理解信号量也是绰绰有余。 我个人理解,信号量有点类似标志位的概念。当按键线程中按键被触发,释放一个信号,同时一直阻塞的led线程收到该信号,开始执行逻辑。在本例程里就信号量就类似开关的作用,一个释放一个接收。之所以灯会一直亮是因为,信号量被释放后没有被销毁导致的。 ### 示例结果 ![1.png](https://oss-club.rt-thread.org/uploads/20240724/eec955e6a410a7d40e86d5b0178286f8.png) 还有就是从env上下载线上的一些示例代码。 配置软件包 ![2.png](https://oss-club.rt-thread.org/uploads/20240724/2303fdba144b80e054319e5913f2d296.png.webp) 下载在线软件包 ![3.png](https://oss-club.rt-thread.org/uploads/20240724/5a210393065e45bb9e9c4fbdcd3e972c.png.webp) 编译 ![4.png](https://oss-club.rt-thread.org/uploads/20240724/b12f1fe7fac2d6ff4096f65d349066b5.png.webp) 烧录后打开msh命令后可以看到 ![5.png](https://oss-club.rt-thread.org/uploads/20240724/8cad4f88c222f706608d7d2562dde03e.png.webp) 将命令导入msh控制台 ![6.png](https://oss-club.rt-thread.org/uploads/20240724/8193a7cf3639063caee4ce909f20bbfc.png.webp)
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
小夏同学
这家伙很懒,什么也没写!
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部