你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

rtos的线程同步的方法

[复制链接]
一花一世界003 发布时间:2015-2-11 10:21
大家看我前一主题帖上面的图了吧 QQ截图20150209184227.png , C) K" J9 z& y: o
7 r) c7 m9 e8 [& ~6 H
输出大概是这个样子,但是为什么会有乱码呢?难道是实时操作系统线程出问题了吗?1 B- d. U* m/ i' x2 J0 _
这里就要说一下显示乱码的原因了4 S1 G3 c1 M; x5 A9 _/ w
之所以需要线程同步是因为在多线程并行执行的情况下,有可能会造成多线程同时使用同一系统资源的情况,从而造成冲突的发生,影响程序执行的正确性,在操作系统中一般使用互斥锁与信号量来实现线程同步2 l3 @5 P' T' P' v5 I
只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享
( ~; m; Q- k9 P. a0 R信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目' Z& B/ \, w' f. V# M. E0 X5 k
所以,我们可以给线程在调用时加个判断,判断的内容就是线程里面的信号量或者是互斥量。) U) Y" y+ g6 e- X) _! q5 o. s
#include "rtos.h"
0 H% _! S6 g' A$ `$ ^$ p% N#include "mbed.h"
( U. M: j5 r! _& Z+ ~8 QSerial pc(USBTX,USBRX);; t( i! `, E3 E6 F
1 J3 r3 X, I) `
Mutex stdio_mutex; // Semaphore slots(1);
! Q" |3 ]) u5 x& c5 j- |
$ A# C) r1 P1 J8 S4 k6 _2 ouint8_t theadindex[3];
1 E5 @0 P! [1 n9 }2 ?' A. Y6 H$ B& l: N3 p2 i9 R& [! N
long count[3];" z; s8 j% @7 V/ D6 E# U, N/ x
9 X1 _- z  f9 I( f% N1 j
void printstr(void const *args)
# ]& G* o8 e5 q8 Y
3 z8 w. z) o+ j* Z0 x. N5 `2 @$ }{& h3 o3 E( \6 c

4 A. S7 u: l' Y2 G0 r    while (true) {/ y% J% h7 |  J  V3 I

7 R( m( K% d* V& o' K9 F                        stdio_mutex.lock();//slots.wait();
* q, L7 D. Q5 u1 S! B$ d5 F
5 D% d. r3 B/ s7 g% J- _                        pc.printf("Hello World,My Thread Name is %d,Thread ID is %d.\n",*(uint8_t *)args,Thread::gettid());
$ K. e6 I. H  Q( ?# `( K7 P
8 v5 w& s$ E% V  X/ L, O+ D7 O( F                        count[*(uint8_t *)args-1]++;) u1 p3 D2 n8 f/ P: @) C
4 Y8 I* O8 P$ r! T' W( V
                        stdio_mutex.unlock();//slot.release();
0 _2 T# i9 V; r3 D; M" b( N+ i$ `8 r. _6 A3 [
                        Thread::yield();9 ?8 ~  @0 G, X0 ^  e# \

# K% k: {+ h6 G5 [) b. j- w) }( L    }3 P: }( _$ {/ v: z- T+ S  S" |
* |1 m7 h; a" Y0 Y# d1 g# h
}$ }" k' Q1 M( `

$ M" F/ a+ B* \$ Pint main() ) b- {; j+ Q" m* ^1 c' _* J

; K0 e$ P$ |/ a4 B{
2 R! o: n' [& h! C+ v, o9 s% b
    theadindex[0]=1;
6 J0 S) @. r7 h! A  i
6 R$ K2 Y% W, m) t7 E    theadindex[1]=2;+ p+ s6 J$ ^/ A: h- `
5 B# X! [% u% P/ A- X( ?
    theadindex[2]=3;
, e- ~' E# g# g5 L+ v
6 a! o1 |2 k: g+ u. @" A    Thread thread1(printstr,(void *)theadindex,osPriorityNormal);- o* v/ g3 J7 c2 N+ N! g4 f

. W* Z* J+ Y" b# }! s    Thread thread2(printstr,(void *)(theadindex+1),osPriorityNormal);
, j4 n0 c! g$ X- l
# y, o( D" z6 Z! w) L8 J: w    Thread thread3(printstr,(void *)(theadindex+2),osPriorityNormal);- {; d  q- K6 G3 O) \7 G" x: F+ y

/ X; W* D, O  t) V  x    while (1)- [: |( [) D) R$ N8 D

: Z, m. l9 I, ^/ O/ J. N    {
( R2 a' A! \+ R! V+ w' c, z. n
9 N& I; w7 c9 X- Q+ ]9 B                        stdio_mutex.lock();//slots.wait();
' A! A  X6 D$ S  _1 B; L8 u, i& m. ?& m! M% k1 Y, T5 q! A
                        pc.printf("Thread1 count is %ld,Thread2 count is %ld,,Thread3 count is %ld. \n",count[0],count[1],count[2]);0 ^) b/ k; p7 A
5 J. T9 x0 K" d( Y" i, N
                        stdio_mutex.unlock();//slot.release();7 k+ l- \- c: y# z7 p  F

% _& v" o* [: e, t" s! T8 ^8 b                        Thread::wait(1000);
# T" a& G! \/ U& P  G" V7 h% V& Z( g) q' [: B1 s, \/ b! g
    }
  c- V  C0 d+ ]% z% b }7 X- E& b4 e  B; d1 b4 X
mbed-rtos另外还提供了一种称为Signals(信号)的精简同步模式,在这种模式下,一个线程必须等到特定的信号到来才继续,而另外一个线程则负责发送该信号
1 I& @# F! N9 x- c; N8 J QQ截图20150211101941.png
1 v. u$ ?% \8 X

0 x& H, |0 {6 |. `  X
赞 收藏 评论10 发布时间:2015-2-11 10:21

举报

10个回答
埃斯提爱慕 回答时间:2015-2-11 11:03:50
提示: 作者被禁止或删除 内容自动屏蔽
aderson 回答时间:2015-2-11 11:37:03
看来我也要学习一下了,看起来好好玩的样子
默罕默德.ST 回答时间:2015-2-11 11:45:31
hdx.jpg
默罕默德.ST 回答时间:2015-2-11 11:45:47
aaaaaaaaa.jpg
lkl0305 回答时间:2015-2-11 12:34:41
学习下!!
蚂蚁 回答时间:2015-2-11 14:26:22
非常好,学习了一下
蚂蚁 回答时间:2015-2-11 14:26:38
非常感谢楼主的分想
北斗光寒 回答时间:2015-2-11 14:46:42
帮顶,还没有用过RTOS
埃斯提爱慕 回答时间:2015-2-12 11:18:46
提示: 作者被禁止或删除 内容自动屏蔽
一花一世界003 回答时间:2015-2-12 12:39:02
我会发更加好的帖子的
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版