搜索
bottom↓
回复: 11

大侠们 ,那个zi data到底是什么呢?(已解决),还有os的任务栈的问题(在8楼),谁给俺讲明白了,俺

[复制链接]

出0入0汤圆

发表于 2011-5-21 20:08:22 | 显示全部楼层 |阅读模式
这几天用MDK写lpc21xx的驱动库,发现zi-data占用量好大,只驱动库就占用zidata 1k之多。
在网上查,基本上都是一篇文章,说ram=zidata+rwdata。
那zidata占用RAM的是zidata多大就占用多少,还是zidata是动态分布空间,也就是说zidata是局部变量的统计量,实际上是动态的,几乎不占用内存呢。????
迷茫中。。。。求解释。。。。

(原文件名:zidata.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

发表于 2011-5-21 20:16:37 | 显示全部楼层
ZI data的是初始化为0的数据。在C语言写的程序中,所有没有初始化为不为零的全局变量,编译器都会初始化为0,都为ZI data,在系统运行时,存放在RAM中,但它因为初始值为0,所以不占FLASH空间。

出0入0汤圆

 楼主| 发表于 2011-5-21 20:42:12 | 显示全部楼层
回复【1楼】banyai  
-----------------------------------------------------------------------

zi-data是不占flash,我想知道zidata占ram的细节是怎样的。
比如编译出来zidata有1k,那是不是就占真实的RAM 1K呢?
还是zidata是动态空间,占RAM不固定呢???

出0入0汤圆

发表于 2011-5-21 20:48:36 | 显示全部楼层
就我用的情况来看,ZIRW其实是连在一起的数据段,主要存储的是全局变量。你ZI段编译出来1K,它就占1K的RAM,所谓的动态是根据你的编译情况,定义的变量大小,其实不用深究其原理。一般可以自己写一个分散加载文件,指定你的RWZI到固定内存段去,这样方便管理数据。

不知对不对,纯属个人言论

出0入0汤圆

 楼主| 发表于 2011-5-21 21:23:50 | 显示全部楼层
回复【3楼】fengyuganyu  
-----------------------------------------------------------------------

我用mkd新建了一个工程,只有启动文件和main函数,main只有while(1);
这样整个工程占用zi-data 有1k多,,,,,,,,,,,,,,,,
总共8k的RAM这样就被占用了1k多,这还得了啊。求解啊。。。。

出0入0汤圆

 楼主| 发表于 2011-5-21 21:47:37 | 显示全部楼层
刚刚搞明白,是用户/系统堆栈初始化了0x400(1024)的空间,如果把这个堆栈初始化去掉,编译后的zidata剪掉1k的空间。
这样是不是在编译os的时候,可以把这部分去掉或者把它做小一点呢,反正os都是谁的变量谁入栈。。。。


还有一个问题,ucos的局部变量是怎么保存的呢,函数中局部变量小于4个可以不用保存,那个是很大数组呢,高优先级的来抢断,
呢么这部分数据不就丢了么。。。。。
如果定义属猪位静态,那么在任务删除时,这部分空间不就费掉了么。。。。
求解啊。。。。。。!!!

出0入8汤圆

发表于 2011-5-21 23:14:41 | 显示全部楼层
回复【5楼】hzr0071
-----------------------------------------------------------------------

局部变量是放在栈区中,对于有os的系统而言,不同任务的栈区是不同的,因此对于任务抢断时,并不会破坏上一个任务的栈区数据。

出0入0汤圆

发表于 2011-5-22 00:31:28 | 显示全部楼层
1、UCOS的局部变量存放在任务私有栈中,程序不断的运行,其运行主要靠的是SP PC。UCOS一运行,此时局部变量的位置由当前的SP所决定,也就是说,你此时的SP的位置决定了你任务局部变量的位置,那就是为什么编译器决定必须先定义变量然后才能调用。
2、静态数据,说白了就是已经指定了固定位置的数据,任务删除时,此数据任然存在,任务删除只是将其加入空闲链表中。

出0入0汤圆

 楼主| 发表于 2011-5-22 10:17:40 | 显示全部楼层
回复【7楼】fengyuganyu  
-----------------------------------------------------------------------

回复【6楼】security  
-----------------------------------------------------------------------

谢谢二位指点。终于知道任务栈的用处了。

在ucos中都是用全局数组作为任务栈。我做了一个实验。
声明全局函数taskstack[100];
在进入task1函数前调用汇编函数
LDR SP,=taskstack
LDR PC,=task1
这样进入task1时任务的局部变量就能局限在定义的任务栈里面了。。。。。
可是,当在task1中定义局部变量,然后再操作时,出现“该区域不能写入”,
用汇编声明 SPACE 的时候可以声明该区域属性为 READWRITE ,在c语言里面应该怎样定义这样的空间呢???

继续求解。。。。

出0入8汤圆

发表于 2011-5-22 10:36:24 | 显示全部楼层
回复【8楼】hzr0071
-----------------------------------------------------------------------

我不明白你的意图,既然使用了ucos,那么任务的栈就应该直接交由os接管,但我可以提出一点疑问,对于ARM而言,栈一般都是往下生长的,而你LDR SP,=taskstack,却将SP指向栈区底部,这是一个问题点。

出0入0汤圆

 楼主| 发表于 2011-5-22 10:46:31 | 显示全部楼层
回复【9楼】security  
-----------------------------------------------------------------------

哦。这确实是一个问题。

出0入0汤圆

 楼主| 发表于 2011-5-22 10:48:29 | 显示全部楼层
回复【9楼】security  
-----------------------------------------------------------------------

耶,做出来了
uint8 *p;
p=&stack[99];
TST(p);

然后
TST         MOV SP,R0  
           
            MOV PC,LR
这样就好了,局部变量局限在了stack中。堆栈是递减的。


告诉我您是谁啊。。。真请您吃饭的。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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