移植uCOS-II到C51 - 2

原创 2007年10月13日 20:40:00

现在再来回顾一下要今天要弄清楚的几个问题:
1)任务堆栈如何设计,如何初始化(保存那些内容,放在什么地方)
2)任务切换何时发生,如何发生(现场保护和恢复)

先来看看uCOS-II移植到80x86PC的版本。
No.1 堆栈的分配
每个任务都分配了一块的RAM空间,这个没啥好说的。分配时数据类型为OS_STK,与编译器相关

No.2 堆栈的初始化
由OSTaskStkInit()函数完成,这一点从函数的名称就能看出来了。这个函数是在OSTaskCreate()中被调用的。“将堆栈的结构初始化成看起来好像刚刚发生过中断一样”,嗯,这句话说得太形象了。看看这个函数都做了些什么:从栈顶位置开始,顺次模仿任务的调用,模仿中断,模仿PUSHA,模仿PUSH ES,最后是模仿PUSH DS。那么,任务被调度的时候会发生些什么呢?以上的事情会被重做,只是顺序刚好相反。这个顺序应该要保证任务可以正常的、从第一条语句开始执行。看看OSCtxSW()后半部分的代码就会知道情况是不是这样。我们每个任务都有一个任务控制块OS_TCB,OS负责管理这些OS_TCB,当任务被挂起时,OS_TCB保存了任务的状态。OS_TCB的第一个成员就是一个指向任务栈顶的OS_STK*指针(这个成员在OSTaskCreate()函数中用OSTaskStkInit()函数的返回值初始化)。当确定要被调度的任务(已就绪的优先级最高的那个)以后,从对应的OS_TCB中取得栈顶指针,然后写入堆栈寄存器SS和SP,然后是POP DS, POP ES, POPA, IRET,正好与OSTaskStkInit()所做的相反。此时,CS:IP指向了任务的入口地址,而SS:SP指向任务的返回地址(实际没有意义,因为每个任务都是死循环,不会返回),SS:SP+4指向任务的参数地址。“看起来像是任务被一个普通函数调用了”,只是这个主调函数并不存在。

No.3 任务切换何时发生
这一点现在看也很清楚,每个任务都会在执行一段代码后主动放弃对CPU的控制权,这时候就可以进行任务切换了。比如OSTimeDly()函数会调用OS_Sched(),使就绪状态中优先级最高的任务恢复执行。

No.4 现场保护和恢复
现场的保护,我想应该和OSTaskStkInit()函数所做的差不多,只不过模仿中断的部分,入栈的应该是CS:IP。现在来看OSCtxSW()函数的前半部分代码:PUSHA, PUSH ES, PUSH DS...让我们把整个过程串起来看看到底怎么回事。首先,一个任务调用OSTimeDly()将自己挂起,OSTimeDly()调用OS_Sched(),OS_Sched()确定要恢复执行的任务,然后调用OS_TASK_SW(),这是一个被定义为asm{INT 0x80}的宏,而0x80的中断向量就是OSCtxSW()。由于在执行INT这条软中断指令时,中断返回地址和PSW已经被压栈了,因此在OSCtxSW()中省去了这些步骤。哈哈,果然是这样!至于现场的恢复,就是OSCtxSW()后半部分代码所做的工作,这在No.2中已经说明过了。  

下午,测试通过了一个移植好的uCOS-II v2.52版本,虽然只是在PC上模拟,还是颇费了一番周折。这个版本来自Stuart Wright,可以从www.uCOS-II.com 下载(如果这个网站打不开,可是试试www.micrium.com )。这份文件有些小小的错误,In my opinion,仅供参考:
1)文件 Readme.txt 第88、92、113行的 os_kcdef.h 应为 OS_KC51.h
2)文件 uCOS-II.h 第481、482行的 code 应为 const(否则编译时会发生redefinition错误,排除这个错误花了我可能有半小时时间。。。)

明天,看看C51的汇编指令参考,把SW的版本(MCU为Dallas 80C390)修改一下,应该就能在我自己的平台上工作了。工程模板也需要研究一下,那么多.C .H文件放在同一个文件夹下看起来实在是太乱了。。。

uCOS-II在51单片机上的移植

约定:文中所写的硬件堆栈或系统堆栈是指51单片机SP指针所指向的堆栈空间,而用户堆栈或任务堆栈是指用来保存任务状态为每个任务分配的堆栈空间。       前一段时间一直在学习UCOS-II...
  • u012138828
  • u012138828
  • 2014年08月20日 16:46
  • 2661

C51和MDK-ARM共存方法(uVision5)

相关博客 * linux配置stm32开发环境概述 1、所需材料 C51V954a.exe 链接: https://pan.baidu.com/s/1mh97gI8 密码: 5hik ...
  • ouening
  • ouening
  • 2016年08月22日 20:47
  • 13198

uCOS-Ⅱ C51移植笔记

uCOS-Ⅱ C51移植笔记 uCOS-Ⅱ C51移植笔记深圳中慧电子公司 CyberTeam 彭伟林(1)实时系统和前/后台系统;前/ 后台系统:一个大循环,循环查询各种标志位。如果标志位置位...
  • ruixj
  • ruixj
  • 2006年10月17日 15:38
  • 1771

移植uCOS-II到C51 - 1

昨天,终于把 C51的电路板焊好了。虽然很简单没啥新意,但是看着这块自制的"Hello, World!",我还是很高兴。毕竟,从原理图到PCB布局、布线,还有那些让我头疼的元件封装,都是我亲历过的,并...
  • tuhuo
  • tuhuo
  • 2007年10月12日 23:17
  • 1941

STM32移植uCOS-II系统(1)

uCOS-II移植 一、获得uCOS-II软件 1.打开http://micrium.com/downloadcenter/ 2.找到需要的MCU厂商 我用的是ST公司的STM32F103Z...
  • wshngyf
  • wshngyf
  • 2015年05月23日 22:00
  • 807

移植ucosII到STM32F103ZE(一)

http://blog.sina.com.cn/s/blog_abd39cc70101cl5w.html 一、开发环境: 1.         开发环境:     keil ...
  • sinat_27489187
  • sinat_27489187
  • 2015年12月30日 11:42
  • 1453

stc_ucos51单片机移植

  • 2013年12月11日 19:56
  • 303KB
  • 下载

关于嵌入式RTOS(UCOS-II)与C51区别简述

  • 2017年12月04日 14:50
  • 922KB
  • 下载

【stm32+uC/OS-II】ucosii移植简单详细步骤

μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系...
  • ieczw
  • ieczw
  • 2014年03月01日 11:21
  • 7169

C51的中断号排序规则

在编写中断服务程序(ISR)的时候需要知道中断号,用于通知51内核,这个中断服务程序是为了响应哪个中断的。那么,从以上这句简单的描述可以看出,中断号必然对应于中断服务程序的入口地址,而入口地址又与中断...
  • molake10344
  • molake10344
  • 2015年08月24日 13:52
  • 1222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:移植uCOS-II到C51 - 2
举报原因:
原因补充:

(最多只允许输入30个字)