关闭
搜索
搜索
本版
帖子
用户
热搜:
程序员
简洁模式
高级模式
用户组: 游客
消息
提醒
新听众
我关注的
帖子
道具
勋章
任务
设置
退出
请
登录
后使用快捷导航
没有帐号?
立即注册
设为首页
收藏本站
开启辅助访问
切换到窄版
登录
or
立即注册
快捷导航
搜索
首页
论坛
BBS
MCU单片机技术
程序员交流
基于51内核ucos操作系统任务模块的移植
[复制链接]
作者:
boboming0926
版块:
›
灌水·股票·程序员大本营·工作之余需要点阳光·我们不只是工程师
›
IT业界资讯
发布时间:
2018-11-28 16:02:21
915
0
返回列表
boboming0926
当前离线
新手上路
新手上路, 积分 24, 距离下一级还需 26 积分
新手上路
新手上路, 积分 24, 距离下一级还需 26 积分
积分
24
发消息
楼主
电梯直达
boboming0926
发表于 2018-11-28 16:02:21
|
只看该作者
|
倒序浏览
|
阅读模式
本文为原创文章,转载请注明出处。
μ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消息队列,敬请期待。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
收藏
0
相关帖子
•
谷歌可能让Fuchsia可原生运行Android和Linux应用程序
•
Ansible自动化工具安装、配置和快速入门指南|Linux中国
•
如何在Windows上运行ApacheKafka?
•
Linux中18个不可错过的趣味命令,最后一个杀伤力过大!!
•
Linux上的5种最佳Android模拟器
•
世界三大操作系统,你在现实生活中更愿意选谁?
•
这些Linux的“自动化”技巧,教你轻松完成任务
•
几个高逼格Linux命令
•
Java入门-“你好,世界”forNetBeansIDE
•
java013:JDK,JRE,JVM之间的关系
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
表情
@朋友
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
招聘&找工作
生活交流*灌水区*工程师滋润生活*
快速回复
返回顶部
返回列表