找回密码
 立即注册
查看: 2496|回复: 12

请教 在FREERTOS 中用 XDATA的一个疑问

[复制链接]

该用户从未签到

19

主题

514

回帖

1622

积分

荣誉版主

积分
1622
发表于 2023-1-15 13:08:56 | 显示全部楼层 |阅读模式
大家好, 问大家一个问题 ,我最近在测试在STC32G运行FREERTOS时,所有函数都在编译器上统一设定为可重入的。但是,当某个函数的局部变量被强制定义在XDATA区时(默认是EDATA区,不会发生覆盖), 如果两个任务同时调用一个函数(抢占发生重入),就会产生局部变量被覆盖的问题,这个问题你们有遇到过吗,是怎么解决的呢.

另外需要说明的是,我用的FREERTOS是在STC官网上下载的基础上自己改过的, 官网的版本说明里,曾经也提到过早期版本不能使用XDATA的问题 ,是不是我在改进的过程中忽略了某个细节,才会导致这样的结果, 还是有更深层次的原因, 望高手指点, 不胜感激!!
回复 送花

使用道具 举报

该用户从未签到

547

主题

9120

回帖

1万

积分

管理员

积分
14127
发表于 2023-1-15 13:26:25 | 显示全部楼层
1,  尽量不改 STC 的代码
2,用xdata的程序尽量简单,只是点灯,加上详细说明,将问题简单化
3,项目文件发上来,我们周一帮您找出原因后,帮您修改好再源码发上来给您,你再发挥

该用户从未签到

19

主题

514

回帖

1622

积分

荣誉版主

积分
1622
 楼主| 发表于 2023-1-15 13:38:27 | 显示全部楼层
神农鼎 发表于 2023-1-15 13:26
1,  尽量不改 STC 的代码
2,用xdata的程序尽量简单,只是点灯,加上详细说明,将问题简单化
3,项目文件发 ...

平常我也不怎么要玩论谈,不会上传文件,指点怎么上传文件:lol,
另外我用的这个确实改了好多地方,传上来也好,大家交流

该用户从未签到

547

主题

9120

回帖

1万

积分

管理员

积分
14127
发表于 2023-1-15 14:01:48 | 显示全部楼层
平常我也不怎么要玩论谈,不会上传文件,指点怎么上传文件:
1.png 1.png
点击最右边的 【回型针】 就是上传文件

该用户从未签到

45

主题

2847

回帖

6402

积分

超级版主

积分
6402
发表于 2023-1-15 14:02:43 | 显示全部楼层
我的策略是:
1、函数不要耗费太多的时间。在项目中,函数一般处理的时间都是在ms级别之内,而占先切换一般定义10ms,这样就能避免重入。
2、不同任务不要调用同一个函数,避免重入问题,毕竟实际项目中,不同任务调用同一个函数的机会比较少,如果有,也可以设置2个函数名不同即可。

该用户从未签到

547

主题

9120

回帖

1万

积分

管理员

积分
14127
发表于 2023-1-15 14:04:12 | 显示全部楼层
另外我用的这个确实改了好多地方,传上来也好,大家交流
===不能这样,你必须让大家3分钟 搞清你做了啥,你用1个灯代表1个任务,简化程序
===复杂了,要别人学习1个小时,那就没人学习你的错误程序了
===必须简化和加上说明到,别人 2 ~ 3 分钟 知到你改了啥

该用户从未签到

19

主题

514

回帖

1622

积分

荣誉版主

积分
1622
 楼主| 发表于 2023-1-15 14:52:40 | 显示全部楼层
神农鼎 发表于 2023-1-15 14:04
另外我用的这个确实改了好多地方,传上来也好,大家交流
===不能这样,你必须让大家3分钟 搞清你做了啥,你用 ...

你说得对,这里我先是提出了一个问题,发出来看看这个问题是否有共性.
等会我再用STC的原码测试一遍,如果还是有问题,
那就用原码+最简化产生问题代码的开形式发出来.

该用户从未签到

19

主题

514

回帖

1622

积分

荣誉版主

积分
1622
 楼主| 发表于 2023-1-15 17:29:30 | 显示全部楼层
代码来了,在附件里

FREE_XDATA.rar

3.47 MB, 下载次数: 92

该用户从未签到

19

主题

514

回帖

1622

积分

荣誉版主

积分
1622
 楼主| 发表于 2023-1-15 17:33:39 | 显示全部楼层
tzz1983 发表于 2023-1-15 17:29
代码来了,在附件里

捕获1.PNG 捕获2.PNG
刚才忘记了上图,不喜欢看代码,就直接看图
为了简化问题,这次我使用的是没修改过的STC代码

点评

zhp
Keil的C251编译器对函数可重入的处理是从堆栈上动态分配局部变量 但前提条件是局部变量的类型必须是DATA或EDATA类型 而对于函数内部的XDATA类型的局部变量,即使函数被声明为可重入 XDATA变量依然会从XDATA区进行  详情 回复 发表于 2023-1-16 12:20
  • TA的每日心情
    开心
    2024-1-4 08:56
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    16

    主题

    711

    回帖

    2510

    积分

    超级版主

    积分
    2510
    发表于 2023-1-16 12:20:43 | 显示全部楼层
    tzz1983 发表于 2023-1-15 17:33
    刚才忘记了上图,不喜欢看代码,就直接看图
    为了简化问题,这次我使用的是没修改过的STC代码
    ...

    Keil的C251编译器对函数可重入的处理是从堆栈上动态分配局部变量
    但前提条件是局部变量的类型必须是DATA或EDATA类型

    而对于函数内部的XDATA类型的局部变量,即使函数被声明为可重入
    XDATA变量依然会从XDATA区进行静态分配,也就是变量的地址在编译时就已固定了
    此时如果不同的任务同时调用这个函数时,就一定会发生数据覆盖的问题

    另外,C251是C编译器,没有类、对象、实例的概念
    1.png
    即使是可重入函数,编译器也不会有每调用一次就重新生成一个新的副本这种操作

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

    本版积分规则

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

    GMT+8, 2024-4-20 08:24 , Processed in 0.070115 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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