找回密码
 立即注册
楼主: tzz***

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

[复制链接]

该用户从未签到

19

主题

517

回帖

1630

积分

荣誉版主

积分
1630
 楼主| 发表于 2023-1-16 23:27:32 | 显示全部楼层
zhp 发表于 2023-1-16 12:20
Keil的C251编译器对函数可重入的处理是从堆栈上动态分配局部变量
但前提条件是局部变量的类型必须是DATA或 ...

感谢大神指点, 也感谢STC

编译手册是个大物件,英语不好的我暂时不想去查阅, 我从项目生成的汇编中查看,确实是把XDATA局部变量的数据生成在了一个固定的地方.非常感谢解或!!
其实大多数时候局部变量就是用来存储一些临时数据,中间结果之类的东西,用不到很大的内存块,所以直接用默认的EDATA就可以了,这个问题也不算是个大问题.
而且就算是要用到很大的内存块,也有其它办法可以解决,比如说内存管理
之所以揪着不放,就是希望从源头上找出原因. 并且也能起到提醒作用,在使用OS后局部变量定义到XDATA就要小心了.
但此事到此并没有结束,即然是定义到一个固定的地方,那么我又突然想到了点什么?  调用树覆盖技术? 于是又去验证了一下,果然!
在使用了OS,(就意谓着你默认所有的函数都可重入的,否则会有无穷无尽的烦恼),然而调用树覆盖技术在单任务系统中效果很好,可以同时提高内存利用率和效率. 却并不合适多任务的OS, 因为OS任务切换打乱了原来的调用结构, 调用树失效了.
到这里,我就是明白了,就算是实际使用中,没有发生重入, 或都某个函数只被调用一次,只要是你把局部变量定义为XDATA区,那么都是可能被覆盖重写的,因为除了函数自己,还会有别的函数会使用这个地址(调用树覆盖,重复利用).
这样就得出了另外一个新的结论, 使用了OS后, 就不可以把局部变量定义到XDATA区域. 不管这个函数是可重入,还是不可重入. (不用OS的,没有这个问题)
我这个结论是否正确呢? 也请大神也解或一下.
这里是STC的官论谈, 我不知道本楼的大神是不STC的人员, 但是STC管理员回贴的速度还是很有效率的,很快, 得点一个大大的赞!
我用STC超十年,说实在的,有感情, 当看到STC可以上OS时,确实是很激动, 因为51内核上上OS确实有些别扭, 但251就不同了, 4K的EDATA, 足矣, 加上DMA,USB,硬件乖除,浮点,等等非富外设, 直的是比以前的51一次性提高了好几个段位.
说多了,说着说着偏题了,笑一个:lol
最后希望宏晶越做越火, 本论变越来越旺, 大家在一起交流各舒已见, 相互促进进步

点评

zhp
惭愧,其实我也只是略懂皮毛,我们可以一起共同探讨,共同进步 关于你上面得出的结论,我个人觉得基本是没问题的 1、对于多任务的OS,如果一个函数可能被多个任务同时调用,那么局部变量一定不能为xdata类型,正如  详情 回复 发表于 2023-1-17 10:04
  • TA的每日心情
    开心
    2024-1-4 08:56
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    16

    主题

    711

    回帖

    2520

    积分

    超级版主

    积分
    2520
    发表于 2023-1-17 10:04:20 | 显示全部楼层
    tzz1983 发表于 2023-1-16 23:27
    感谢大神指点, 也感谢STC

    编译手册是个大物件,英语不好的我暂时不想去查阅, 我从项目生成的汇编中查看, ...

    惭愧,其实我也只是略懂皮毛,我们可以一起共同探讨,共同进步
    关于你上面得出的结论,我个人觉得基本是没问题的

    1、对于多任务的OS,如果一个函数可能被多个任务同时调用,那么局部变量一定不能为xdata类型,正如你所说的,会出现覆盖重写
    2、对于非OS系统,主循环、中断以及多级优先级的中断之间也会发生代码并发执行,所以如果有被主循环和中断同时调用的函数,则此函数的局部变量不能定义为xdata类型
    3、另外,如果某个函数会出现递归调用(包括函数A调用函数A的直接递归,以及类似函数A调用函数B、函数B调用函数C、函数C再调用函数A的这种间接递归),此函数的局部变量也是不能定义为xdata类型
    4、除了上面的几种情况外,只要一个函数只在一个进程中被调用,比如函数只在主循环中调用或者只在某个中断中被调用,即使被多次调用也没关系,这个函数的局部变量对类型就没有要求了
    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9221

    回帖

    1万

    积分

    管理员

    积分
    13912
    发表于 2023-1-17 11:54:03 | 显示全部楼层
    在3月的雨季 STC32G12K64-72MHz-LQFP48/LQFP32/TSSOP20会悄悄的回来
    ===8K edata, 4k xdata, STC 要建设 FreeRTOS 生态

    现在的STC32G12K128-35MHz-LQFP64/48/32
    ===4K edata, 8k xdata
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-4-27 03:45 , Processed in 0.060091 second(s), 36 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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