嵌入式开发交流网论坛
标题:
基于51内核ucos操作系统任务模块的移植
[打印本页]
作者:
boboming0926
时间:
2018-11-28 16:02
标题:
基于51内核ucos操作系统任务模块的移植
本文为原创文章,转载请注明出处。
[attach]18735[/attach]
μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM
运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植
性,特别适合于微处理器
和控制器
,适合很多商业操作系统性能相当的实时操作系统
(RTOS)。
作者使用的是国产士兰微SC51F2832芯片,为51内核, 内部RAM只有128字节,外部XRAM只有1792字节,另有32K的FLASH。内存相对于使用操作系统显得非常紧凑。 经过一个多月读通ucos内核,进行了移植,以下是移植后的心得:
1、任务跳转原理
众所周知,芯片的运行机制为运行PC指针所指向的程序块,运行完后PC自加指向下一个程序块,芯片继续运行PC所指向的程序,而任务的跳转就需要控制PC指针的指向。
[attach]18736[/attach]
然而在程序中我们无法直接控制PC的值,需要特殊的方法去审控制它:
在调试时不难发现,在我们运行到一个函数进出函数时堆栈指针SP就会进行自加,这表示在入栈, 入栈的是PC指针地址和通用寄存器值,然后PC指针跳转到函数入口。在函数运行结束时,出栈,把入栈的寄存器复原,并把PC的指针复原。这样就能改变PC指向,而我们利用这一特性去改变堆栈的值从
出栈
去控制PC指针。
在任务跳转时将任务A状态保存到内存中,然后跳转运行其它任务,在任务A需要继续运行时将内存中任务A的数据保存到堆栈中,出栈时就能恢复任务继续运行。
[attach]18737[/attach]
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消息队列,敬请期待。
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/)
Powered by Discuz! X3.2