可重入函数

若一个函数是可重入的,则该函数:

(1)    不能含有静态(全局)非常量数据

(2)    不能返回静态(全局)非常量数据的地址

(3)    只能处理由调用者提供的数据

(4)    不能依赖于单实例模式资源的锁

(5)    不能调用(call)不可重入的函数(调用的函数必须满足前面的要求)

(6)    多“用户、对象、进程优先级”以及多进程,一般会使得可重入代码变得复杂。同时I/O代码通常时不可重入的,因为他们依赖于像磁盘这样共享的、单独的资源

(7)    在和硬件发生交互的时候,切记执行类似Disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述。//这是临界区保护

(8)    谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL

等等吧,总之,时刻记住一句话:保证中断是安全的!

 

与线程安全的关系

可重入与线程安全都关系到函数处理资源的方式。但他们有一定的区别,可重入观念会影响到函数的外部接口,而线程安全只关心函数的具体实现

可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。

 

VxWorks中采取的可重入的技术有:

    * 动态堆栈变量(各子函数有自己独立的堆栈空间)

    * 受保护的全局变量和静态变量

* 任务变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值