【发布时间】:2015-07-23 12:54:11
【问题描述】:
简单的背景:
在我的单片机上运行 freeRTOS。
我的项目中的一个功能是处理存储在外部存储器中的参数的库。
基本上在启动时,主函数调用从外部存储器读取所有参数并将它们存储在库中的函数,在静态变量(非全局)中。
现在,我有几个任务正在运行。一些任务调用参数库中的函数来读取/写入参数。
问题: 当任务调用函数来读取参数时,它们最初试图访问相同的变量。对?
不是每个任务都创建自己的整个库的副本吗?
如果不是这样,那么我想信号量是实现我的目标的方法,从那里我会没事的。
上传了两张图片:第一张是我认为是正确的,第二张是错误的。
ps。无法访问任何控制器。所以我在这里问:)
【问题讨论】:
-
静态/全局不是线程安全的。就是这样。维护配置数据的完整性可能很困难,如何以安全且合理有效的方式实现这一点取决于应用程序。通常,此类数据经常被读取,但只是偶尔写入,使用的策略应反映这一点。
-
我在 .c 代码中使用静态变量的原因是为了使变量仅对该 .c 代码中的函数是全局的。这是一个坏习惯吗?
-
一般来说,您希望使用互斥体而不是信号量来控制对共享资源的访问(即,强制互斥)。 FreeRTOS(不幸的是,IMO)将互斥锁归类为信号量的类型/子类。如果您愿意,可以阅读有关FreeRTOS mutexes 的更多信息。