找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1608|回复: 13
收起左侧

关于C语言重入函数

[复制链接]
ID:847202 发表于 2021-1-11 20:24 来自手机 | 显示全部楼层 |阅读模式
程序编译的时候出现警告,经过查资料后发现是有一个子函数,被主函数和中断都调用了,所以出现了警告。请问那个重入函数怎么写?求指导
回复

使用道具 举报

ID:57657 发表于 2021-1-11 23:04 | 显示全部楼层
主函数正在调用该函数且未返回,再被中断抢占就会造成内存错乱。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:373388 发表于 2021-1-11 23:25 | 显示全部楼层
本帖最后由 xhaity 于 2021-1-11 23:28 编辑

一般情况下,中断和主函数不调用同一函数,一定要调用的话,那就用锁标志,主函数正在执行某部分时,做锁标记,没执行完,在中断调用查该标志,如果有锁,跳过该程序段。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:373388 发表于 2021-1-11 23:31 | 显示全部楼层
一般情况下,中断和主函数不调用同一函数,一定要调用的话,那就用锁标志,主函数正在执行某部分时,做锁标志,执行完清除;中断中查询该标志,如果该标志存在,就跳过该段。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:876745 发表于 2021-1-12 14:19 | 显示全部楼层
一般情况下,别在中断调子函数,留个标志就可以了,比如累加。再根据标志写函数。
回复

使用道具 举报

ID:876745 发表于 2021-1-12 14:27 | 显示全部楼层
zyztoto 发表于 2021-1-12 14:19
一般情况下,别在中断调子函数,留个标志就可以了,比如累加。再根据标志写函数。

楼上的标志锁有点问题,中断都跳过了还要中断干嘛?
回复

使用道具 举报

ID:298123 发表于 2021-1-25 17:11 | 显示全部楼层
如果逻辑互不干扰,就分成两个函数
回复

使用道具 举报

ID:298123 发表于 2021-1-25 17:13 | 显示全部楼层
如果逻辑上互不干扰,就用两个函数;如果逻辑上有耦合的地方,就需要加锁或标记了
回复

使用道具 举报

ID:879809 发表于 2021-1-25 17:36 | 显示全部楼层
不要说“一般情况”,在一般情况下,楼主的问题不存在,真正的c语言里面,中断和主函数都是可以调用同一个函数的,局部变量在调用的时候在堆栈上生成,退出该函数释放局部变量,没有什么不能用的。

楼主的情况属于特殊情况,8051这个体系结构对于高级语言太不友好了,如果用标准c的做法,那点儿可怜的ram很快就会被用光,间址指令很少,这么做不光浪费空间也非常浪费时间。所以c51在这里才用了非标准的做法,局部变量地址固定,在链接后就有了具体位置,那么主函数调用这个函数的时候发生中断调用这个函数,里面的局部变量就全乱套了,中断返回后,继续运行主函数调用的这个函数,里面的局部变量值都是错的。我的办法就是再写一个函数,让主函数和中断函数调用的不是同一个即可。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:282850 发表于 2021-1-26 00:58 | 显示全部楼层
刚用IAR试了一下,main中调用,TA中断内再调用同一个函数,编译没有任何问题,看来是编译器与MCU架构的关系。
回复

使用道具 举报

ID:879809 发表于 2021-1-26 11:10 来自手机 | 显示全部楼层
f556 发表于 2021-1-26 00:58
刚用IAR试了一下,main中调用,TA中断内再调用同一个函数,编译没有任何问题,看来是编译器与MCU架构的关系 ...

被你笑死,IAR做过几十种指令集的编译器。。。至少在IAR8051这个编译器上,你说的是错误的。
回复

使用道具 举报

ID:282850 发表于 2021-1-26 22:31 | 显示全部楼层
rundstedt 发表于 2021-1-26 11:10
被你笑死,IAR做过几十种指令集的编译器。。。至少在IAR8051这个编译器上,你说的是错误的。

“.....看来是编译器与MCU架构的关系”
有这句话。我没有说IAR的C51可以!
回复

使用道具 举报

ID:879809 发表于 2021-1-26 23:04 | 显示全部楼层
f556 发表于 2021-1-26 22:31
“.....看来是编译器与MCU架构的关系”
有这句话。我没有说IAR的C51可以!

我当然知道你用的IAR一定不是51平台的,只是提醒你以后发言要把自己要表达的内容说清楚,你瞧你这次回复还是没说清楚你用的IAR到底是什么不是?
回复

使用道具 举报

ID:879809 发表于 2021-1-27 13:38 | 显示全部楼层
最后说一下,主函数和中断能不能同时调用同一个函数,看编译器是否支持递归即可。标准c语言是支持的,那么就可以随便调用。大部分8位单片机c语言不支持,那就不能用。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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