7527|30

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

讨论 WINCE5 2440 中堆和栈的分配问题 [复制链接]

在一个线程中定义一个数组, 大小为320*240*8
定义1:U8 cData[320*240*8];   这个应该存在系统的stack里面,结果data abort失败了,提示就是stack的问题,于是重新
定义2:U8 *cData = new U8[320*240*8]  ,这个没有问题


问题一:ARM 2440在WINCE5中分配的stack有多大,在什么位置,在什么文件里面有说明?应该在CPU初始化的时候设置了,。。。
问题二:ARM 2440在WINCE5中分配的堆最大能够分配多少?

有些细节,不是很清楚,知道的朋友讨论哈!

最新回复

tvn
嗯,现在我也理解了一些。看来要走的路还很远呢。  详情 回复 发表于 2009-8-4 14:12
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
还有就是虚拟地址的访问问题,譬如说想把0x007f0020中的数据拷贝到0xa0100000中去,这样的虚拟地址访问有什么方法吗?
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 fan227 的回复:
还有就是虚拟地址的访问问题,譬如说想把0x007f0020中的数据拷贝到0xa0100000中去,这样的虚拟地址访问有什么方法吗?
[/quote]

0x007f0020是物理地址吧,要弄他的数据就访问对应的虚拟地址即可。搬到0xa0100000也就好办了。

据我的经验,在MMU开启之后再去访问物理地址会产生异常的。
[quote]引用 1 楼 fan227 的回复:
问题一:ARM 2440在WINCE5中分配的stack有多大,在什么位置,在什么文件里面有说明?应该在CPU初始化的时候设置了,。。。
问题二:ARM 2440在WINCE5中分配的堆最大能够分配多少?


在bootloader阶段药费配stack,你看看那些汇编等文件,都有的。

在bootloader之后也要分配,至于多大,我没有想过,只是照着搬过来。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
0x007f0020,这个应该不是物理地址,用户空间的虚拟地址,而且,涉及到对虚拟地址访问权限的问题,所以直接COPY产生了data abort的提示,其实第一个和第二个问题,我只是不确定,应该说我觉得,我的想法应该是没有错的,我以前看过2440的init.s汇编代码,里面有对stack的分配,这个可以查到,但是我不知道heap的分配,WINCE5有没有限制,所以想讨论哈。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 fan227 的回复:
0x007f0020,这个应该不是物理地址,用户空间的虚拟地址,而且,涉及到对虚拟地址访问权限的问题,所以直接COPY产生了data abort的提示,其实第一个和第二个问题,我只是不确定,应该说我觉得,我的想法应该是没有错的,我以前看过2440的init.s汇编代码,里面有对stack的分配,这个可以查到,但是我不知道heap的分配,WINCE5有没有限制,所以想讨论哈。


你看看内存映射表

虚拟内存cached 范围是0X80000000~0x9fffffff

这个0x007f0020明显不再虚拟地址范围。

你我都是2440 难道内存映射表你自己修改了?

不会不同吧

我昨天由于在wince启动后访问了物理地址,导致异常。现在我修改了代码,就不会异常了。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个是0X80000000~0x9fffffff 内核空间的虚拟地址啊,0x007f0020这个地址就是串口打印的变量地址,也就是这个U8 *cData = new U8[320*240*8]啊,cData 地址,
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
我的HEAP与STACK的详细区别我也想知道
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

8
 
应该是用户空间虚拟地址。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
线程的栈大小由几个因素决定,跟CPU关系不大。
1,在创建线程时,CreateThread有一个StackSize参数用来指定栈大小。
2,如果你不指定,CreateThread用默认栈大小。可执行程序(EXE, DLL)的PE header中有一个默认栈的参数,你可以在链接选项里设定。VC 2005的默认栈大小好像是64K,PB好像是1MB,跟你具体用的开发工具有关。
一般来说很大的数组应该动态分配内存,在栈上分配是很不划算的。CE5堆的大小满打满算不能大于一个SLOT的地址空间,即32M。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 1 楼 fan227 的回复:
还有就是虚拟地址的访问问题,譬如说想把0x007f0020中的数据拷贝到0xa0100000中去,这样的虚拟地址访问有什么方法吗?

只要你能保证这两个地址空间都正确的映射到了实际的物理内存就没问题。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼上的,理解很透彻啊,说的很详细啊,不过第三个问题,不知道是该如何解决啊,用SetKmode(TRUE)也不能在0x007f0020虚拟地址和0xA0100000之间进行数据拷贝,还是提示data abort
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
0xa0100000这个地址肯定映射到了物理地址,0x007f0020这个地址就不知道,只是new的变量地址,有什么办法查看他是否影射到了物理地址的啊???
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 8 楼 singlerace 的回复:
线程的栈大小由几个因素决定,跟CPU关系不大。
1,在创建线程时,CreateThread有一个StackSize参数用来指定栈大小。
2,如果你不指定,CreateThread用默认栈大小。可执行程序(EXE, DLL)的PE header中有一个默认栈的参数,你可以在链接选项里设定。VC 2005的默认栈大小好像是64K,PB好像是1MB,跟你具体用的开发工具有关。
一般来说很大的数组应该动态分配内存,在栈上分配是很不划算的。CE5堆的大小满打满算不能大于一个S…

这个也就是说,在2440 bootloader中的start.s中的stack大小,在最后系统跑起来的时候,是没有起作用的,但是在oal中的start.s中汇编,不知道有没有再设置stack大小,这段汇编,我还没有看,所以不知道。。。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

14
 
