- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2023-1-16 23:27:32
|
显示全部楼层
感谢大神指点, 也感谢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
最后希望STC越做越火, 本论变越来越旺, 大家在一起交流各舒已见, 相互促进进步
|
|