rtx任务间通信--信号量

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,不会发生任务切换.

时间: 2024-10-16 15:35:44

rtx任务间通信--信号量的相关文章

linux下的线程间通信——信号量

1.生产者--消费者模型 用到的函数: sem_init()   初始化 sem_destroy()  销毁 sem_wait()  申请.消费资源(申请不到的时候挂起) sem_post()  生产资源 单生产者--单消费者: /*************************************************************************  > File Name: my_senc.c  > Author: HonestFox  > Mail: [e

rtx任务间通信--互斥量

void os_mut_init (    OS_ID mutex );    /* The mutex to initialize */ 初始化一个互斥量,互斥量内部计数计为0, mutex类型必须为OS_MUT.在调用互斥量相关函数之前,必须用该函数先初始化互斥量. OS_RESULT os_mut_wait (    OS_ID mutex,        /* The mutex to acquire */    U16   timeout );    /* Length of time

ucos实时操作系统学习笔记——任务间通信(信号量)

ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代码的学习心得,供以后回来看看,不过比较遗憾的是没有仔细学习扩展代码的功能实现部分.ucos操作系统的内核代码实现相对简单,但是对理解其他操作系统内核相同功能有帮助. ucos的任务间通信机制主要是基于event实现的,其实理解这个event不用翻译成中文事件,就叫event感觉还更容易接收.下面是操

线程间通信机制posix匿名信号量

信号量分为两种 一种是简单的信号量,另一种是用于进程间通信的信号量集. 简单的信号量 属于POSIX标准的信号量; 从信号量的命名来看,信号量又可分为命名信号量和匿名(未命名)信号量; 从信号量的值来看,信号量可分为二进制信号量和计数信号量; 1.匿名信号量和命名信号量: 匿名信号量是在内存中分配内存.进行初始化并由系统API进行管理的,它可以在多个线程之间进行资源同步,也可以在多个进程之间进行资源同步,这主要是看在初始化的时候给pshared传递的参数值,为0,则在线程之间同步,非0,则在进程

ucos实时操作系统学习笔记——任务间通信(互斥锁)

想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥锁是设置信号量值为1时候的特殊情况,与之不同的地方是互斥锁为了避免优先级反转采用了优先级继承机制,本文主要讲一下互斥锁的创建,pend和post,对应的函数是OSMutexCreate,OSMutexPend,OSMutexPost,当然讲函数也不会所有的扩展功能都讲,只是讲一下主干部分,下面贴出来

线程间通信与同步

线程间通信的两个基本问题是互斥和同步. 同步:一个线程的执行依赖于另一个线程的消息. 互斥:对共享资源的排他性,一个线程必须等待别的线程释放公共资源之后才能继续执行. 同步机制(Win32中):事件,信号量,互斥量,临界区 各种同步方式: #全局变量 win32多线程通信的最方式,但用全局变量同步会有两个弊端,应该避免 >主线程没有进入休眠状态,依然会消耗CPU资源 >如果主线程优先级比ThreadFunc高,则全局变量无法在ThreadFunc中被改变,这样线程无法得到通知 #事件 由于ev

进程间通信和线程间通信

进程间通信: # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.#

ucos实时操作系统学习笔记——任务间通信(消息)

ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了queue机制还要用mbox呢,只要设置queue的msg只有一个不就行了?其实很简单,就是为了节约资源,因为使用queue的话需要专门描述queue的机构体os_q,同时需要分配一段内存用来存放msg,而如果直接使用mbox机制的话,就好多了,节约..... 首先从mbox的创建开始,mbox创建的函

进程间通信与线程间通信

序 今天被问及进程间通信的问题,发现自己了解的并不够,所以,对此好好总结一番~ 操作系统的主要任务是管理计算机的软件.硬件资源.现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行,windows如此linux也是如此.所以操作系统就借助于进程来管理计算机的软.硬件资源,支持多任务的并行执行.要并行执行就需要多进程.多线程.因此多进程和多线程间为了完成一定的任务,就需要进行一定的通信.而线程间通信又和进程间的通信不同.由于进程的数据空间相对独立而线程是共享数据空间的,彼此通信机制也很不同