Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于RTT系统下如何处理线程的种种,工程实例
发布于 2014-09-15 16:49:40 浏览:2724
订阅该版
在MCU上了系统(如RT-Thread,UCOS等)的基础下, 我们应该如何管理我们各个线程? 如何分配线程的优先级别呢? 而又在何时让出CPU的控制权,是Delay的方式让出还是阻塞的方式? 带着这些疑问我们以一个工程实例来讲讲实际的处理方式: 在本项目中一共有4个thread组成: Sensor_Thread 采集传感器数据,对应硬件如AD 生产者 GPRS_Thread GPRS通信模块,负责将采集的数据发送到Server 消费者 LCD_Display_Thread 将采集的数据显示到LCD上 消费者 LED_Tip_Thread LED灯的闪烁用来表征系统正在采集数据,或者运行状态 消费者 为了便于分析,我们首先画出数据大概的流向: ![QQ截图20140915153906.jpg](/uploads/6216_9b0e7823cb81c07461dd435fd6a9f1e1.jpg) 显然易见,数据都是Sensor_Thread这个线程中发出去,供给另外三个消费者使用,按照操作系统的基本概念划分, 这里唯一的生产者便是Sensor,参见表格,而嵌入式系统设计中,消费者的优先级应该高于生产者,这样优先消费, 当消费者消耗完所有的产品以后,就会进入阻塞状态,从而让出机会让生产者来生产,如果生产者的优先级高于 消费者就会出现货物堆积。 笔者以前这么处理的,GPRS的线程最高,然后运行一会儿Delay给Sensor采集,然后再Delay给LCD,LED显示, 说实话这样做了以后我心里自己都很乱,我根本不知道系统在某一刻运行到了那里,数据交互也都是用的全 局变量,也不知道线程让出是Delay还是我时间片的时间到了,虽然表面看起来也能用,但在我心底就像定 时炸弹一样不知道什么什么时候会出现问题。 正确的做法应该什么样子呢,最简单的办法,这里我们需要三个队列FIFO,需要实时传输数组数据,这里 我们用队列来实现,将3个消费者的优先级设置为相同比如1,而Sensor_Thread的优先级为2,系统空闲 线程Idle_Thread为3。 系统开始运行,同级别的假设GPRS先运行,然后因为FIFO1为空,发生阻塞,然后转到同级别的LCD运行, 同样因为FIFO2发生阻塞,然后FIFO3阻塞,这样三个线程都挂起了,此时轮到Sensor线程入场, 如果Sensor中数据采集为轮询方式可以通过Delay的方式释放控制权给IDLE, 毫无疑问轮询方式的效率最低,可以改成定时轮询,或者中断方式来采集数据, 在中断中释放信号量,平时Sensor因为无法取得信号量而阻塞交由IDLE实现。 当Sensor取得相应数据,先往FIFO1里面填充,因而FIFO1不再阻塞,GPRS得到运行, 当GPRS自己时间片运行结束或者时间片未结束已经到了第二个循环因为FIFO1空再次阻塞, 此时再次转到转到Sensor,Sensor再填充FIFO2,依次循环,这大概是整个的一个循环过程。 而我们所做的就是规划好同级别优先级的时间片的长短,或者分割成不同优先级, 这样就不要关心线程时间片设置为多少了,在一些不能打断的线程, 比如GPRS连接服务器发送数据的过程中因为时间片耗尽而被打断,进入另外一个线程,将会是很尴尬,或者不可预料的事情。
查看更多
5
个回答
默认排序
按发布时间排序
KiraVerSace
2014-09-16
这家伙很懒,什么也没写!
怎么还没有人回复呢
bernard
2014-09-16
这家伙很懒,什么也没写!
忙,忙,超级忙…… 粗略看了下,其他几个线程分别等待邮箱或消息队列即可,不应该用delay。
grissiom
2014-09-17
这家伙很懒,什么也没写!
delay 肯定是不对的~ LZ 应该参考 MVC 的设计模式。http://zh.wikipedia.org/wiki/MVC
grissiom
2014-09-17
这家伙很懒,什么也没写!
其实 LZ 最主要的一个问题就是一对多的同步问题。邮箱,信号量等同步方式在这个场景下的问题是里面的资源只要是被一个线程消耗了,就无法被其他线程消耗了。所以这里是无法用一个邮箱去实现的。 所以要用多个邮箱。如果 AD 值在 32 位以下,生产者采集完 AD 之后,可以直接塞到三个邮箱里,同时唤醒 GPRS,LCD,LED 线程,让他们去竞争 CPU。这里需要生产者的优先级最高。 如果数据在 32 位以上或者还有其他附件数据,需要把结构体指针塞到邮箱里。这里需要做好引用计数,避免资源被错误的释放。 其他的应该没有了。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.7k
关于作者
KiraVerSace
这家伙很懒,什么也没写!
提问
9
回答
13
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
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在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
16
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部