【问题标题】:Shared variables [RTOS]共享变量 [RTOS]
【发布时间】:2015-07-23 12:54:11
【问题描述】:

简单的背景:

在我的单片机上运行 freeRTOS。

我的项目中的一个功能是处理存储在外部存储器中的参数的库。

基本上在启动时,主函数调用从外部存储器读取所有参数并将它们存储在库中的函数,在静态变量(非全局)中。

现在,我有几个任务正在运行。一些任务调用参数库中的函数来读取/写入参数。

问题: 当任务调用函数来读取参数时,它们最初试图访问相同的变量。对?

不是每个任务都创建自己的整个库的副本吗?

如果不是这样,那么我想信号量是实现我的目标的方法,从那里我会没事的。

上传了两张图片:第一张是我认为是正确的,第二张是错误的。

Correct Faulty

ps。无法访问任何控制器。所以我在这里问:)

【问题讨论】:

  • 静态/全局不是线程安全的。就是这样。维护配置数据的完整性可能很困难,如何以安全且合理有效的方式实现这一点取决于应用程序。通常,此类数据经常被读取,但只是偶尔写入,使用的策略应反映这一点。
  • 我在 .c 代码中使用静态变量的原因是为了使变量仅对该 .c 代码中的函数是全局的。这是一个坏习惯吗?
  • 一般来说,您希望使用互斥体而不是信号量来控制对共享资源的访问(,强制互斥)。 FreeRTOS(不幸的是,IMO)将互斥锁归类为信号量的类型/子类。如果您愿意,可以阅读有关FreeRTOS mutexes 的更多信息。

标签: c embedded rtos freertos


【解决方案1】:

你的假设是正确的。您必须记住,您仍在编译单个 C 程序。您的 MCU 操作系统是程序的一部分,不包含程序加载器或类似的东西,您只有一个 main
这实际上意味着您的程序将像任何普通的 C 程序一样运行,不会有任何重复的变量或隐藏的陷阱。唯一奇怪的一点是,操作系统能够神奇地切换任务。

【讨论】:

  • 感谢m8的回复。现在我可以很高兴地为参数做一个好的处理程序:)
猜你喜欢
  • 2014-12-14
  • 2012-07-21
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多