Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
[请教]RT-Thread线程调度的CPU出让问题
发布于 2018-11-23 17:10:27 浏览:1687
订阅该版
* 本帖最后由 aozima 于 2018-11-24 10:28 编辑 * 在《RT-Thread内核实现与应用开发实战指南》中断管理那一章,定义了两个线程,优先级不一样,两个线程中都没有调用延时函数,这种情况下不是应该一直执行优先级高的线程吗?是怎么进入优先级低的线程呢? ```/** ********************************************************************* * @file main.c * @author fire * @version V1.0 * @date 2018-xx-xx * @brief RT-Thread 3.0 + STM32 动态内存管理 ********************************************************************* * @attention * * 实验平台:野火 F103-MINI STM32 开发板 * 论坛 :http://www.firebbs.cn * 淘宝 :https://fire-stm32.taobao.com * ********************************************************************** */ /* ************************************************************************* * 包含的头文件 ************************************************************************* */ #include "board.h" #include "rtthread.h" #include
/* ****************************************************************** * 变量 ****************************************************************** */ /* 定义线程控制块 */ static rt_thread_t key_thread = RT_NULL; static rt_thread_t usart_thread = RT_NULL; /* 定义消息队列控制块 */ rt_mq_t test_mq = RT_NULL; /* 定义信号量控制块 */ rt_sem_t test_sem = RT_NULL; /************************* 全局变量声明 ****************************/ /* * 当我们在写应用程序的时候,可能需要用到一些全局变量。 */ /* 相关宏定义 */ extern char Usart_Rx_Buf[USART_RBUFF_SIZE]; /* ************************************************************************* * 函数声明 ************************************************************************* */ static void key_thread_entry(void* parameter); static void usart_thread_entry(void* parameter); /* ************************************************************************* * main 函数 ************************************************************************* */ /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { /* * 开发板硬件初始化,RTT系统初始化已经在main函数之前完成, * 即在component.c文件中的rtthread_startup()函数中完成了。 * 所以在main函数中,只需要创建线程和启动线程即可。 */ rt_kprintf("这是一个[野火]-STM32F103-MINI-RTT中断管理实验!
"); rt_kprintf("按下KEY1 | KEY2触发中断!
"); rt_kprintf("串口发送数据触发中断,任务处理数据!
"); /* 创建一个消息队列 */ test_mq = rt_mq_create("test_mq",/* 消息队列名字 */ 4, /* 消息的最大长度 */ 2, /* 消息队列的最大容量 */ RT_IPC_FLAG_FIFO);/* 队列模式 FIFO(0x00)*/ if (test_mq != RT_NULL) rt_kprintf("消息队列创建成功!
"); /* 创建一个信号量 */ test_sem = rt_sem_create("test_sem",/* 消息队列名字 */ 0, /* 信号量初始值,默认有一个信号量 */ RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/ if (test_sem != RT_NULL) rt_kprintf("信号量创建成功!
"); /* 创建一个任务 */ key_thread = /* 线程控制块指针 */ rt_thread_create( "key", /* 线程名字 */ key_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 1, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (key_thread != RT_NULL) rt_thread_startup(key_thread); else return -1; usart_thread = /* 线程控制块指针 */ rt_thread_create( "usart", /* 线程名字 */ usart_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 512, /* 线程栈大小 */ 2, /* 线程的优先级 */ 20); /* 线程时间片 */ /* 启动线程,开启调度 */ if (usart_thread != RT_NULL) rt_thread_startup(usart_thread); else return -1; } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void key_thread_entry(void* parameter) { rt_err_t uwRet = RT_EOK; uint32_t r_queue; /* 任务都是一个无限循环,不能返回 */ while(1) { /* 队列读取(接收),等待时间为一直等待 */ uwRet = rt_mq_recv(test_mq, /* 读取(接收)队列的ID(句柄) */ &r_queue, /* 读取(接收)的数据保存位置 */ sizeof(r_queue), /* 读取(接收)的数据的长度 */ RT_WAITING_FOREVER); /* 等待时间:一直等 */ if(RT_EOK == uwRet) { rt_kprintf("触发中断的是KEY%d!
",r_queue); } else { rt_kprintf("数据接收出错,错误代码: 0x%lx
",uwRet); } LED1_TOGGLE; } } static void usart_thread_entry(void* parameter) { rt_err_t uwRet = RT_EOK; /* 任务都是一个无限循环,不能返回 */ while (1) { uwRet = rt_sem_take(test_sem, /* 获取串口中断的信号量 */ 0); /* 等待时间:0 */ if(RT_EOK == uwRet) { rt_kprintf("收到数据:%s
",Usart_Rx_Buf); memset(Usart_Rx_Buf,0,USART_RBUFF_SIZE);/* 清零 */ } } } /********************************END OF FILE****************************/```
查看更多
3
个回答
默认排序
按发布时间排序
whj467467222
认证专家
2018-11-23
开源,分享,交流,共同进步
rt_mq_recv里面有一个RT_WAITING_FOREVER,你去官方的编程指南看下这个是什么意思。
aozima
2018-11-23
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
楼上正解
beike0311
2018-11-26
这家伙很懒,什么也没写!
多谢,我明白了,rt_mq_recv会导致当前线程由运行状态转为挂起状态,转而去执行优先级低的线程。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.7k
关于作者
beike0311
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
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
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部