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

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

[复制链接]
  • TA的每日心情
    开心
    2023-12-18 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    12

    主题

    90

    回帖

    245

    积分

    中级会员

    积分
    245
    发表于 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;
    }

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

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-18 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    12

    主题

    90

    回帖

    245

    积分

    中级会员

    积分
    245
     楼主| 发表于 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, 2024-5-18 16:14 , Processed in 0.058882 second(s), 36 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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