开启辅助访问 切换到窄版

打印 上一主题 下一主题

基于51内核ucos操作系统任务模块的移植

[复制链接]
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文为原创文章,转载请注明出处。




μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,适合很多商业操作系统性能相当的实时操作系统(RTOS)。
作者使用的是国产士兰微SC51F2832芯片,为51内核, 内部RAM只有128字节,外部XRAM只有1792字节,另有32K的FLASH。内存相对于使用操作系统显得非常紧凑。 经过一个多月读通ucos内核,进行了移植,以下是移植后的心得:
1、任务跳转原理

众所周知,芯片的运行机制为运行PC指针所指向的程序块,运行完后PC自加指向下一个程序块,芯片继续运行PC所指向的程序,而任务的跳转就需要控制PC指针的指向。


然而在程序中我们无法直接控制PC的值,需要特殊的方法去审控制它:

在调试时不难发现,在我们运行到一个函数进出函数时堆栈指针SP就会进行自加,这表示在入栈, 入栈的是PC指针地址和通用寄存器值,然后PC指针跳转到函数入口。在函数运行结束时,出栈,把入栈的寄存器复原,并把PC的指针复原。这样就能改变PC指向,而我们利用这一特性去改变堆栈的值从出栈去控制PC指针。

在任务跳转时将任务A状态保存到内存中,然后跳转运行其它任务,在任务A需要继续运行时将内存中任务A的数据保存到堆栈中,出栈时就能恢复任务继续运行。



2、汇编程序

在keil C项目中加入汇编程序与在汇编项目中不大一样:

1>函数声明 : ?PR?函数名?所在文件名  SEGMENT CODE 例:
?PR?OSStartHighRdy?OS_CPU_A  SEGMENT CODE
2>声明引用全局变量和外部子程序: EXTRN CODE(_?外部C语言子程序名) 例: EXTRN CODE (_?OSIntExit)
3>汇编子函数入口:RSEG ?PR?函数名?所在文件名 出口: REIT
4>中断函数: CSEG AT xxxxH 中断地址 紧接 中断处理程序

3、芯片堆栈地址初使化:

在芯片驱动STARTUP文件中需修改 XBPSTACKTOP EQU 堆栈大小 的值 我使用的内部只有128字节的RAM,全部用来作为堆栈使用。即 :
XBPSTACKTOP  EQU  0x07F +1
4、每个任务所保存的堆栈大小:

任务堆栈即内存中虚拟堆栈,当该任务要暂停时,保存该任务状态。在要恢复时还原到系统堆栈。

而它的大小与该任务嵌套级别,任务中的局部变量多少有关,最小为24字节,如果不懂计算可在写程序前设置大一点。如果系统运行不正常时需要考虑任务堆栈是否 太小了。

  5、任务优先级:

ucos所采用的任务优先级我在前面有提过了,但由于内存限制,我改用了遍历的       方法,牺牲一些运行时间:

首先定义一个16位变量作为就绪表,最多可有16个任务,每一位为1是代表就绪,优先级按位数从低到高。这样做可以省2K的代码量


移植后运行正常,添加了5个任务,单控制模块 占用代码2K,RAM 400+  相比于原ucos 占用8K RAM 5K 来说 还是比较满意的。



源代码:
链接:http://pan.baidu.com/s/1VyReoqAcjECHUAGkrN8Img
提取码:t6qm


下期将讲 ucos消息队列,敬请期待。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表