⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os.txt

📁 本文面向首次接触uC/OS-II的程序员
💻 TXT
📖 第 1 页 / 共 4 页
字号:
初始化函数OS_TCBInit()中值得注意的是一个参量:prio——任务的优先级。这个参量在后面的就绪表中的使用,我个人觉得是这一个月来的学习当中遇到的最为巧妙也是最为精彩的一个。 
UID116517 帖子18 精华0 积分227 阅读权限100 在线时间6 小时 注册时间2008-10-30 最后登录2008-11-17 查看详细资料
 引用 使用道具 报告 评分 回复 TOP 
 

Merphy 
开发助工



个人空间 发短消息 加为好友 当前离线  2# 大 中 小 发表于 2008-11-6 14:48  只看该作者 
写给各位同道
希望大家能自己先看看书,我在帖子中都加上了明确的页数。6 A! t4 w/ _3 D  d3 {, n
而不要回复那些诸如“看看”“学习学习”之类的没有意义的语句。
; C. ^) @/ }' _" k, @9 j我希望看到的是你们对于这个操作系统的自己的看法和见解
# t  U% G. F% g9 T6 k8 p这样我们的技术论坛才不会变成水池,谢谢 
UID116517 帖子18 精华0 积分227 阅读权限100 在线时间6 小时 注册时间2008-10-30 最后登录2008-11-17 查看详细资料
 引用 使用道具 报告 评分 回复 TOP 
 

Merphy 
开发助工



个人空间 发短消息 加为好友 当前离线  3# 大 中 小 发表于 2008-11-6 15:04  只看该作者 
就绪表
邵贝贝翻译的《uc/OS-II》第二版
9 t7 J3 H: n" \& ~' ]) S第88页——章3.04    就绪表
: B& c) Q: {& K9 f6 z前面说过了,任务有五种状态,而且Labrosse先生将他的操作系统设计成具有可抢占的系统。
3 x/ x$ ]) r" X! i" ]7 f因此优先级就显得非常重要。他在设计这个功能时很是花了一番功夫。
, ~$ C  K: M' ^  _他设计了一个重要参数:prio
) Y, d6 c# A. M/ p2 K) @8 |* J同时还设计了一个变量OSRdyGrp,一个位表格OSRdyTbl[8],一个优先级判定表OSUnMapTbl[256]
; G$ |$ c. Z# W* j2 r+ [; @他用这些东西实现了反映每一个就绪任务,并且找到优先级最高的那个就绪任务。很富有创造性,衷心佩服。% B; P+ C& ~* N# K+ B
# h3 T6 Y! y/ p& M9 y5 U- M. W
在任务控制块的讨论中我们应当注意到
5 i- F' @- Y) o7 p2 T" SINT8U--OSTCBStat——如果这个变量值==OS_STAT_READY时,任务进入就绪态。- J5 M: ?  t; ?0 k
那么就绪的任务要怎么样被操作系统察觉呢?* t" j& K8 S5 T9 u3 W
答案就是:就绪表。7 ~1 T8 r, Q9 T. J
就绪表分为两个部分,. {* R6 ^  Q+ I8 K
一个是八位的变量OSRdyGrp
$ M" R; v4 \& }  @一个是数组OSRdyTbl[]。
( F% w8 ^( Z1 E# L利用到的参量为任务的优先级变量INT8U. E$ k$ N4 ]4 }) j) u+ T/ o% n
prio0 w. P+ l# x/ a1 ?1 o
现在的ucos设计为只能管理64个任务。因此数组OSRdyTbl[]至多有8个元素。这两个部分的对应图如下:& R. [' n& |- t8 l
 
UID116517 帖子18 精华0 积分227 阅读权限100 在线时间6 小时 注册时间2008-10-30 最后登录2008-11-17 查看详细资料
 引用 使用道具 报告 评分 回复 TOP 
 

Merphy 
开发助工



个人空间 发短消息 加为好友 当前离线  4# 大 中 小 发表于 2008-11-6 15:05  只看该作者 
对应图
对应图如下
附件
 对应图.JPG (32.2 KB) 
2008-11-6 15:05 

 
 
UID116517 帖子18 精华0 积分227 阅读权限100 在线时间6 小时 注册时间2008-10-30 最后登录2008-11-17 查看详细资料
 引用 使用道具 报告 评分 回复 TOP 
 

Merphy 
开发助工



个人空间 发短消息 加为好友 当前离线  5# 大 中 小 发表于 2008-11-6 15:11  只看该作者 
操作原则:- M# L! O0 x) E4 V7 V
每八个任务分为一组,占用一个数组元素,每个任务就绪标志就占用一位。共8*8=64个任务。每个任务有唯一的从0到63范围内的优先级值。, d# f; r  u, ]7 D0 h. S9 Z, s3 ^
OSRdyTbl[0]à OSRdyGrp.0 
+ N' M7 I1 G5 k9 |6 e9 ?OSRdyTbl[0]中任何一位为1,则OSRdyGrp.0=1;# w+ P) h: t0 C/ i  K
OSRdyTbl[1]à OSRdyGrp.1 
5 E% X9 E) u1 WOSRdyTbl[1]中任何一位为1,则OSRdyGrp.1=1;8 q* J; ]  p% W
OSRdyTbl[2]à OSRdyGrp.2 7 c$ j6 V0 B0 H
OSRdyTbl[2]中任何一位为1,则OSRdyGrp.2=1;
9 e+ U+ D/ L! [* s6 B6 gOSRdyTbl[3]à OSRdyGrp.3 " M: h8 k2 A4 J5 a. H4 u
OSRdyTbl[3]中任何一位为1,则OSRdyGrp.3=1;2 j0 I8 V' F* n$ J
OSRdyTbl[4]à OSRdyGrp.4 
7 K0 ]! l( l, K( _( E$ fOSRdyTbl[4]中任何一位为1,则OSRdyGrp.4=1;; D. @) W3 \0 ^4 ?
OSRdyTbl[5]à OSRdyGrp.5   J3 j# a% E8 B0 D
OSRdyTbl[5]中任何一位为1,则OSRdyGrp.5=1;
& ]; ~/ n! s& u, F9 z* J  BOSRdyTbl[6]à OSRdyGrp.6 
) q& `, v4 c" s* Z1 ?OSRdyTbl[6]中任何一位为1,则OSRdyGrp.6=1;& U1 H% n% f1 C9 g/ b
OSRdyTbl[7]à OSRdyGrp.7 ' n; U" D- l9 P/ r0 n
OSRdyTbl[7]中任何一位为1,则OSRdyGrp.7=1;
5 h- e; l6 `; f8 i% l/ S, {1 P8 \) A  \' [) C3 z4 J5 p; P
为实现这个对应规则,作者定义了一个常量数组
3 I* L0 n2 i$ Q, V: \* C% jOSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}! H0 I' }: q3 s; ~
有了 OSRdyGrp! Z% ]: A: w9 S' [
  OSRdyTbl[8]
