rtx任务间通信--信号量

本文深入解析了信号量操作的关键步骤:如何使用`os_sem_init`进行初始化,`os_sem_send`在任务中发送信号量,以及`os_sem_wait`在任务中等待信号量的实现细节与行为特性。特别强调了信号量计数的增减、任务优先级的影响、以及超时机制的工作原理。
/***************/
void os_sem_init (
     OS_ID semaphore,        /* The semaphore object to initialize */
     U16   token_count );    /* Initial number of tokens */ 


参数semaphore的类型必须为OS_SEM, token_count为信号计数初始值,调用信号量相关函数之前,必须先
通过该函数初始化信号量. 
/***************/
OS_RESULT os_sem_send (
     OS_ID semaphore );    /* The semaphore whose token count is incremented */ 


返回值:
 OS_R_OK 该返回只有一个返回值. 


在任务中发送信号量,参数semaphore的类型必须为OS_SEM.
 如果等待该信号量的任务(任务A)优先级比发送信号量的任务(任务B)优先级高,会切换到任务A去运行;如果
 任务A比任务B优先级低,任务A状态修改成就绪状态,但是任务B还是继续运行,直到任务B时间片耗尽或任务A
 为最高优先级的任务(RTX默认的调度方式)。如果没有任务等待该信号量,该函数会将信号计数值加1. 
/***************/
void isr_sem_send (
     OS_ID semaphore );    /* The semaphore whose token count is incremented */ 


在中断中发送信号量,参数semaphore的类型必须为OS_SEM.
 如果等待信号量的任务(任务A)的优先级最高,退出中断后会切换到A去运行,否则将A运行状态置为就绪状态,
 有机会就可以运行。如果没有任务等待该信号量,isr_sen_send简单的将信号计数加1. 
/***************/
OS_RESULT os_sem_wait (
     OS_ID semaphore,    /* The semaphore to get the token from */
     U16   timeout );    /* Length of time to wait for the token */ 


返回值:
 OS_R_SEM The calling task has waited until a semaphore became available 任务挂起之后,在超时之前等待到了信号量
 OS_R_TMO The timeout expired before the token became available.       等待信号量超时
 OS_R_OK  A token was available and the function returned immediately. 信号量计数值>0,立即返回获取信号量.
 
 如果信号量计数值不为0,该函数将信号量计数值减1,然后返回,调用该函数的任务继续运行。
 如果信号计数值不为0,任务会挂起,切换到其他任务去运行,直到有其他任务或中断调用os_sem_send,isr_sem_send
 函数发送信号量,该任务才会有机会运行。timeout为等待信号的超时返回时间,单位为系统tick,0和0xffff是两个特殊值.
 0xffff为无限等待
 为0时,如果信号量计数值为0,该函数立即返回OS_R_TMO,不会发生任务切换. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值