硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5068|回复: 6
收起左侧

[有问必答] 关于函数互斥的问题?

[复制链接]

45

主题

70

回帖

205

积分

高级会员

积分
205
发表于 2021-2-2 23:35:50 | 显示全部楼层 |阅读模式
变量,对象需要互斥,那么函数需要互斥吗,
比如
void fun(struct AA *A,int *b)
{
    do something with A and b
}

void task_a()
{
    fun(&i,&j);
}

void task_b()
{
    fun(&m,&b);
}


如果在task_a中的fun没有执行完,task_b要打断其,并要执行。这应该加互斥吗?毕竟我给fun的数据不会冲突,被打断的应该都保存到自己的栈了!我理解的对吗?
回复

使用道具 举报

5

主题

133

回帖

148

积分

初级会员

积分
148
发表于 2021-2-3 08:42:56 | 显示全部楼层
看函数是否可重入,有没有用到全局变量或者局部静态变量
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2021-2-3 14:15:55 | 显示全部楼层
无关风月 发表于 2021-2-3 08:42
看函数是否可重入,有没有用到全局变量或者局部静态变量

谢谢!函数内部没有全局和static变量就是函数可重入吗,就不用互斥了吗?
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2021-2-3 14:28:38 | 显示全部楼层
你理解没有问题,都保存在自己栈里。只要没用到全局变量和静态变量,而且函数是可重入的,就不需要互斥。一般load/store结构的单片机,函数都是可重入的。8051不是load/store结构,所以需要特别指定函数为retrant才是可重入的。
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2021-2-3 17:40:06 | 显示全部楼层
如果fun里面涉及到硬件时序,这个时候是不是就得考虑互斥了?
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2021-2-5 18:31:54 | 显示全部楼层
p00equal1 发表于 2021-2-3 17:40
如果fun里面涉及到硬件时序,这个时候是不是就得考虑互斥了?

对,只要这个函数内不操作系统内公用的变量或者硬件,应该就行。!
回复

使用道具 举报

0

主题

125

回帖

125

积分

初级会员

积分
125
发表于 2021-2-7 10:19:58 | 显示全部楼层
chinashaoshu 发表于 2021-2-3 14:15
谢谢!函数内部没有全局和static变量就是函数可重入吗,就不用互斥了吗?

这是两个问题
一是重入函数,重入函数就不该用static, 用局部即可
二是互斥, 这里指的是不同的线程共享某些变量, 这时候才需要互斥
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 03:31 , Processed in 0.160840 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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