嵌入式操作系统μLC/OS-Ⅱ面向数控系统的改进

时间:2011-07-22来源:网络

3 需要修改的内核数据和函数
3.1 任务控制块的修改
(1)修改OSTCBDly的含义。在μC/OS-Ⅱ中,OSTCBDly表示任务延时的时钟节拍数,或者任务挂起时的超时时钟节拍数。如果这个变量为0,则表示任务不延时,或者表示等待事件发生的时间没有限制,修改后,OSTCBDly描述任务自运行的周期数,其计算公式如式(1)所示。若该项为零,任务为信号触发的随机任务。
b.JPG
(2)在TCB增加一项OSTCBDlyD作为任务自运行周期动态值。
INT16UOSTCBDlyD; /*任务自运行周期动态值*/其中,OSTCBDlyD是任务等待运行时间的动态值。若任务在等待态,其初值为OSTCBD-ly;若任务为挂起态,其初值为超时限制值。系统时钟处理函数OSTimeTick()对OSTCBDlyD减1,当OSTCBDlyD小于0时,则将该任务放入就绪队列。
(3)增加OSTCBStat的取值。OSTCBStat是任务的状态字。由于增加了停止态和等待态两种任务状态,因此需要增加OSTCBStat的取值,具体修改是在文件μCOS_II.H中增加下面信息。
#define OS_STAT_wAIT 0x40 //任务状态字为等待态
#define OS_STAT_STOP 0x80 //任务状态字为停止态
3.2 时钟节拍函数的OSTimeTick()修改
通过TCB数组扫描全部TCB,根据OSTCBStat的值做不同处理,具体处理如下:
就绪态的任务,OSTCBDlyD--,若有超时,则进行超时处理。
挂起态的任务,OSTCBDlyD--,若有超时,则将其插入就绪表。
等待态的任务,OSTCBDlyD--,若到时,则将其加入就绪表。
运行态的任务和停止态的任务,不做处理。
3.3 增加函数OSTaskEndDeal()
当前任务的函数运行完返回时,调用函数OSTaskEndDeal(),该函数完成工作:首先调用OSTaskStkInit()将该任务的堆栈初始化;然后判断任务是否为最低优先级任务,若是,则保持该任务在就绪态,这样做的目的是使最低优先级任务始终处于就绪态,就绪表不会为空。若否,则根据OSTCBCUR→OSTCBDly决定任务该插入哪个队列,该值等于零,任务进入停止状态;
不等于零,任务进入等待状态。最后,调用OSStart()选择新任务运行。
3.4 抢占式任务的实现
抢占式任务的设计需要根据实际情况做处理,这里以数控系统中的插补控制为例介绍抢占式任务的实现。
3.4.1 插补控制任务的功能
插补控制任务是根据加工命令和当前点的位置,实时计算各坐标轴运动的位移和方向。插补时需要用一个定时器作为插补速度的控制,每次定时中断触发一步插补运算和输出,当插补到终点,定时器停止,插补完成。
3.4.2 插补控制任务的实现
(1)选择一个硬件定时器作为插补专用定时器,将插补任务的代码放入该硬件定时器的中断服务程序中。
(2)为该中断设置一组专用的寄存器组,以减少中断环境保存和恢复的时间。
(3)将需要执行插补任务的当前位置值和加工命令(如:加工曲线线形、终点值)等信息定义成全局变量,以便与其他任务实现快速的信息交互。
(4)插补控制任务的启动。根据插补速度设定定时器初值,初始化插补所用的全局变量,启动定时器。

4 基于改进后的μC/OS-Ⅱ的数控机床执行控制器的软件设计
数控机床系统采用两级结构。上位机由专用软件IPC构成,用于实现人机交互;下位机由C8051020及其外围电路的嵌入式执行控制器构成,负责实时、可靠的控制。嵌入式执行控制器软件基于改进后的μC/OS-Ⅱ设计,主要包括下面一些功能:与IPC的通信(发送任务和接受任务)、命令解释(命令解释任务)和命令执行(加工监控任务、插补计算任务、间隙电压检测和限位开关状态检测任务)。其中,通信有发送和接收两方面内容;命令解释时,对开关量控制命令直接执行;命令执行中需要进行插补计算、检测间隙电压和限位开关状态及加工监测。各任务具体设计如表1所示。

e.JPG



5 结语
本文根据数控系统任务特点,对μC/OS-Ⅱ的任务划分和任务调度做了改进,更加方便数控系统任务的在μC/OS-Ⅱ上的添加,同时也便于μC/OS-Ⅱ对不同任务的管理。抢占式任务减少了任务切换花费的时间,并提高了硬件资源的利用率,但应注意抢占式任务的数量不能过多,最好小于等于3个,否则会影响OS正常运行。改进后的内核已应用到了实际项目中,系统稳定可靠。

1 2

关键词: 数控系统 改进 面向 OS- 操作系统 LC 嵌入式

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版