OSEck RTOS 快速信号量 - 之-1

    OSEck系统提供软件快速信号量(fsem), 可用于 PRIO, OSINT, IDLE进程,在进程pcb结构中,有fsem_value变量用于设置进程的fesm,也即每个进程均有自己的fsem,fsem的初始值一般为0,fsem信号量意思是预计等待的时间短,即处于waiting的状态时间短。因为fsem的初始值等于0,只允许初始化该fsem的进程在等待。

     fsem相关的systemCall有set_fsem,wait_fsem,get_fsem,signal_fsem。set_fsem用于设置进程的fsem,get_fsem用于获取进程fsem,signal_fsem用于释放进程fsem,fsem加1,wait_fsem用于进程等待fsem的释放,使fsem减1,signal_fsem与wait_fsem要成对使用。

    如下为进程pcb结构的部分内容,包含fsem_value:

       

 

       fsem应用,EmTmTickProc进程设置的fsem值为0。当EmTmOnTick函数被调用时,会调用signal_fsm(g_EmTmPid)函数释放EmTmTickProc进程的fsem,这样EmTmTickProc进程的fesm加1后等于0,并在signal_fsm函数中检查是否需要切换到EmTmTickProc进程,若切换(由于OSEck是抢占式系统,当EmTmTickProc进程优先级大于唤醒EmTmTickProc进程的进程优先级,会执行切换到EmTmTickProc进程)到了EmTmTickProc进程后,就从上次EmTmTickProc进程被切换出去的地方(该被切换出去的地方是处于wait_fsem函数内部的指令,之所以上次被切换出去,是因为上次执行完wait_fsem(1)后,fsem的值为-1,不等于0,所以在wait_fsem函数内部将EmTmTickProc进程设置为waiting状态,并被切换出去,进而执行其他的候选进程)执行,从而将上次没有执行完的wait_fsem函数执行完,进而执行EmTmTickProc进程的关键代码“EmTmTickHandler”,该函数执行完后,又进入下一次“for”循环,进而又执行wait_fsem(1)函数,fsem的值减1后,变为-1,这样EmTmTickProc进程又被block,并被设置为waiting状态,等待下一次被signal_fsem唤醒。

       EmTmOnTick函数可以作为回调函数被其他进程或OSEck系统调用,当调用EmTmOnTick函数时,EmTmOnTickPro进程就会被唤醒。        

     

 

    首先调用set_fsem设置进程信号量,函数入参为进程pid,OSEck系统中odo_pcb_list[pid]存有所创建进程中的pcb指针,函数参数value值一般设为0:   

          

 

       wait_fsem,signal_fsem函数的源代码将在后续中讲解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值