glen_cao 发表于 2009-9-11 19:44:25

uCOS-II学习心得(-) 堆栈的处理

uCOS-II学习心得(一)
                                                       ——堆栈的处理
                                             glen_cao@126.com 2009-9-11
引言
使用uCOS-II来进行嵌入式产品的研发,使得软件的开发时间大大缩短,同时相对于linux学习入门比较简单。这也是近年有较多的工程师对此研究的一个重要原因。uCOS-II在产品研发过程中的优缺点有些文章已经作了较为深入的论述,我们就不再讨论。笔者在学习uCOS-II的过程中参考了邵贝贝教授编译的(《嵌入式实时操作系统uC/OS-II(第2版)》)书籍,给予我较为多的启示,同时也建议初学者尽量拥有一本作为参考资料。笔者认为作为uCOS-II的应用者(以区别研究人员),首先要搞清楚任务切换是如何进行的,这关乎到移植的成败。而任务的切换的关键点在于堆栈的处理。任务切换的处理集中在OS_CPU_A.asm文件中。接下来,我们分两种情况来讨论。
一、任务级切换时堆栈和处理(OSCtxSw)
uCOS-II的最小运行单位为任务,而任务的运行过程中不会主动放弃CPU的使用权,除非遇到以下情况之一。主动调用系统延时函数OSTimeDly()/OSTimeDlyHMSM()、等待一个事件的发生(包括OSSemPend(), OSMutexPend, OSFlagPend, OSMboxPend(), OSQPend(),以下涉及的OS???Pend()即为上述几个等待/挂起函数之一)以及有中断打断了当前任务的运行且有更高优先级任务进入就绪态。我们把中断导致任务切换以外的任务切换称为任务级切换,而中断导致的任务的任务切换称为中断级任务切换。
uCOS-II总是运行就绪态中优先级最高的任务,即任务切换实际上是更高优先级任务进入了就绪态。而任务切换的实际上可分两步完成,1)将被挂起任务的处理器寄存器推入堆栈;2)将较高优先级任务的寄存器值从栈中恢复到寄存器中。在uCOS-II中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有处理器的寄存器都保存在堆栈中。我们对此作一下说明:
void TaskA (void * pdata)//优先级2             void TaskB (void *pdata)//优先级3
{                                             {
    while(1)                                    while(1)
    {                                             {
      …                                             …
      …                                             …
      …                                             …
      OS???Pend();// (1)                           OS???Pend();  // (2)
      …                                              …
      …                                              …
      …                                              …
      OS???Post();                                 OS???Post();
    }                                             }
}                                             }
假如任务(TaskA)在(1)处期待某一事件发生,而此事件恰又没有发生,那么TaskA就要被挂起,让其它就绪态更高优先级的任务如TaskB运行,即运行就绪态最高优先级任务。然而,TaskA等待的事件一旦到来,TaskA便进入就绪态。当TaskA再次获得CPU的使用权(假如TaskB挂起),我们希望TaskA从(1)处接着往下执行,而不是从头开始。那么在任务切换(如:从TaskA切换到TaskB)时就要保存TaskA任务的信息,如当前的PC指针、程序状态字等保存到用户堆栈中。而对于即将运行的TaskB则要从用户堆栈中恢复到系统堆栈,这样就可以保证TaskB从中断处继续运行。我们将其分成两步,
1)先保存TaskA的信息,如下图所示:
                  http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_480045.png
(原文件名:图1.png)
                                 图1 把当前任务栈保存到TaskA的用户栈
2)把TaskB任务的用户堆栈恢复到系统堆栈
               http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_480046.png
(原文件名:图2.png)
                                 图2 把TaskB任务的堆栈恢复到系统栈中
这样的话,整个任务切换过程就完成了。

glen_cao 发表于 2009-9-14 18:33:02

未完待续,其实我已经写到日记本中了,只是还没有录入罢了。

hcfwll 发表于 2009-9-15 00:58:48

顶,期待后续!!

tangfree 发表于 2009-9-15 09:26:28

期待,学习了。

ba_wang_mao 发表于 2009-9-15 14:46:18

glen_cao
顶,期待后续!!

glen_cao 发表于 2009-9-17 17:42:11

由于编辑贴子时有诸多不便,比如在WORD下编辑正常的文档,复制到这里会出问题,因此
把本人的原始版发给大家。但愿能为初学者提供些许帮助,不胜欣慰。

ourdev_482327.doc(文件大小:52K) (原文件名:uCOS-II学习心得(一).doc)

hassim 发表于 2009-9-17 20:31:32

哈哈,我也在学uC/OS-II.支持一下.

barryyan2007 发表于 2009-9-18 17:42:57

谢谢楼主,希望能够继续传授经验

glen_cao 发表于 2009-9-18 17:44:49

>>>>>>> 【7楼】 barryyan2007 谢谢楼主,希望能够继续传授经验
    更多的心得会在日后的学习过程中贴出, 呵呵!

    心得第一部分已经写完了,欢迎批评指导!

ch2003_23 发表于 2009-9-18 17:47:17

支持
谢谢

