大侠们 ,那个zi data到底是什么呢?(已解决),还有os的任务栈的问题(在8楼),谁给俺讲明白了,俺
这几天用MDK写lpc21xx的驱动库,发现zi-data占用量好大,只驱动库就占用zidata 1k之多。在网上查,基本上都是一篇文章,说ram=zidata+rwdata。
那zidata占用RAM的是zidata多大就占用多少,还是zidata是动态分布空间,也就是说zidata是局部变量的统计量,实际上是动态的,几乎不占用内存呢。????
迷茫中。。。。求解释。。。。
http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_641833T7AEVO.jpg
(原文件名:zidata.jpg) ZI data的是初始化为0的数据。在C语言写的程序中,所有没有初始化为不为零的全局变量,编译器都会初始化为0,都为ZI data,在系统运行时,存放在RAM中,但它因为初始值为0,所以不占FLASH空间。 回复【1楼】banyai
-----------------------------------------------------------------------
zi-data是不占flash,我想知道zidata占ram的细节是怎样的。
比如编译出来zidata有1k,那是不是就占真实的RAM 1K呢?
还是zidata是动态空间,占RAM不固定呢??? 就我用的情况来看,ZIRW其实是连在一起的数据段,主要存储的是全局变量。你ZI段编译出来1K,它就占1K的RAM,所谓的动态是根据你的编译情况,定义的变量大小,其实不用深究其原理。一般可以自己写一个分散加载文件,指定你的RWZI到固定内存段去,这样方便管理数据。
不知对不对,纯属个人言论 回复【3楼】fengyuganyu
-----------------------------------------------------------------------
我用mkd新建了一个工程,只有启动文件和main函数,main只有while(1);
这样整个工程占用zi-data 有1k多,,,,,,,,,,,,,,,,
总共8k的RAM这样就被占用了1k多,这还得了啊。求解啊。。。。 刚刚搞明白,是用户/系统堆栈初始化了0x400(1024)的空间,如果把这个堆栈初始化去掉,编译后的zidata剪掉1k的空间。
这样是不是在编译os的时候,可以把这部分去掉或者把它做小一点呢,反正os都是谁的变量谁入栈。。。。
还有一个问题,ucos的局部变量是怎么保存的呢,函数中局部变量小于4个可以不用保存,那个是很大数组呢,高优先级的来抢断,
呢么这部分数据不就丢了么。。。。。
如果定义属猪位静态,那么在任务删除时,这部分空间不就费掉了么。。。。
求解啊。。。。。。!!! 回复【5楼】hzr0071
-----------------------------------------------------------------------
局部变量是放在栈区中,对于有os的系统而言,不同任务的栈区是不同的,因此对于任务抢断时,并不会破坏上一个任务的栈区数据。 1、UCOS的局部变量存放在任务私有栈中,程序不断的运行,其运行主要靠的是SP PC。UCOS一运行,此时局部变量的位置由当前的SP所决定,也就是说,你此时的SP的位置决定了你任务局部变量的位置,那就是为什么编译器决定必须先定义变量然后才能调用。
2、静态数据,说白了就是已经指定了固定位置的数据,任务删除时,此数据任然存在,任务删除只是将其加入空闲链表中。 回复【7楼】fengyuganyu
-----------------------------------------------------------------------
回复【6楼】security
-----------------------------------------------------------------------
谢谢二位指点。终于知道任务栈的用处了。
在ucos中都是用全局数组作为任务栈。我做了一个实验。
声明全局函数taskstack;
在进入task1函数前调用汇编函数
LDR SP,=taskstack
LDR PC,=task1
这样进入task1时任务的局部变量就能局限在定义的任务栈里面了。。。。。
可是,当在task1中定义局部变量,然后再操作时,出现“该区域不能写入”,
用汇编声明 SPACE 的时候可以声明该区域属性为 READWRITE ,在c语言里面应该怎样定义这样的空间呢???
继续求解。。。。 回复【8楼】hzr0071
-----------------------------------------------------------------------
我不明白你的意图,既然使用了ucos,那么任务的栈就应该直接交由os接管,但我可以提出一点疑问,对于ARM而言,栈一般都是往下生长的,而你LDR SP,=taskstack,却将SP指向栈区底部,这是一个问题点。 回复【9楼】security
-----------------------------------------------------------------------
哦。这确实是一个问题。 回复【9楼】security
-----------------------------------------------------------------------
耶,做出来了
uint8 *p;
p=&stack;
TST(p);
然后
TST MOV SP,R0
MOV PC,LR
这样就好了,局部变量局限在了stack中。堆栈是递减的。
告诉我您是谁啊。。。真请您吃饭的。。。。。
页:
[1]