找回密码
 立即注册
查看: 470|回复: 2

请教一个再入函数的问题,我的形参使用了结构指针,会有问题吗?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-05-01 08:57:59

19

主题

137

回帖

485

积分

中级会员

积分
485
发表于 2023-10-14 11:52:58 | 显示全部楼层 |阅读模式
正常的书本介绍是不能使用全局或者静态变量,形参使用指针是不是也算全局变量呢,这个时候形参的传入应该是堆栈保护的吧?

比如这样


BOOL fEmptyQueue_BYTE(QUEUE_BYTE_TypeDef *sQueue) reentrant {
  
  return  sQueue->bhQlength == 0 ? TRUE : FAIL;
}  


BOOL fFullQueue_BYTE(QUEUE_BYTE_TypeDef *sQueue) reentrant {

  return sQueue->bhQlength == sQueue->bhMaxSize ? TRUE : FAIL;
}

找不到合适版块来请教这个问题,不合适请移送相关版块。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2023-10-14 12:34:51 | 显示全部楼层
(1)对于C251/C51,一个函数声明了函数重入“reentrant”后,形参就不是全局变量了,每次调用都会在函数堆栈中分配新地址空间,受到函数重入保护的。
(2)针对你的
具体例子而言,形参是一个指针(不是结构本身!),不是全局变量,每次调用分配4字节/3字节的新堆栈空间。
(3)但是函数调用时形参指针指向的结构必须是一个可访问实体结构,这个实体结构通常是一个全局结构变量、上层函数的结构变量或者是一个已经指向实体结构的指针。只有这样函数的操作才能针对一个具体的实体完成。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-05-01 08:57:59

19

主题

137

回帖

485

积分

中级会员

积分
485
发表于 2023-10-14 12:45:11 | 显示全部楼层
杨*** 发表于 2023-10-14 12:34
(1)对于C251/C51,一个函数声明了函数重入“reentrant”后,形参就不是全局变量了,每次调用都会在函数堆 ...

“(3)但是函数调用时形参指针指向的结构必须是一个可访问实体结构,这个实体结构通常是一个全局结构变量、上层函数的结构变量或者是一个已经指向实体结构的指针。只有这样函数的操作才能针对一个具体的实体完成。”

谢谢杨老师,其实就担心这些,以前队列用的很多,不用应用模块直接copy异名函数,现在觉得挺麻烦的。
很多结构相同的实体,每个实体都是几十上百个成员,具体估计还是需要看编译器的处理,从C语言本身来说这样的访问又似乎没有问题,毕竟只要KEIL再入时用的模拟堆栈保护形参指针应该就可以了。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:57 , Processed in 0.155810 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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