用keil编译程序出错硬件仿真出错
keil中出现编译错误,我用keil编译的程序出错,keil硬件仿真时,keil为什么我屏蔽了局部变量却说我内存溢出在团队工作中,经常会有模块维护和代码封装的问题。你的程序中没有xdata变量,说明在Keil设置中,内存模式的设置你选择了“small”,只能使用内部RAM,造成你的变量定义超过128Byte(其实除去工作寄存器组和堆栈,实际能使用的RAM少于128字节),这种错误一般应该在链接时出现。
1、KEIL中定义函数过多…生成hex文件时提示溢出怎么办就是那个IDATA……函...第一种呢,就是尽量多用子函数,在子函数中定义变量,这样,子函数执行完,变量空间就被释放了。少用全局变量(全局变量大概是51单片机的特色了!第二种呢,就是修改STARTUP.A51文件,将堆栈设置大一些。然后将源程序与startup.a51分别编译,统一链接。听说还有一种方法,用于消除编译器分配变量时产生的数据沟。可惜没用过,你可以查一下KEIL的帮助文档。
2、我用keil编译的程序出错,不懂,求指导?数据地址空间溢出是怎么回事...你内存用的太多了,超出了这款芯片的实际RAM容量,所以报错。好好把程序中的变量整理整理,不要定义太多的全局变量和静态变量,有些地方RAM能复用就复用,数组用多少就开多大,不要大手大脚。单片机使用内存都要精打细算的,咱们和写PC软件的兄弟可不能比啊。
3、keil中出现编译错误,错误信息如下,各位大哥大姐给看看是什么原因谢谢...因为你的程序所用的RAM空间超过了51(128KB)可以在projectoptionfortarget\target1\里面的target标签页里memorymodel里选择large****xdata设置为外部RAM祝你成功。程序贴出来。谢谢,那个问题我解决了,想再请教个事sqrt();括号中的数有没有大小限制。
你的程序中没有xdata变量,说明在Keil设置中,内存模式的设置你选择了“small”,只能使用内部RAM,造成你的变量定义超过128Byte(其实除去工作寄存器组和堆栈,实际能使用的RAM少于128字节),这种错误一般应该在链接时出现。方法有两个:1、减少变量定义,2、更改内存模式设置。
dat是uint类型,有可能超出了其最大范围。这可能是编译程序优化的结果,实际上,程序没有为存储空间初始化指定的值,数值直接进寄存器了,所以存储空间值为0。如果dat值会被改变,就不一样了,你试试增加一条指令datdat*2看看,就有值了。4、keil硬件仿真时,显示变量的值错误寄存器变量可以实时更新,内存变量只有在第一次断点看到的数据是实际的,此后不再更新。只是看不到,内部运行当然还是有正常更新,只是看不到而已。知道怎么处理的说下。JLINK,这个问题我没遇到,但是用STM32的SWJ模式好些,省IO口,还速度快。watch窗口里的变量即便是在片子运行期间都会跟着变化,不是实时的,有滞后,但好过JTAG模式那样停止后才更新。
5、keil为什么我屏蔽了局部变量却说我内存溢出在团队工作中,经常会有模块维护和代码封装的问题。把需要封装的代码打成一个lib无疑是一种很好的方式。1.创建lib创建一个lib很容易,只需要创建一个target,然后把需要封装的代码全部加进来,然后再OptionsofTarget中选择CreateLibrary,然后编译,因为是lib所以不需要链接,编译过了,你的lib就创建了。
2.使用lib使用lib就更容易了,把lib和头文件加入你的工程,直接调用就是了。lib库会和你工程中其它编译后的obj一起链接,形成最后的目标文件。3.注意事项首先,Startup和中断处理程序不要封入LIB,这些程序会在链接的时候产生问题。具体的原因么,有点复杂,应该是中断程序的link机制有所不同的关系吧。
6、keil编译地址空间溢出编译模式最好选small也就是你说的data模式你只要把你的一些变量定义到Xdata或code就可以解决问题了data211.6xdata0code9745看到了没,data211.6已经超出内ram范围而xdata还没使用呢定义变量时如此便可unsignedcharxdatax。data区已经被占了211.6字节,剩下一个109字节的块当然塞不进去了优化优化变量吧,区区10k代码就把256字节用爆,你实在太大手大脚了,呵呵。