快捷搜索:  

keil程序为什么不会自动安排堆栈

广告

keil会分析你的程序使用堆栈情况,会自动安排堆栈的;keil安排堆栈后,就没有默认了。keil,不会自动安排堆栈的,1.查看keil编译后代码大小在Keil中编译工程成功后,keil单片机为什么堆栈深度默认为一字节?为什么一般用keil写51程序不用设置堆栈信息。

1、为什么一般用keil写51程序不用设置堆栈信息,默认是什么样的?

1系统复位默认SP0x07\x0d\x0a2在写C51程序时,有个STARTUP.A51启动文件,文件后面有一句MOVSP,STACK1\x0d\x0a这句就是根据你的静态内存使用量来把SP定位到你所有全局或局部变量的最后面\x0d\x0a3?STACK是个数据段的段名,因为这个段名很特殊,所以这个段始终被连接器最后定位,也就是说你的所有变量的存储地址都被确定好了以后,这个段的存储才最后被确定,自然#?

2、什么叫堆栈

问题一:什么叫做堆栈?堆和栈是两个不同的概念。堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(MemoryLeak)”。

堆栈是一种执行“后进先出”算法的数据结构。设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入――push”)这个区域之中。

3、keil中出现编译错误,错误信息如下,各位大哥大姐给看看是什么原因谢谢...

因为你的程序所用的RAM空间超过了51(128KB)可以在projectoptionfortarget\target1\里面的target标签页里memorymodel里选择large****xdata设置为外部RAM祝你成功。程序贴出来。谢谢,那个问题我解决了,想再请教个事sqrt();括号中的数有没有大小限制。

你的程序中没有xdata变量,说明在Keil设置中,内存模式的设置你选择了“small”,只能使用内部RAM,造成你的变量定义超过128Byte(其实除去工作寄存器组和堆栈,实际能使用的RAM少于128字节),这种错误一般应该在链接时出现。方法有两个:1、减少变量定义,2、更改内存模式设置。

4、用keil的时候怎么自己初始化ram和堆栈而不是编译器帮我们做的

Keil为每个CPU准备了启动用的汇编代码,例如为LPC17xx系列CPU准备的启动文件为startup_LPC17xx.s在这些启动汇编代码中,就包含了RAM和堆栈的初始化设置。如果需要,用户可以自行修改。在建立工程文件的时候,Keil会提醒你是否需要将这个启动代码加入到你的工程中,或者你自己编写启动代码。

5、keil单片机为什么堆栈深度默认为一字节?

采纳答案是错误的。keil,不会自动安排堆栈的。堆栈空间的大小,必须由编程者自己来控制。堆栈深度,也没有默认值。堆栈深度是多少,这要根据你的程序而定。keil会分析你的程序使用堆栈情况,会自动安排堆栈的;keil安排堆栈后,就没有默认了。默认是你不用中断,根据你用的中断多少自己设置中断深度。

6、keil编译成功如何显示

keil编译成功显示如下:keil编译成功时显示的data、xdata、code程序编译成功时会在信息框内显示data、xdata、code各,这就编译成功了。1.查看keil编译后代码大小在Keil中编译工程成功后,在下面的BulidOuput窗口中会输出下面这样一段信息:ProgramSize:Code6320ROdata4864RWdata44ZIdata1636代表的意思:Code:是程序中代码所占字节大小ROdata:程序中所定义的指令和常量大小RWdata:程序中已初始化的变量大小ZIData:程序中未初始化的变量大小ROM(Flash)sizeCode+ROdata+RWdata;RAMsizeRWdata+ZIdata可以通过.map查看占用的flash和ram大小2.STM32堆栈空间溢出解决办法一般导致堆栈空间溢出的原因是:定义数组过大。

您可能还会对下面的文章感兴趣: