野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7037|回复: 8

freertos多个任务可以同时调用同一个函数吗

[复制链接]
发表于 2020-1-2 19:34:32 | 显示全部楼层 |阅读模式
用的单片机是RT1052,系统是freertos,现有2个疑问:
(1)、比如A任务正在调用某个函数,此时B任务抢占A任务的运行权,执行B任务,B任务运行时也会调用这个函数,请问程序能正常执行吗?
(2)、freertos提供了信号量机制,但我不经常使用,反而很多时候定义全局变量,很方便,请问定义很多全局变量对多任务的运行有什么弊端,非得定义、创建信号量吗?
回复

使用道具 举报

发表于 2020-1-2 22:46:49 | 显示全部楼层
1. 需要看这个函数是否可重入的,比如这个函数没有引用全局变量。

2. 同1,全局变量满天飞不是一个好习惯。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-3 08:38:21 | 显示全部楼层
正如老吴所说,全局变量满天飞可不是一个好习惯,如果函数只有局部变量那是不需要保护的,如果修改了全局变量的话,那就需要保护,比如临界段、用互斥量等
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-8 22:15:31 | 显示全部楼层
多个任务可以同时调用同一个任务,它们有着独立的堆栈区,互不干扰,个人感觉全局变量有时挺好用的,不是任何地方都要信号量,不要要做任务同步的地方,就不需要,但对结构体等复杂数据类型进行写操作需要,一个结构体内容为“姓名:张三, 学号51”,当一个任务试图修改该结构体为“李四,学号52”,如果用全局变量,当将张三改为李四时,这个时候另一个更高优先级的任务开始读这个结构体,学号还未来得及修改就被高优先级任务打断,读出内容为“李四,学号51”,但李四的学号为52,就错了,所以这里要写完才能读,需要用到互斥信号量。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-9 13:19:45 | 显示全部楼层
原则上,不允许出现(1)的情况,后果可大可小。

解决办法比问题多很多。a.可以在调用B任务的时候,同时写一个BUSY_FLAG=1,执行完再清0.中途其他任务调用就通过这个标志位来协调处理。

我的FREETOROS产品,有按键就要去刷界面,不同按键BUSY_FLAG的内容值还不一样,结合实际情况协调好,再允许下一个按键消息进来。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-17 11:13:46 | 显示全部楼层
1、比如A任务正在调用某个函数,此时B任务抢占A任务的运行权,执行B任务,B任务运行时也会调用这个函数,请问程序能正常执行吗?

    如果该函数支持重入,则没有问题。如果该函数不支持重入,则有问题。
    所谓支持重入,就是该函数内部没有直接使用全局变量,而是通过入口参数传递全局变量。
2、freertos提供了信号量机制,但我不经常使用,反而很多时候定义全局变量,很方便,请问定义很多全局变量对多任务的运行有什么弊端,非得定义、创建信号量吗?
   
     (1)、既然你使用了FREERTOS编程,就要抛弃前后台编程思路,能用消息队列传递变量的话,就不要用全局变量传递变量。
     (2)、前后台编程和RTOS编程最大的不同就是变量的使用上。
                前后台编程:任何一个函数内想怎么使用全局变量就怎么使用全局变量
                RTOS编程:必须通过消息队列传递全局变量
     (3)、使用全局变量,最大的弊端就是严重影响系统的实时性,因为每个地方如果使用全局变量,必须先关中断,使用完后,再开中断。
     (4)、前后台常见的通信程序设计思路如下:
                   串口中断接收到一帧完整的报文后,在中断中置位一个标识=1,
                   然后在主程序中检测该标识,如果该标识==1,则调用报文解析程序。
     (5)、RTOS常见的通信程序设计思路如下:
                    串口中断接收到一帧完整的报文后,  在中断服务程序的结尾发送信号量,
             如果等待信号的任务的优先级比较高,会立即得到CPU的控制权,会立即调用报文解析程序。
而前后台程序需要CPU走到  if 标识==1 时,才会调用文解析程序。
             显然RTOS编程的实时性更高。            
回复 支持 反对

使用道具 举报

发表于 2020-1-17 11:24:12 | 显示全部楼层
本帖最后由 ba_wang_mao 于 2020-1-17 11:28 编辑

更正:
     使用全局变量注意要点:
     一、如果全局变量在中断服务程序中改写,在任务中读的话  ,必须按照如下顺序访问:         
                 (1)、任务中读前必须先关中断
                 (2)、把全局变量保存到临时变量中
                 (3)、开中断
                  (4)、通过访问临时变量中暂存的全局变量值达到访问全局变量的目的
               这是在中断服务程序中改写,在任务中读的最经典,最安全的访问全局变量的方法    二、如果全局变量没有在中断服务程序中改写,只是在任务之间改写或读
        1、如果全局变量只在一个任务中读写使用,没有在其它任务或者中断服务程序中使用
                可以像前后台那样,随便用,也不需要考虑关中断、开中断之类或者使用互斥信号量之类
     2、如果全局变量在任务A中产生(注:没有在中断服务程序中产生),在任务B中使用
                 必须使用互斥信号量解决资源共享问题。




回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-17 11:30:45 | 显示全部楼层
楼主,更正一下你的错误概念:

   信号量用于任务同步
   互斥信号量才用于资源共享
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-1-17 16:01:36 | 显示全部楼层
ba_wang_mao 发表于 2020-1-17 11:30
楼主,更正一下你的错误概念:

   信号量用于任务同步

谢~,基础概念不清晰,只是勉强用着;望多多发言!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-26 23:58 , Processed in 0.036788 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表