|
前言6 Z: X& N. ~0 J, H* J! I. U 本文章主要介绍多任务系统中的的不可重入函数的用法和如何避免出错。, e! X. W4 S" Q& k8 j5 K( q 1. 可重入函数与不可重入函数的区别 i/ I$ [( X! z 在多任务环境中,可重入函数可以由多于一个的任务并发使用,而不用担心数据错误。这个函数可以在执行的任何时刻中断( J9 ~! e' r1 y2 W. _ 它。 不可重入函数由于使用了一些系统资源,比如全局变量等,不能被很多任务所共享,除非能确保函数的互斥性。 1)可重入函数:9 c$ I2 n6 b6 D0 n1 n, Z 不返回指向静态数据的指针。" n" S' k: X. y, W" I4 d4 M' }9 o 使用本地数据。: h; i' y2 o1 g6 u$ U: G& | 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。 绝不调用任何不可重入函数。# J& E; L8 j) j; o4 T$ O 3)不可重入函数: 函数中使用了静态变量。 函数返回静态变量。 函数中调用了不可重入函数。5 n/ F7 ?. r# w; U 函数体内使用了静态的数据结构;; s( H6 B# g( d( \ 函数体内调用了malloc()或者free()函数;# `3 B- y4 e, |& L3 P1 U 函数体内调用了其他标准I/O 函数。 总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。: Q( i- ?7 `6 A7 G& Z8 l 2. 不可重入函数的一次错误应用示例,造成I2C Master 端收到的数据无**确解析。 这个产品使用的MCU 为STM32F411,是作为Sensor hub使用的,做为I2C 的Master端,总线上挂了好几个传感* y! J1 r3 \5 n0 b7 @ 器,如加速度、陀螺仪、光感应等。并且同时采用定时方式和中断方式通过I2C总线读取sensor上数据的) B$ x3 _; A- M y6 C 详细解答请下载文档:https://www.stmcu.org.cn/document/detail/index/id-216740 更多实战经验文档请见:https://www.stmcu.org.cn/document/list/index/category-657 |
| 不可重入是操作系统中普遍需要考虑的问题。 |
微信公众号
手机版