OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14969|回复: 14

关于reentrant重入函数问题

[复制链接]

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
发表于 2012-3-9 22:59:15 | 显示全部楼层 |阅读模式
1, 请问 在keil3中怎么把一个函数定义为可重入。比如说在主函数循环中有play()函数;可是在中断函数中也有play()函数....这样很容易有问题!!
2,用原子的sd卡程序和fat.c程序 我在主函数循环中会常读sd卡,而在中断中也读sd卡!!!这样就出错了;我知道在这sd.c和fat.c中都有全局变量...所以中断后一些全局变量都被改变了 才中断返回!!不可能把中断用到了sd和fat的程序重新弄过一份专门用于中断 那太多了...
3,声明一下 我还没学操作系统,只是看过一下下。希望高手们指点一下小弟......
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-10 00:45:29 | 显示全部楼层
STM32的函数也存在这个问题的,这个和处理器无关.而是和函数的写法有关.
一般,使用了全局变量(或类似东西)的函数,都属于不可重入函数.
原因可以这样理解:比如A函数用了全局变量s,B,和C两个任务都调用了A函数,当B调用A函数的时候,C打断了B,然后C又去调用A函数.B调用的时候已经修改了s为10,而C调用的时候又修改s为15,那么等C退出A的调用,再释放CPU使用权,CPU继续执行B调用C时的函数,因为之前执行的时候,B认为已经修改s为10了,但是后面实际上在C打断B的时候,修改为15了,导致结果与预期不符合.这样,就不是一个可以重入的函数,也就是不能同时被多个任务使用.
当然裸奔的时候,大可不必考虑这么多,反正只能一个个执行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-9 23:22:13 | 显示全部楼层
回复【楼主位】bluebird23:
---------------------------------
印象中只有51才有重入问题(因为重入函数在51上效率不好),也导致了在51上做抢占式的OS的麻烦。
STM32上应该没有这个问题吧?

“用原子的sd卡程序和fat.c程序 我在主函数循环中会常读sd卡,而在中断中也读sd卡!!!这样就出错了”
读SD卡的过程中本身硬件之间是有数据传输的,就算函数本身是可重入的,当主函数正在与SD进行数据传输的时候,中断来了,主函数歇息了,然后中断程序又让STM32去请求SD卡的数据,SD卡岂不是一脸茫然啊。。。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-9 23:45:14 | 显示全部楼层
刚才做了软件仿真实验,函数本身是可以递归调用的,

"在keil3中怎么把一个函数定义为可重入"
不明白这个是什么意思。。。

另外,如果函数里有静态变量,确实会导致重入问题。

如果要从操作系统的角度看,有些资源是有限的,不能同时被多个进程使用,所以就有进程间同步的概念

另外,fat仅仅是文件系统,不知你前面问的内容怎么和操作系统扯上关系?
https://github.com/roxma
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-9 23:59:08 | 显示全部楼层
谢谢 pony297,我就是看到了51说reentrant..我以为stm32也有....
“读SD卡的过程中本身硬件之间是有数据传输的,就算函数本身是可重入的,当主函数正在与SD进行数据传输的时候,中断来了,主函数歇息了,然后中断程序又让STM32去请求SD卡的数据,SD卡岂不是一脸茫然啊。。。”
SD卡茫然了??这个我不是很懂.....为什么会茫然??中断时stm32请求不一样的数据啊.....
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-10 00:01:04 | 显示全部楼层
我的意思是 
如果主函数和SD之间还有一段没有传完的数据,然后中断程序来了,你说SD卡应该怎么办?
https://github.com/roxma
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-10 00:06:43 | 显示全部楼层
现在我出现的问题就是 读取到的数据是乱的!!!我猜应该是在中断时改变了fat和sd中的全局变量;所以返回主函数时再去读取sd卡的时候就出错了,因为fat和sd中的全局变量某些已经被改变....为了在中断能顺利读sd卡,主函数中又能正确读sd卡,应该怎么办.....不可能把中断用到了sd和fat的程序重新弄过一份专门用于中断 那太多了吧...
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-10 00:08:20 | 显示全部楼层
回复【5楼】Pony279:
我的意思是 如果主函数和SD之间还有一段没有传完的数据,然后中断程序来了,你说SD卡应该怎么办?
---------------------------------
嗯,那个我通过标志位用两个数组切换了....
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-10 00:14:21 | 显示全部楼层
有两种方法,我不知道可不可行,你自已验证下
方法一:
可以用一个变量来做同步标志,
在每次和SD卡进行数据传输之前,置位变量,然后中断程序里在调用SD的相关函数之前判断,如果变量被置位了,就不要调用那些函数,中断必须返回让主函数处理完

方法二:
主函数每次读之前,关总中断。读完后,开总中断。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-10 00:16:49 | 显示全部楼层
回复【7楼】bluebird23:
---------------------------------
数组切换了有什么意义,还有一部分数据在SD卡那里,
然后又接收到一个读扇区命令,
接下来会有两种可能:一种是SD卡丢弃剩下的数据,执行新的命令。或者是,SD卡出错,从此再不理STM32了。
https://github.com/roxma
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-10 00:23:43 | 显示全部楼层
 非常感谢Pony279!!!!! 
我用了 方法二!!!效果好多了!!!还有一些其他问题,我再调调!!!!
再次感谢
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-10 00:28:43 | 显示全部楼层
回复【9楼】Pony279:
回复【7楼】bluebird23: --------------------------------- 数组切换了有什么意义,还有一部分数据在SD卡那里, 然后又接收到一个读扇区命令, 接下来会有两种可能:一种是SD卡丢弃剩下的数据,执行新的命令。或者是,SD卡出错,从此再不理STM32了。
---------------------------------
嗯 知道了,不过似乎还是会改变了fat的全局变量...之后进入不了深层目录
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-10 00:53:24 | 显示全部楼层
原子哥 我的是裸奔,中断也用到sd卡 和fat的程序....主函数也用到了sd卡和fat的程序...这两个程序都有全局变量的!!!出错就是这个问题吧???
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-10 01:15:24 | 显示全部楼层
回复【13楼】bluebird23:
---------------------------------
中断就相当于OS任务调度了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-1-13
在线时间
0 小时
 楼主| 发表于 2012-3-10 01:23:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 14:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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