valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3124回复:4

ucos2中的OSTickISR的一问

楼主#
更多 发布于:2003-06-29 17:11
1。我现在的任务调度没有用OSTimeDly类似的时间函数,而只采用OSMboxPend,OSMboxPost
等信号量的方式,是不是说明我可以不用OStickISR?
2。书上说OSTickISR应该每秒钟发生10-100次,如果每秒发生一次可以码?
有什么影响(会影响任务的切换时间,只用信号量的方式)?
amiaogong
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-30 21:32
1。我现在的任务调度没有用OSTimeDly类似的时间函数,而只采用OSMboxPend,OSMboxPost
等信号量的方式,是不是说明我可以不用OStickISR?
2。书上说OSTickISR应该每秒钟发生10-100次,如果每秒发生一次可以码?
有什么影响(会影响任务的切换时间,只用信号量的方式)?

第一:OSTickISR一定要的,因为它要调用OSTimeTick(),而这个函数是每一个节拍就对任务块里的OSTCBDLY减1;
第二:当让可以设置成每秒种发生一次的。这个数字越小,系统花费更少,当然罗,可能有些功能就不太爽罗! :)
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-30 23:13
OSTimeTick()这个函数是每一个节拍就对任务块里的OSTCBDLY减1,
我的理解是任务的启动可以是OSTCBDLY减到0,也可以是得到信号量(邮箱等),如果我的任务只有信号量触发,跟OSTCBDLY没有关系,
就可以不用OStimeTick,不知这种理解哪里不对,请指教?

John_Lee
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2003-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-30 12:04
你的理解是正确的,如果在你的程序中没有用到和时间有关的功能,如Time函数,延时等,就可以不用OSTimeTick。
gaofentz
驱动牛犊
驱动牛犊
  • 注册日期2005-01-17
  • 最后登录2005-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-17 16:50
  请教各位牛人,小弟这个uc/os2移植问题搞了半个月了,还未搞定,BOSS脸上要下雨了。
我在OSStart()的起动任务里调用的Isr_Init。
void Isr_Init(void)  //中断初始化
{
    rINTCON = 0x5; //中断控制寄存器设置
    rINTMOD=0x0; // All=IRQ mode
    pISR_TICK = (int)OSTickISR; //时钟节拍中断向量处填入中断服务程序()
    rPCONG = rPCONG | 0xff00;   //GPG4、5、6、7设为中断引脚
    rPUPG = rPUPG & 0x0f; //GPG4、5、6、7上拉电阻有效
    rEXTINT=0x0;          //低电平触发
    rINTMSK=~(BIT_GLOBAL|BIT_TICK);   //中断有效
    rTICNT=127+(1<<7);   // 时间滴答计数寄存器  
  }

;os_cpu_a.s里的4个函数只有下面这个函数移植的有点问题,多任务系统总是进入空闲任务等待或跑飞了.
;程序起动后,我在OSTickISR中设断点能进入.
OSTickISR
STMFD sp!, {r4}
LDR   r4, =LINK_SAVE
STR   lr, [r4]  ; LINK_SAVE = lr_irq
MRS   lr, spsr
STR   lr, [r4, #4] ; PSR_SAVE = spsr_irq
LDMFD sp!, {r4}
ORR   lr, lr,#0x80 ; Mask irq for context switching before
MSR  cpsr_cxsf, lr  ; returning back from irq mode.
SUB sp, sp, #4  ; Space for PC
STMFD sp!, {r0-r12, lr}
LDR  r4, =LINK_SAVE
LDR  lr, [r4, #0]
SUB  lr, lr, #4 ; lr = LINK_SAVE - 4,
STR  lr, [sp, #(14*4)] ; the return address for pc.
LDR   r4, [r4, #4] ; r4 = PSR_SAVE,
STMFD sp!, {r4}   ; CPSR of the task
LDR  r4, =OSTCBCur
LDR  r4, [r4]
STR  sp, [r4]    ; OSTCBCur -> stkptr = sp
; BL DmpStk
BL OSIntEnter
BL OSTimeTick
BL OSIntExit
; BL DmpStk
; LDR   r4, =OSTCBHighRdy
LDMFD sp!, {r4}      ; pop new task cpsr
MSR   cpsr_cxsf, r4
LDMFD sp!, {r0-r12,lr,pc}   ; pop new task r0-r12,lr & pc
EXPORT DmpStk
DmpStk
LDR r0, =Dump_Pool
MOV r1, sp
MOV r2, sp
ADD r2, r2, #64
DmpLoop
LDR r3, [r1]
STR r3, [r0]
ADD r0, r0, #4
ADD r1, r1, #4
CMP r1, r2
BNE DmpLoop
MOV pc, lr
游客

返回顶部