glen_cao 发表于 2009-9-18 18:08:02

在51内核移植的几个关键文件贴上来,其实是根据杨屹先生的版本改的,由于本人移植的是2.52版本,
减缩了杨先生的版本的复杂度,由于个人不是很乐意他的函数注解及书写格式,故把他的名字及其它无用信
息删去,在此谨明。
    点击此处下载 OS_CPU.H(文件大小:3K) (原文件名:OS_CPU.H)
点击此处下载 OS_CPU_A.ASM(文件大小:11K) (原文件名:OS_CPU_A.ASM)
点击此处下载 OS_CPU_C.c(文件大小:12K) (原文件名:OS_CPU_C.c)

jclhp 发表于 2009-9-18 18:20:53

顶 正想学习UCOS

yurifeng 发表于 2009-9-24 22:55:07

顶!!!!

bjj9217 发表于 2009-9-25 07:55:54

mark

googse 发表于 2009-9-25 08:09:52

mark

hobbyfirst 发表于 2009-9-25 08:15:36

MARK!

aysyjgw 发表于 2009-9-25 09:39:09

顶,期待后续!!

lbl88886666 发表于 2009-9-25 16:12:44

支持一下

ba_wang_mao 发表于 2009-9-25 17:14:14

强烈支持楼主。
  顶!!!!

sleet1986 发表于 2009-9-30 10:11:28

学习了。期待后续,一定要哦!!

shzhong 发表于 2009-10-7 10:33:39

支持!

glen_cao 发表于 2009-10-10 16:01:34

借此题发一文件《嵌入式系统构件》,UCOS的作者写的,现在绝版了。或许可以给学习UCOS的朋友们一点帮助
嵌入式系统构件.part1.rar(文件大小:6.25M) (原文件名:嵌入式系统构件 .part1.rar)
嵌入式系统构件.part2.rar(文件大小:5.14M) (原文件名:嵌入式系统构件 .part2.rar)

maomao2126 发表于 2009-10-11 12:22:21

谢谢楼主分享,学习一下

另外,楼上的附件无法下载,显示网页不存在。不知道什么问题

wowo 发表于 2009-10-11 14:34:05

顶一下,以前看过,哎,不搞这个了


我也在南京

glen_cao 发表于 2009-10-12 12:26:11

点击此处下载 ourdev_490623.pdf(文件大小:13.16M) (原文件名:嵌入式系统构件.pdf)

jclhp 发表于 2009-10-12 17:18:31

感谢楼主, 等待楼主后续

0620223 发表于 2009-10-24 09:18:02

ddddddddddd

duwai 发表于 2009-10-24 23:19:00

支持一把....

nsclaohu 发表于 2009-10-31 11:04:33

要学习楼主的奉献精神

xbqcxy2009 发表于 2009-11-16 17:03:16

值得学习。。。

Liuyk_0321 发表于 2009-11-17 11:19:35

很不错,这段话可以节省我几天时间的,谢谢噢!

mymach 发表于 2009-11-17 22:40:12

学习了,谢谢楼主!

vannius 发表于 2009-11-18 15:55:28

非常感谢

alexmayer 发表于 2009-11-18 16:21:50

感谢楼主

algebra 发表于 2009-12-4 11:24:29

支持原创!!

pijianguo 发表于 2010-12-1 14:14:34

谢谢楼主的辛勤劳动!!

avrgogo 发表于 2010-12-1 15:17:26

这个要顶,正想了解一下

williamhoa 发表于 2010-12-14 09:32:25

看完此贴,感觉楼主对任务切换认识深刻,最近小弟也在看任务切换,不过遇到几个问题,不能理解,还望大哥给予指教。我给一个链接如下(关于任务切换的问题):
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4452318&bbs_page_no=1&bbs_id=3004

kihell 发表于 2011-3-20 14:24:05

ZHICHI 支持啊 不错

xf331785508 发表于 2011-3-22 10:46:14

看完了,楼主的分析很明了!

cmjs 发表于 2011-4-12 23:21:21

mark

iron2011 发表于 2011-4-16 00:14:56

mark

CHENXIAOTIAN 发表于 2011-4-16 05:38:05

MARK

fany12345 发表于 2011-4-18 09:38:22

学习中,真的很感激!

YUCHEN16 发表于 2011-5-8 21:14:58

不知道论坛上的朋友有没有在DSP上移植ucos代码的经历,有的话大家讨论下!

673104326 发表于 2011-6-2 08:58:45

mark!

iirf 发表于 2011-6-7 21:40:19

mark!!51移植

gaoyi3052 发表于 2011-6-7 22:27:28

好东西啊

l09046162 发表于 2011-9-24 11:48:25

支持楼主!!!!谢谢楼主分享!!!!

512826028 发表于 2012-2-1 10:48:29

楼主讲的真的不错啊!看了这个,让我也想到要自己写好笔记啊!
MARK

blavy 发表于 2012-5-5 11:22:13

{:biggrin:}mark,最近也在研究任务系统。
页: [1]
查看完整版本: uCOS-II学习心得(-) 堆栈的处理