Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
STM32F103关于互斥型信号量的疑惑
发布于 2019-07-26 16:28:49 浏览:1956
订阅该版
* 本帖最后由 aozima 于 2019-7-28 02:44 编辑 * 先上代码: ```#include "board.h" #include "rtthread.h" /* 定义线程控制块 */ static rt_thread_t receive_thread = RT_NULL; static rt_thread_t send_thread = RT_NULL; /* 定义互斥量控制块 */ static rt_mutex_t tex_mux = RT_NULL; /* 用到的全局变量 */ uint8_t ucValue[2] = {0x00, 0x00}; /* 声明线程函数 */ static void receive_thread_entry(void* parameter); static void send_thread_entry(void* parameter); int main(void) { tex_mux = rt_mutex_create("test_sem", RT_IPC_FLAG_FIFO); receive_thread = rt_thread_create("receive", receive_thread_entry, RT_NULL, 512, 3, 20); if(receive_thread != RT_NULL) rt_thread_startup(receive_thread); else return -1; send_thread = rt_thread_create("send", send_thread_entry, RT_NULL, 512, 2, 20); if(send_thread != RT_NULL) rt_thread_startup(send_thread); else return -1; } static void receive_thread_entry(void* parameter) { while(1) { rt_mutex_take(tex_mux, RT_WAITING_FOREVER); if(ucValue[0] == ucValue[1]) { rt_kprintf("%d
", ucValue[0]); rt_kprintf("%d
", ucValue[1]); rt_kprintf("22222222222222222222222222222222222222222222222222
"); } else rt_kprintf("Fail
"); rt_mutex_release(tex_mux); rt_thread_delay(1000); } } static void send_thread_entry(void *parameter) { while(1) { rt_mutex_take(tex_mux, RT_WAITING_FOREVER); rt_kprintf("1111111111111111111111111111111111111111111111111
"); ucValue [ 0 ] ++; rt_thread_delay ( 100 ); ucValue [ 1 ] ++; rt_mutex_release(tex_mux); rt_thread_yield(); } } ``` 打印效果: > 0 0 22222222222222222222222222222222222222222222222222 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 10 10 22222222222222222222222222222222222222222222222222 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 20 20 22222222222222222222222222222222222222222222222222 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 。。。。。。。。省略。。。。。。。 让我不理解的地方是,send_thread的优先级是2,receive_thread的优先级是3, 但是从打印效果来看是receive_thread的线程先执行的,然后我把main中两个线程的创建顺序调换了一下, 即先创建send_thread后创建receive_thread(二者的优先级未作改变),打印效果变成如下: > 1111111111111111111111111111111111111111111111111 1 1 22222222222222222222222222222222222222222222222222 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 11 11 22222222222222222222222222222222222222222222222222 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111 。。。。。。。。省略。。。。。。。 结合两次打印效果来看,应该是哪个线程先创建,哪个线程就先执行,这样子的话,线程的优先级不就无效了吗? 关于线程优先级这里应该怎样执行??望大佬们不吝赐教谢谢谢谢谢谢!
查看更多
16
个回答
默认排序
按发布时间排序
qiudashan
2019-07-26
这家伙很懒,什么也没写!
大佬在哪里:'(
qiudashan
2019-07-26
这家伙很懒,什么也没写!
求大佬:'(
国际哥
2019-07-27
这家伙很懒,什么也没写!
rt_thread_startup调用时,如果新启动的线程优先级比系统当前运行线程优先级高,将立刻切换到这个线程。回到你的问题,无论是send_thread还是receive_thread线程,都是系统目前最高优先级的两个任务(数字越小越优先,2和3优先级都挺高),谁先启动运行谁没毛病。 这只是rt_thread_startup()这个函数的规则而已,优先级的意义更多还是在于系统运行时任务的调度和抢占上 —— 执行调度时,若有比当前线程优先级更高的线程就绪,当前线程将立刻被换出,高优先级线程抢占处理器运行。 楼主大可不必过于纠结启动时这一点细节,总之,优先级还是有用、有效的。
国际哥
2019-07-27
这家伙很懒,什么也没写!
[i=s] 本帖最后由 国际哥 于 2019-7-27 11:21 编辑 [/i] >求大佬 --- 大佬大佬
qiudashan
2019-07-28
这家伙很懒,什么也没写!
>大佬大佬 --- “无论是send_thread还是receive_thread线程,都是系统目前最高优先级的两个任务(数字越小越优先,2和3优先级都挺高),谁先启动运行谁没毛病”。。。。。这段没明白。。。。意思是初始启动阶段无所谓优先级?
Ernest
2019-07-29
这家伙很懒,什么也没写!
先上结论:自己坑自己 高优先级线程延时 1 秒,低优先级延时 0.1 秒,就出现了日志的现象
小小小菜鸟
2019-07-29
这家伙很懒,什么也没写!
main()也是一个线程,而且优先级比你send_thread,receive_thread低,相当于说你mian函数初始化第一个线程,就被第一个线程抢占,直到第一个线程挂起,mian再来初始化第二个线程。所以就会出现你说的这种现象,谁放在前面谁先执行。
黄侃
2019-07-29
这家伙很懒,什么也没写!
前面几个说的都不对,只有楼上是正解,main本身也是一个线程,优先级为10,当你创建第一个线程,优先级为3,并且执行了rt_thread_startup时,就已经跳转了。等跳转回main才回去执行下面的的创建优先级为2的线程。 另外不要使用yield
qiudashan
2019-07-29
这家伙很懒,什么也没写!
>先上结论:自己坑自己 > >高优先级线程延时 1 秒,低优先级延时 0.1 秒,就出现了日志的现象 --- 两个线程的打印都还没有到延时的位置啊
qiudashan
2019-07-29
这家伙很懒,什么也没写!
>main()也是一个线程,而且优先级比你send_thread,receive_thread低,相当于说你mian函数初始化第一个线程 ... --- 您是大佬啊{:2_39:}
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
qiudashan
这家伙很懒,什么也没写!
提问
2
回答
10
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
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组件
最新文章
1
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部