[51单片机] RTOS如何使用XRAM空间?

[复制链接]
570|16
 楼主 | 2019-11-17 18:27 | 显示全部楼层 |阅读模式
现在很多单片机都是51核自带的256byte的SRAM和扩展的XRAM混合的,一般有256SRAM+768XRAM=1KRAM.
如果使用RTOS操作系统,基本都是PC指针切换任务,稍微定义几个人工堆栈,128byte的idate就满了,导致编译失败。
如果此时,把KEIL的内存分配设置成Large模式,虽然能解决使用XRAM的问题,但整个RTOS就失效了。
那么如何有效利用上XRAM呢?

我试着把其他变量用关键词xdata设置到XRAM是正常的,但是如果把RTOS使用的变量(比如,任务堆栈)也分配到XRAM,RTOS就会失效!

764265dd120972ec69.png

使用特权

评论回复
| 2019-11-17 18:57 | 显示全部楼层
51上个毛RTOS???
有个成语叫削足适履。

使用特权

评论回复
| 2019-11-17 22:26 | 显示全部楼层
rtx51 tiny还是挺好用的。
idata基本就是任务堆栈,不能指望再多了。局部变量用xdata。
注意,51的局部变量不是放在堆栈里,是通过覆盖技术实现的。必要的时候查map,看每个任务的覆盖段长度,自己想办法优化。
优化方法太久不用,细节记得不多了。
大概思路,子程序里一个变量,如果先赋值,接着用,然后不再用,就极有可能不会增加覆盖段长度。如果先赋值,然后调用其他子程序,过半天才回来访问这个变量,那这个变量就几乎肯定要占用一点内存。原理有点类似控制堆栈最大深度。

使用特权

评论回复
| 2019-11-18 10:52 | 显示全部楼层
显示定义就可以了
char xdata

堆栈是用不了这部分空间的

使用特权

评论回复
 楼主 | 2019-11-18 17:06 | 显示全部楼层
ayb_ice 发表于 2019-11-18 10:52
显示定义就可以了
char xdata

关键词xdata,我是知道的,关键是堆栈用不了。网上查阅了一番,发现是因为SP是8位的,无法指向xdata区域,所以大佬们解决办法是把堆栈复制到data区。

使用特权

评论回复
 楼主 | 2019-11-18 17:07 | 显示全部楼层
R2D2 发表于 2019-11-17 18:57
51上个毛RTOS???
有个成语叫削足适履。

你想多了,用过你就丢不掉了,我从不裸奔

使用特权

评论回复
| 2019-11-18 17:12 | 显示全部楼层
hayden0 发表于 2019-11-18 17:06
关键词xdata,我是知道的,关键是堆栈用不了。网上查阅了一番,发现是因为SP是8位的,无法指向xdata区域, ...

这是个限制,51的堆栈也只能操作片内RAM

但keil只把返回地址保存在堆栈内(包括中断的寄存器保护),所以对于堆栈需求并不大,局部变量都是静态分配的,所以可以通过显示定义xdata,节约宝贵的片内RAM

使用特权

评论回复
 楼主 | 2019-11-18 17:21 | 显示全部楼层
ayb_ice 发表于 2019-11-18 17:12
这是个限制,51的堆栈也只能操作片内RAM

但keil只把返回地址保存在堆栈内(包括中断的寄存器保护),所 ...

我试过,其实主要还是堆栈太占空间了。要想解决RAM不够用只有把堆栈存到XRAM,使用的时候再复制回来。

使用特权

评论回复
| 2019-11-18 20:25 | 显示全部楼层
51不要搞RTOS了,各种奇技淫巧,没啥luan用,真要用RTOS的场合,直接上高档单片机,整天陶腾便宜货,各种奇技淫巧,貌似很牛X,钱没赚得了几个,看看人家互联网,各种框架套上去,怎么好用怎么堆料堆计算,钱还赚不少

使用特权

评论回复
 楼主 | 2019-11-18 20:30 | 显示全部楼层
雪山飞狐D 发表于 2019-11-18 20:25
51不要搞RTOS了,各种奇技淫巧,没啥luan用,真要用RTOS的场合,直接上高档单片机,整天陶腾便宜货, ...

用过后戒不掉了!!

使用特权

评论回复
| 2019-11-18 20:34 | 显示全部楼层
hayden0 发表于 2019-11-18 20:30
用过后戒不掉了!!

  真的没有任何意义,要用网络协议栈,USB蓝牙栈,依托RTOS场合,就换个高档单片机(也没贵几个钱),你精力过剩就陶腾Linxu,这个稍微赚钱一点

使用特权

评论回复
| 2019-11-18 21:38 | 显示全部楼层
由于 MCS51 内核的堆栈是在 IDATA 里的,  你是没有办法定义到 XDATA 区的

使用特权

评论回复
 楼主 | 2019-11-19 08:19 | 显示全部楼层
airwill 发表于 2019-11-18 21:38
由于 MCS51 内核的堆栈是在 IDATA 里的,  你是没有办法定义到 XDATA 区的

现在可以了

使用特权

评论回复
| 2019-11-19 08:26 | 显示全部楼层
定时器就够了,搞什么rtos

使用特权

评论回复
| 2019-11-19 12:45 | 显示全部楼层
就是瞎扯淡。51就是个小脚老太太的鞋,你个大老爷们的脚(RTOS)硬要往里面套,只能用来被人笑掉大牙。

使用特权

评论回复
 楼主 | 2019-11-19 13:55 | 显示全部楼层
本帖最后由 hayden0 于 2019-11-19 13:58 编辑
R2D2 发表于 2019-11-19 12:45
就是瞎扯淡。51就是个小脚老太太的鞋,你个大老爷们的脚(RTOS)硬要往里面套,只能用来被人笑掉大牙。 ...

003的51单片机,我跑了十几个任务(注意不只是点灯任务)没问题!
这就相当于,Arduino,一直被嘲笑,到处被模仿是一个道理,存在就是合理。
你不喜欢用,不代表别人不能用,个人观点不喜勿喷,也许哪天我撞到南墙就回头了呢!

使用特权

评论回复
| 2019-11-19 21:39 | 显示全部楼层
那就去撞撞墙吧,  大家的建议, 你也不要充耳不闻哦。  也是经验之谈哦

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表