ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-09 12:02:59  阅读:138  来源: 互联网

标签:异步 list 信号量 vnRTOS 线程 INT8U 唤醒 mod


自制国产实时内核——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)

 

标签:异步,list,信号量,vnRTOS,线程,INT8U,唤醒,mod
来源: https://blog.51cto.com/u_14640655/3023767

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有