请教 在FREERTOS 中用 XDATA的一个疑问
大家好, 问大家一个问题 ,我最近在测试在STC32G运行FREERTOS时,所有函数都在编译器上统一设定为可重入的。但是,当某个函数的局部变量被强制定义在XDATA区时(默认是EDATA区,不会发生覆盖), 如果两个任务同时调用一个函数(抢占发生重入),就会产生局部变量被覆盖的问题,这个问题你们有遇到过吗,是怎么解决的呢.另外需要说明的是,我用的FREERTOS是在STC官网上下载的基础上自己改过的, 官网的版本说明里,曾经也提到过早期版本不能使用XDATA的问题 ,是不是我在改进的过程中忽略了某个细节,才会导致这样的结果, 还是有更深层次的原因, 望高手指点, 不胜感激!!
1,尽量不改 STC 的代码
2,用xdata的程序尽量简单,只是点灯,加上详细说明,将问题简单化
3,项目文件发上来,我们周一帮您找出原因后,帮您修改好再源码发上来给您,你再发挥 神农鼎 发表于 2023-1-15 13:26
1,尽量不改 STC 的代码
2,用xdata的程序尽量简单,只是点灯,加上详细说明,将问题简单化
3,项目文件发 ...
平常我也不怎么要玩论谈,不会上传文件,指点怎么上传文件:lol,
另外我用的这个确实改了好多地方,传上来也好,大家交流
平常我也不怎么要玩论谈,不会上传文件,指点怎么上传文件:
点击最右边的 【回型针】 就是上传文件
我的策略是:
1、函数不要耗费太多的时间。在项目中,函数一般处理的时间都是在ms级别之内,而占先切换一般定义10ms,这样就能避免重入。
2、不同任务不要调用同一个函数,避免重入问题,毕竟实际项目中,不同任务调用同一个函数的机会比较少,如果有,也可以设置2个函数名不同即可。 另外我用的这个确实改了好多地方,传上来也好,大家交流
===不能这样,你必须让大家3分钟 搞清你做了啥,你用1个灯代表1个任务,简化程序
===复杂了,要别人学习1个小时,那就没人学习你的错误程序了
===必须简化和加上说明到,别人 2 ~ 3 分钟 知到你改了啥 神农鼎 发表于 2023-1-15 14:04
另外我用的这个确实改了好多地方,传上来也好,大家交流
===不能这样,你必须让大家3分钟 搞清你做了啥,你用 ...
你说得对,这里我先是提出了一个问题,发出来看看这个问题是否有共性.
等会我再用STC的原码测试一遍,如果还是有问题,
那就用原码+最简化产生问题代码的开形式发出来. 代码来了,在附件里 tzz1983 发表于 2023-1-15 17:29
代码来了,在附件里
刚才忘记了上图,不喜欢看代码,就直接看图
为了简化问题,这次我使用的是没修改过的STC代码
tzz1983 发表于 2023-1-15 17:33
刚才忘记了上图,不喜欢看代码,就直接看图
为了简化问题,这次我使用的是没修改过的STC代码
...
Keil的C251编译器对函数可重入的处理是从堆栈上动态分配局部变量
但前提条件是局部变量的类型必须是DATA或EDATA类型
而对于函数内部的XDATA类型的局部变量,即使函数被声明为可重入
XDATA变量依然会从XDATA区进行静态分配,也就是变量的地址在编译时就已固定了
此时如果不同的任务同时调用这个函数时,就一定会发生数据覆盖的问题
另外,C251是C编译器,没有类、对象、实例的概念
即使是可重入函数,编译器也不会有每调用一次就重新生成一个新的副本这种操作
页:
[1]
2