所谓栈,也就是SP寄存器指向的地址,SP指到哪儿哪儿就是栈。boot loader中没有操作系统,你要用栈得自己把SP设置到合适的地址。CE内核起来以后,内核会为线程设置SP寄存器。
0x007f0020应该是你new出来的,在堆上。
0xA0100000,这个是静态映射地址,普通进程不能访问,当然调SetKMode(TRUE)后也可以访问。这个地址具体映射到内存还是其他外设取决于你BSP的地址映射表。把映射表贴出来看看。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 singlerace 的回复:
所谓栈,也就是SP寄存器指向的地址,SP指到哪儿哪儿就是栈。boot loader中没有操作系统,你要用栈得自己把SP设置到合适的地址。CE内核起来以后,内核会为线程设置SP寄存器。
0x007f0020应该是你new出来的,在堆上。
0xA0100000,这个是静态映射地址,普通进程不能访问,当然调SetKMode(TRUE)后也可以访问。这个地址具体映射到内存还是其他外设取决于你BSP的地址映射表。把映射表贴出来看看。



singlerace 前辈实在太厉害了。我刚才正纳闷。我的串口打印一个指针的地址是0x290000。我还纳闷这个地址不是内存映射表上的虚拟地址范围。怎么这次访问它不会出现异常了。原来是堆等东西。

汗,我真是井底之蛙!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 singlerace 的回复:
所谓栈,也就是SP寄存器指向的地址,SP指到哪儿哪儿就是栈。boot loader中没有操作系统,你要用栈得自己把SP设置到合适的地址。CE内核起来以后,内核会为线程设置SP寄存器。
0x007f0020应该是你new出来的,在堆上。
0xA0100000,这个是静态映射地址,普通进程不能访问,当然调SetKMode(TRUE)后也可以访问。这个地址具体映射到内存还是其他外设取决于你BSP的地址映射表。把映射表贴出来看看。

可能我没有描述清楚,我知道0x007f0020是堆上的地址,但是我没有办法知道它是否映射到了物理地址,是否映射成功了,因为我new的它,还有0xA0100000是我的显示BUFF,对应我的显示缓冲区,但是0x007f0020是用户态下的虚拟地址,而且我也SetKMode(TRUE),按道理说线程这个时候可以访问所有的有效虚拟地址啊,但是memcpy的时候还是提示data abort,所以我也想看看有没有函数可以查看0x007f0020究竟有没有映射物理地址成功。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
还有我只能用串口调试,其它的任何调试方式都没法用,痛苦。。。。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
显示缓冲区??0xA0100000你是怎么得到的?是OEMAddressTable里静态映射的还是用VirtualAlloc分配的?把OEMAddressTable贴出来看看。如果你是在display driver里分配的,用这个API试试:SetProcPermissions(-1)
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

19
 
new出来的地址肯定映射到了物理内存,这个不用怀疑。还有一点,拷贝操作是在哪个进程里做的?是new操作的进程还是其它进程?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 singlerace 的回复:
new出来的地址肯定映射到了物理内存,这个不用怀疑。还有一点,拷贝操作是在哪个进程里做的?是new操作的进程还是其它进程?

拷贝操作是在new 进程里面进行的,下面是我的OEMADDRTAB_CFG.INC中关于g_oalAddressTable的定义, 0xA0100000这个地址,另外的一段代码成功的将数据写进了这个显示缓冲区,并显示出来了,所以这个地址应该是可以操作的,没有问题,不过你到把我问到了, g_oalAddressTable确实指静态影射了cached 内核区域,见下面就是,uncached 内核区域好象没有静态影射,使用时直接加个偏移地址0x70000000, 今天我找到一种方法跳过这个问题啦,但是这个是什么原因造成的data abort, 究竟是什么地址有问题,还是不太清楚.
g_oalAddressTable

        DCD     0x80000000, 0x30000000, 64      ; 32 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
        DCD     0x88000000, 0x20000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 4
        DCD     0x8A000000, 0x28000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 5
        DCD     0x8C000000, 0x08000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 1
        DCD     0x90800000, 0x48000000,  1      ; Memory control register
        DCD     0x90900000, 0x49000000,  1      ; USB Host register
        DCD     0x90A00000, 0x4A000000,  1      ; Interrupt Control register
        DCD     0x90B00000, 0x4B000000,  1      ; DMA control register
        DCD     0x90C00000, 0x4C000000,  1      ; Clock & Power register
        DCD     0x90D00000, 0x4D000000,  1      ; LCD control register
        DCD     0x90E00000, 0x4E000000,  1      ; NAND flash control register
        DCD     0x90F00000, 0x4F000000,  1      ; Camera control register
        DCD     0x91000000, 0x50000000,  1      ; UART control register
        DCD     0x91100000, 0x51000000,  1      ; PWM timer register
        DCD     0x91200000, 0x52000000,  1      ; USB device register
        DCD     0x91300000, 0x53000000,  1      ; Watchdog Timer register
        DCD     0x91400000, 0x54000000,  1      ; IIC control register
        DCD     0x91500000, 0x55000000,  1      ; IIS control register
        DCD     0x91600000, 0x56000000,  1      ; I/O Port register
        DCD     0x91700000, 0x57000000,  1      ; RTC control register
        DCD     0x91800000, 0x58000000,  1      ; A/D convert register
        DCD     0x91900000, 0x59000000,  1      ; SPI register
        DCD     0x91A00000, 0x5A000000,  1      ; SD Interface register
        DCD     0x92000000, 0x00000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 0
        DCD     0x00000000, 0x00000000,  0      ; end of table
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表