自制国产精简内核 vnRTOS 第 5 节 线程的异步通知

自制国产实时内核——vnRTOS 所有文档: vnRTOS 文档

 

对于多线程,还有一个问题不容忽视。就是生产者和消费者的问题。我们考虑一个场景。线程 A 接受网络数据,如果没有网络数据,那线程 A 就要进入休眠。那当网卡接收到数据包的时候,如何去唤醒 线程A 呢?

我们引入信号量的概念:线程A 首先去获取网络数据包这个信号量,如果为0 说明没有网络数据,进入休眠。如果网卡接收到了数据,那么网卡线程可以设置信号量为 1 ,同时去唤醒这个线程。

定义一个信号:

SIGNAL_INIT(sgn, val)   sgn —— 信号量名,  val 初始值

获取信号:

/************************************************************************
功能: 让当前任务去试图获取一个信号,如果信号没有,则在该
			wait_list 中休眠
			mod		是否需要休眠
************************************************************************/
INT8U get_signal_sleep(INT8VU *signal, struct list_head *wait_list, INT8U mod)

释放信号:

/***********************************************************************
功能: 唤醒等待某信号量的任务
	mod		唤醒模式 全部唤醒还是唤醒指定的任务
	pid		指定的任务
***********************************************************************/
void wake_up_signal(INT8VU *signal, struct list_head *wait_list, INT8U mod, INT8U pid)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值