你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【ST MCU实战经验】多任务系统中的不可重函数使用注意事项

[复制链接]
沐紫 发布时间:2015-12-25 15:54
前言6 Z: X& N. ~0 J, H* J! I. U
本文章主要介绍多任务系统中的的不可重入函数的用法和如何避免出错。, e! X. W4 S" Q& k8 j5 K( q

. e! h. V; }, n! B1. 可重入函数与不可重入函数的区别  i/ I$ [( X! z
在多任务环境中,可重入函数可以由多于一个的任务并发使用,而不用担心数据错误。这个函数可以在执行的任何时刻中断( J9 ~! e' r1 y2 W. _
它。
# w( P3 U7 |3 Z7 d  m, m! ]不可重入函数由于使用了一些系统资源,比如全局变量等,不能被很多任务所共享,除非能确保函数的互斥性。
& X* x# g6 G" i# |/ h1)可重入函数: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& |
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
) A. I' ?6 T- @! q$ \9 v绝不调用任何不可重入函数。# J& E; L8 j) j; o4 T$ O
3)不可重入函数:
0 m) C1 r4 A; Z* e& ~函数中使用了静态变量。
9 L: g: L4 w- W  u函数返回静态变量。
0 n0 o8 S# I) h6 B5 g函数中调用了不可重入函数。5 n/ F7 ?. r# w; U
函数体内使用了静态的数据结构;; s( H6 B# g( d( \
函数体内调用了malloc()或者free()函数;# `3 B- y4 e, |& L3 P1 U
函数体内调用了其他标准I/O 函数。
" X7 M6 h+ [7 @5 D, u总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。: Q( i- ?7 `6 A7 G& Z8 l

  o- ]9 ^6 _" [8 P) d2 o- ]2. 不可重入函数的一次错误应用示例,造成I2C Master 端收到的数据无**确解析。
# }+ Y/ X. ]! @5 ]5 z0 a这个产品使用的MCU 为STM32F411,是作为Sensor hub使用的,做为I2C 的Master端,总线上挂了好几个传感* y! J1 r3 \5 n0 b7 @
器,如加速度、陀螺仪、光感应等。并且同时采用定时方式和中断方式通过I2C总线读取sensor上数据的) B$ x3 _; A- M  y6 C

( ?5 H5 k! K, V; C详细解答请下载文档:https://www.stmcu.org.cn/document/detail/index/id-216740
# t5 H3 H" O( ?: H$ j6 N更多实战经验文档请见:https://www.stmcu.org.cn/document/list/index/category-657
9 c% S; r% D3 w, q
赞 收藏 评论1 发布时间:2015-12-25 15:54

举报

1个回答
yanhaijian 回答时间:2015-12-26 08:21:57
不可重入是操作系统中普遍需要考虑的问题。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版