: Z- V$ {; ~! y% Z  OSMapTbl[8]" [6 H' u- O( @0 D7 t
以及 prio4 k( n8 l8 B; g  D
使用一个语句就可实现这个对应规则:OSRdyGrp | =OSMapTbl[prio>>3];; u. y( R# R1 Q  P% l
解释:9 l6 Y- C5 m. T3 `( y
(1)prio>>3 ——优先级右移3位,相当于除以8,除以8之后就可以得到prio在数组元素的位置了! [" c; r% |6 H* g
(2)OSMapTbl[prio>>3]就可以得到OSRdyGrp所需的掩码值. n% E: c& x' j1 E# W3 W0 {  y
(3)OSRdyGrp | OSMapTbl[prio>>3]就可以得到新的就绪任务的组。注意是相或|而不是相与。相与之后就会让之前的所有就绪状态失去。/ {( I' Q- K7 Z4 b) O1 f+ N1 p
这样就确定了任务的优先级在表中的元素位置。2 U1 ?2 s6 `- }; J
使用这一个语句可以得到某个任务优先级所在数组元素的具体哪一位:! S0 j1 \! v+ d" b( ]% _% E
OSRdyTbl[prio>>3] | =OSMapTbl[prio&0x07];) }2 s2 |% y1 X
解释:
' ^. K" e3 e! ?( f(1)OSRdyTbl[prio>>3]得到该任务在就绪表的元素位
$ a! U  k3 S9 [4 H- Q3 n(2)prio&0x07之后得到prio的最低的三位,即prio在数组元素中的具体哪一位
% s$ H9 p4 {  y(3)OSMapTbl[prio&0x07]得到该位的掩码
# g- Y: W2 r( |4 m, N; w(4)将就绪表中的OSRdyTbl[prio>>3]与掩码相或之后就可以得到所在的准确位置。相当于把这个数组看成了由二进制位组成的一个二维表格。- V! @4 f' }0 E9 l1 @; Y9 `8 }
总结,使一个任务进入就绪态,就是让该任务的优先级变量prio在就绪表中置1。在就绪表中置1有两项工作内容,一个工作是在8位无符号整型变量OSRdyGrp的相应位置1;另一个工作是在数组OSRdyTbl[8]中准确位子置1。用下面两个式子就可以完成:% R! f) c. T' {
OSRdyGrp | =OSMapTbl[prio>>3];
; q' d1 A) i! XOSRdyTbl[prio>>3] | =OSMapTbl[prio&0x07];
: l- P) O! g! s% o9 `7 e/ Q 
UID116517 帖子18 精华0 积分227 阅读权限100 在线时间6 小时 注册时间2008-10-30 最后登录2008-11-17 查看详细资料
 引用 使用道具 报告 评分 回复 TOP 
 

Merphy 
开发助工



个人空间 发短消息 加为好友 当前离线  6# 大 中 小 发表于 2008-11-6 15:19  只看该作者 
由此可以推论,让任务脱离就绪态,就是让相应的位清零。而与置位不同,由于OSRdyGrp与OSRdyTbl[]的特殊关系,需要只有当OSRdyTbl[x]=0x00时才将OSRdyGrp的相应位清零。* `& Y4 Z8 C& ~6 k
所以应当先从简单的入手:
% a. \6 x6 l8 o* z2 a+ M3 JOSRdyTbl[prio>>3] & = ~ OSMapTbl[prio&0x07];$ @/ {& T0 _) Y4 D
此时还不能将OSRdyGrp的相应位清零,只有当这个数组元素为0x00,才能将其清零。因此要加上一个判断条件:
# T* Q5 P+ Z# ^  E! D  W+ R/ _If ( (OSRdyTbl[prio>>3] & = ~ OSMapTbl[prio&0x07]) = = 0x00 ),只有当这个条件满足之后才能将相应位清零:OSRdyGrp & = ~ OSMapTbl[prio>>3];9 t5 w6 C7 M8 c8 l0 {3 X3 x
因此最终的执行语句是:
! P$ i  k. k* A2 w: I$ g# {' i# MIf ( (OSRdyTbl[prio>>3] & = ~ OSMapTbl[prio&0x07] ) = =0 )
6 X  ^$ v7 [& L  J8 h; M  OSRdyGrp & = ~ OSMapTbl[prio>>3];* P5 o# p% ~! D- A& A) Q0 ^

! _, `# |. d; z' T$ o. |最后一张表格OSUnMapTbl[256]
1 C! C. k, y' T这个表格是用于查找最大优先级就绪任务的表格,因此它的规则为:在所查的0x00到0xff,分别对应的是为1的最低位数,0x00按照优先级约定,最低位为0。
' _) d' F# k* J$ t6 G另外由规律可知:最低位(0)每隔一次(2的一次方-1)就会出现1;第二位(1)每隔三次(2的2次方-1)就会出现一次……
, k7 X: O) ~8 Y! A因此可得这张表:
- k( {6 B9 B+ o6 GINT8U const OSUnMapTbl[]={
! x$ \/ _% p1 T0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,% U. X& g, {! V. Y! R" t
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,& n  p) N- g2 Y6 r: D
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
* n$ E/ l% v: O6 b5 x5 i4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0," r- `. `- ]) h# Z, P
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,9 \0 J0 A4 x" [9 j9 y
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
& R6 d2 F' \9 z$ D5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
9 X$ u3 T9 v' o( L, |& l4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
- ^; _# n7 S6 r) {2 E7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,# J5 E1 q# I6 L, \* I) o1 O) \3 h5 u
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
! `3 T$ z+ `8 @9 ~8 D0 E! `5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
/ `# V# t4 W' `4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6 \# d; f  y8 T' a- z) q
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,1 u  m* G3 @/ h" ]4 ]! e; Q
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
' U2 m( O2 }( Z! u/ _5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0," q4 \$ s+ B: D$ u. f! W) E" I
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
( q  M& e& {7 Z7 V: T; z6 l}
; L9 A# n! p, z7 `7 s. z# H3 K) _因此使用这张表可以查出OSRdyGrp中为1的最低位,也可以查出OSRdyTbl[x]中为1的最低位
3 D1 o+ a6 X& h( n2 g- g6 B/ X8 c- v所以令:y=OSUnMapTbl[OSRdyGrp];& w' D( o* O% h1 I
              x=OSUnMapTbl[OSRdyTbl[y]];
! Y% O- w  s# E1 G/ K! a" h* X即可得到64个不同优先级中的最高就绪优先级。
7 z, ~4 U/ j5 q5 k  Z其优先级的值为prio=y*8+x,换成c语言就可以写成prio=y<<3+x;1 E8 {6 h3 B; |3 D5 D

! _, q# Y, g: K& {2 x) j再联系前面讨论任务控制块的时候提到的能让任务加速进入就绪态的算法; K7 O1 |# _* s; X& |' v! i
INT8U  OSTCBX = priority&0x07        : O( S' x, M( {% @( O* m
INT8U  OSTCBY = priority>>34 Z3 U9 _% X  J5 W$ Q  r
INT8U  OSTCBBitX = OSMapTbl[priority&0x07]
* N8 U8 i  l( q( Q( z0 _: [0 ?INT8U  OSTCBBitY = OSMapTbl[priority>>3]
7 `! ~5 [5 ^( h, s就可以一目了然了,之所以能加速,就是因为在编译程序的时候已经“算过”了最高优先级,那么在实际执行程序的时候就可以大大减少运算时间,那不就等于加速进入就绪态了吗?
 





社区门户 | 工程师俱乐部 | 开发博客 | 您的参与,使我们更强大! 
 Loading...nanyuanqi 退出 分栏模式 短消息
 会员
 搜索
 标签
 我的
 控制面板
 邀请注册
 道具
 帮助
 电子开发论坛 ? uC|OS-II ? [原创]uc/OS-II内核小析

?? 上一主题 | 下一主题 ?? 发新话题 发布商品  
收藏 订阅 推荐 打印 [原创]uc/OS-II内核小析 
Merphy 
开发助工

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -