用keil仿真也进不了main

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用keil仿真也进不了main相关的知识,希望对你有一定的参考价值。

我用keil仿真也进不了main ,在网上找了很多资料,但是一直没有解决,, 仿真的时候提示err:no write permission.......单步调试的时候程序一直在下面这段跑:0x00008A62 EB004410 ADD r4,r0,r0,LSR #16
0x00008A66 F8424021 STR r4,[r2,r1,LSL #2]
0x00008A6A 4C16 LDR r4,[pc,#88] ; @0x00008AC4
0x00008A6C 1C49 ADDS r1,r1,#1
0x00008A6E 2937 CMP r1,#0x37
0x00008A70 FB003004 MLA r0,r0,r4,r3
0x00008A74 DBF5 BLT 0x00008A62
0x00008A76 BD10 POP r4,pc

求解释,,, 是程序的问题么,,

keil模拟仿真的问题,没有加载相关的cpu模块,或者模块不对,或者KEIL没有这个CPU模块;
在模拟仿真前需要用配置文件描述你所访问的区域的读写许可。用硬件仿真就没有这个问题了。
参考技术A 程序问题
你可以先从简单工程开始,测试好了再加进你自己的模块代码.

用keil仿真时显示*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS *** WARNING L16: UNC

程序如下
#include <AT89X51.h>
#include <absacc.h>
#include<stdio.h>
#include<math.h>
#define WR_COM XBYTE[0x7ff0]
#define RD_STA XBYTE[0x7ff2]
#define WR_DAT XBYTE[0x7ff1]
#define RD_DAT XBYTE[0x7ff3]
sbit p32=P3^2;
void init_LCD();
void init_cgram();
//void test_lcd();
void clr_lcd();
void PutChar(char t);
void delay();
void lcdprintf(char x,char y,char *s);

char code CGRAM_TABLE[]=0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,// ;年
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //;月
0x0F,0x09,0x09,0x0F,0x0,0x09,0x0F,0x00; // ;日
void delay()

unsigned char i;
for(i=0;i<250;i++);

void init_LCD()

unsigned char i;
WR_COM=0x38; //设置为8位数据总线,16*2,5*7点阵
for(i=0;i<100;i++)
delay();
WR_COM=0x01; //清屏幕
for(i=0;i<50;i++)
delay();
WR_COM=0x06; //光标移动,显示区不移动,读写操作后AC加1
for(i=0;i<50;i++)
delay();
WR_COM=0x0c;
for(i=0;i<50;i++)
delay();


void init_cgram()

unsigned char i;
//;设置自定义字符
WR_COM=0x40;
for(i=0;i<24;i++)

WR_DAT=CGRAM_TABLE[i];

for(i=0;i<40;i++)
delay();


void PutChar(char t)

WR_DAT=t;
delay();
delay();

void clr_lcd()

WR_COM=0x01;
delay();
delay();

void lcdprintf(char x,char y,char *s)

//clr_lcd();
if(y>1)y=1;
WR_COM=(y*0x40+x)|0x80;
delay();
delay();
while(*s!=0)

WR_DAT=*s;
s++;
delay();
delay();


main()
unsigned int period,k,i=0;
float f,m;
char buff[30];
init_LCD();
P2=0x00;
while(1)

TMOD=0X09;
TH0=0;
TL0=0;
while(p32==1);
TR0=1;
while(p32==0);
while(p32==1);
TR0=0;
period=TH0*256+TL0;
while(period<=500) /*判断是否分频及计算分频次数*/
P2++;
i++;
period=period*10;
if(i==6)
P2=0x00;
break;


k=pow(10,i); /* 10的i次方*/
f=((1000000.0/(2*period))*k)*10;
if(f<1000)
sprintf(buff,"f=%5.2fHZ",f);
else
m=f/1000.0;
sprintf(buff,"f=%5.2fKHZ",m);

lcdprintf(0,0,buff);


那位大哥有解决办法请不吝赐教,小弟急用如果可行一定追加悬赏

//void init_cgram()
//
// unsigned char i;
// //;设置自定义字符
// WR_COM=0x40;
// for(i=0;i<24;i++)
//
// WR_DAT=CGRAM_TABLE[i];
//
// for(i=0;i<40;i++)
// delay();
//

//void clr_lcd()
//
// WR_COM=0x01;
// delay();
// delay();
//
这两个函数定义了,主函数中没有调用!,去掉就可以了!

扩展资料:

keil与ARM

Keil公司2005年由ARM公司收购。其两家公司分别更名为ARM Germany GmbH和ARM Inc。Keil公司首席执行官Reinhard Keil表示:“作为ARM Connected Community中的一员,Keil和ARM保持着长期的良好关系。通过这次收购,我们将能更好地向高速发展的32位微控制器市场提供完整的解决方案,同时继续在μVision环境下支持我们的8051和C16x编译器。”

而后ARM Keil推出基于μVision界面,用于调试ARM7,ARM9,Cortex-M内核的MDK-ARM开发工具,用于为控制领域的开发。

参考资料:百度百科-keil



参考技术A

仔细看编译对话框的内容,定义的函数没有被调用。我也遇到过类似的是拼写写错导致报错

1.函数拼写错误,调用时又写成正确的,导致报错定义的函数没有被调用。

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

意思是:定义了一个函数,但是在main等函数中并没调用。查找方法:搜索编译对话框中的SEGMENT提示内容,并参考SYMBOL下提示的比对查找

参考技术B WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
不影响运行啊,只是说你定义的函数没有调用而已
参考技术C //void init_cgram()
//
// unsigned char i;
// //;设置自定义字符
// WR_COM=0x40;
// for(i=0;i<24;i++)
//
// WR_DAT=CGRAM_TABLE[i];
//
// for(i=0;i<40;i++)
// delay();
//

//void clr_lcd()
//
// WR_COM=0x01;
// delay();
// delay();
//
这两个函数定义了,主函数中没有调用!,去掉就可以了!本回答被提问者采纳

以上是关于用keil仿真也进不了main的主要内容,如果未能解决你的问题,请参考以下文章

uVision V5.11.1.0软件仿真进不了main函数,提示*** error 65: access violation at 0x40023800 : no 'read' pe

电脑卡在LOGO界面,进步了系统,也进不了bios解决办法

电脑开机 Boot Guard verified failed,也进不了bios,f12也不成功?

Win10 开机突然蓝屏错误代码0xc0000001安全模式也进不了,不用重装系统怎么修复?(已解决)

STM32的SWD调试进不了main函数

急!centos7启动时找不到文件系统,出现grub rescue,win7也进不了了,请问该怎么