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状态修改成就绪状态,但是任务A还是继续运行,直到任务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,不会发生任务切换.