- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NucleusRTOS中TLS机制的设计与实现.doc
Nucleus RTOS中TLS机制的设计与实现
王家华? 杜延宁
?(西安石油大学 计算机学院,西安 710065)
?
??? 摘? 要 ?Nucleus是一个被广泛应用的嵌入式实时操作系统,它具有多任务并发执行的能力,但是却缺乏相应的TLS机制,这便限制了一些程序库在Nucleus多任务环境下的使用。本文将描述如何在Nucleus API的基础上,实现TLS机制。
??? 关键词? Nucleus; 线程本地存储
?
1? TLS的基本概念及工作原理
??? TLS,即Thread Local Storage,通常表现为特定于某线程的一个数组的形式。在通过TlsAlloc取得了一个TLS数组下标之后,不同线程可以通过调用TlsSetValue在各自TLS数组的该下标处放置不同的值,此后使用TlsGetValue和该下标,则可获得这个特定于各个线程的不同的值。这个特点对于实现支持多线程并发访问的库是非常重要的。无论是Windows API还是POSIX的Pthreads标准,都有其对TLS功能的实现。
2? Nucleus RTOS
?? ?Nucleus是一个有着广泛应用的嵌入式实时操作系统。它具有多任务(task)并发执行的能力,但是却缺乏相应的TLS机制,这便限制了一些程序库在Nucleus多任务环境下的使用。本文将描述如何在Nucleus API的基础上实现TLS机制。Nucleus没有进程(process)的概念,只有一些共享地址空间的任务(task)。因为这些任务之间共享同一地址空间,所以它们更符合传统意义上线程(thread)的定义。文中将不加区分地使用task和thread这个词。这两个单词的首字母都是T,所以TLS既可以理解为Thread Local Storage也可理解为Task Local Storage的首字母缩写。
3? 接口
??? TLS机制通过以下四个函数提供其服务:
??? (1)int TlsAlloc(void)。分配一个TLS数组下标。
??? (2)int TlsFree(int nTlsIndex)。释放一个TLS数组下标。
??? (3)int TlsSetValue(int nTlsIndex, void* pTlsValue)。把某个值存储在调用线程TLS数组的指定下标处。
??? (4)void* TlsGetValue(int nTlsIndex)。获取调用线程TLS数组指定下标处的值。
除此之外,还有一个函数Create_Task_With_TLS对于在Nucleus中使用TLS也是至关重要的。其原型如下:
??? STATUS Create_Task_With_TLS(NU_TASK *task,CHAR ?*name,
?????????? VOID (*task_entry)(UNSIGNED, VOID *), UNSIGNED argc,
?????????? VOID *argv,VOID *stack_address, UNSIG? NED stack_size,
?????????? OPTION priority, UNSIGNED time_slice,
?????????? OPTION preempt, OPTION auto_start)
4? 结构
图1? TLS的概念性结构
??? 如图1所示,共有4类对象,分别是:
??? (1)线程。
??? (2)线程-TLS映射表。
??? (3)TLS slot分配表。
??? (4)线程本地存储,即与各个线程相对应的TLS数组。
5? 实现
?? #define TLS_MINIMUM_AVAILABLE??? 64
???TLS数组的大小,决定了每个线程可用的TLS slot数目
#define FREE????? 0
#define INUSE??? 1
??? 在TLS slot分配表中标记一个slot是否已占用
??? static int TlsSlotAllocatedTable [TLS_MINIMUM_ AVAIL ABLE];
??? TLS slot分配表,用于记录TLS slot的分配情况。每个元素的取值只能是FREE或INUSE二者之一。
??? static NU_SEMAPHORE table_semaphore;
???? Nucleus信号量,用于控制对各个线程对TLS slot分配表的并发访问。
???? typedef struct {
???? void* slots[TLS_MINIMUM_AVAILABLE];
????? } TLS;
??? 用于表达TLS的概念,本质上为一数组,代表特定于每一线程的存储空间。每个slot可存储一个指针
您可能关注的文档
- Gateway技术操作指南.doc
- GCSE考试物理复习总结.doc
- GCT英语入学测试题答案及解析.doc
- gj高中历史教学史论结合初探.doc
- GMATPREP逻辑分析.doc
- GMDSS英语试题.doc
- GMP复习资料.doc
- GMP自检详细流程及相关表格.doc
- gravity和layout_gravity的区别.doc
- GRE六选二练习题(附解析).doc
- NUMERICALCONTROL数控技术.doc
- Nwxrlz基础医学基本知识和临床护理基础知识试题.doc
- ObjectiveC和CoreFoundation对象相互转换的内存管理总结.doc
- office制作技巧十则.doc
- OnEnglishadvertisingdiscourseanalysis对英语广告的语篇分析.doc
- OpenGL编程的构造.doc
- oracle备份与恢复基础知识.doc
- ORACLE数据库数据操作优化(DataAccess)(讲).doc
- Oracle除sql外其余部分,与上传的另一篇文档构成了完整的Oracle内容。.doc
- Orem自护理论对鼻咽癌病人生活质量影响的调查.doc
文档评论(0)