FOS信号量管理

一般的RTOS会通过初始化信号量建立相对应的阻塞链表。这样做会增加使用资源。
FOS主要通过semaphore阻塞队列管理信号量。把被semaphore阻塞的任务挂在该链表上。而且自始至终都使用一条链表。FOS在系统初始化时候需要初始化该链表。

1、信号量初始化
void sem_init(SEM *semaphore, U8 *name, U32 num)
{
    if (semaphore == NULL)
        return;
    semaphore->count = num;
    semaphore->name  = name;
}

2、获取信号量
任务获取信号量,首先将该信号量的值应该减1,然后判断是否大于0,如果大于0,函数返回,否则把该任务插入semaphore阻塞队列,并且从就绪队列中删除该任务,标志该任务为不可以运行状态。然后发生调度。

3.释放信号量
首先查看是否有阻塞在此信号量的任务,如果有,则该信号量值加1,然后判断是否大于0,如果大于0,就从就绪队列表中添加该任务,并且从semaphore阻塞队列中删除该任务,然后发生调度;如果没有任务阻塞在该信号量上,那信号量的值直接加1。

4、删除信号量
Semaphore并没有解决优先级反转的问题。它适用与两个任务之间的同步,或是中断同步任务,以及较长代码段的保护。

Download source code: https://github.com/yangshanjin/YSJ_OS

你可能感兴趣的:(信号量,RTOS,FOS)