keil下载hex文件同个project下面不同的文件参数怎么共用

查看: 14113|回复: 32
windows10 64位 keil4和5 都是一点project就停止工作 求解
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
&点建工程就出这个&&&
windows10&64位&&谁遇到过&自己试&应该不是j-link驱动的问题
&&j-linK驱动从4.60换到4.92也不行&
修改环境变量 &tmp也不行
438f0df3c7f74ce57dea_561.png (0 Bytes, 下载次数: 98)
22:54 上传
34718bda44b40d58408edaf78b6c34cb_285.png (0 Bytes, 下载次数: 90)
22:54 上传
bdfc420e6b1dca3fd03a4_275.png (0 Bytes, 下载次数: 78)
22:54 上传
没有找到问题原因 但是
我换了台没装过keil软件的电脑
先装一个低版本的KEIL4
再装一个KEIL5
就没出现过这个问题了
有问题的可以尝试一下
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
没有找到问题原因 但是&&我换了台没装过keil软件的电脑& &先装一个低版本的KEIL4&&再装一个KEIL5&&就没出现过这个问题了&&有问题的可以尝试一下& &
主题帖子精华
在线时间1058 小时
这个应该是jlink被查出是盗版的了
开往春天的手扶拖拉机
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
回复【2楼】zuozhongkai:
---------------------------------
但是如果不去点击那个按钮&&别的功能都好使
主题帖子精华
在线时间767 小时
遇到过&&重装搞定了
道不同,不相与为谋
主题帖子精华
高级会员, 积分 664, 距离下一级还需 336 积分
在线时间60 小时
把驱动降低看看&我用4.2的驱动没问题&试过4.6版本的就是用不了
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
回复【5楼】liu1028tao:
---------------------------------
你4.2的j-link驱动也能点击&&新建工程?
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
回复【4楼】jermy_z:
---------------------------------
重装不低于10次&&每次想到可能出现的问题都会重装一下
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
回复【5楼】liu1028tao:
---------------------------------
试了一下V4.26和v4.10都出现一样的状态&&请问您的是什么系统&&windows10?&&x86&&x64?&&kei&5?
主题帖子精华
高级会员, 积分 664, 距离下一级还需 336 积分
在线时间60 小时
回复【8楼】xiaoyehack:
---------------------------------
win10&64bit&&&MDK5.16
主题帖子精华
初级会员, 积分 93, 距离下一级还需 107 积分
在线时间12 小时
2afad827f4c601a1ee65f8fe_761.jpg (0 Bytes, 下载次数: 92)
22:54 上传
我也是刚升了WIN10,安装MDK5.10结果连CPU都选不了。pack instller刷新了都不能操作。MDK和Pack都是显示的32位。
(307.48 KB, 下载次数: 100)
23:09 上传
主题帖子精华
新手上路, 积分 9, 距离下一级还需 41 积分
在线时间2 小时
同样遇到这个问题,升win10很久了,一直没问题,1月8号的时候还新建了工程,1月9号就出现了这个问题。这中间没装过什么软件。求问楼主找到解决办法没?
主题帖子精华
初级会员, 积分 142, 距离下一级还需 58 积分
在线时间4 小时
我的是win10的,不过我的keil(版本5.10)一直用的很好啊。安装的时候尽量用管理员身份安装,不要有中文路径,路径不要太深,运行时也尽量用管理员身份
主题帖子精华
中级会员, 积分 271, 距离下一级还需 229 积分
在线时间81 小时
是不是发现了JLink是盗版,我前天才弄好 我用的是Win7 64
主题帖子精华
新手上路, 积分 9, 距离下一级还需 41 积分
在线时间2 小时
不知道原因,发现全数字或者含中文目录下的工程会这样,全英文路径没有。
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
我也碰到了相同的问题,Win10 X64安装Keil V5.x版本(5.1~5.2都试过)。
电机设计与控制
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
我也碰到了相同的问题,Win10 X64安装Keil V5.x版本(5.1~5.2都试过)。
试试我二楼回复的方法!
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
是不是发现了JLink是盗版,我前天才弄好 我用的是Win7 64
不是&&很确定
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
同样遇到这个问题,升win10很久了,一直没问题,1月8号的时候还新建了工程,1月9号就出现了这个问题。这中 ...
试试我二楼回复的方法!
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
本帖最后由 学海无涯不回头 于
18:08 编辑
试试我二楼回复的方法!
是安装覆盖相同目录吗?我的电脑覆盖安装和独立安装都试过,不管用。用keil4是正常的,但keil5点project菜单就自动退出。 keil 5的项目能不能转换成keil 4?
电机设计与控制
主题帖子精华
中级会员, 积分 423, 距离下一级还需 77 积分
在线时间110 小时
回复【4楼】jermy_z:
---------------------------------
重装不低于10次&&每次想到可能出现的问 ...
遇到同样问题
主题帖子精华
中级会员, 积分 381, 距离下一级还需 119 积分
在线时间61 小时
同样遇到这个问题,升win10很久了,一直没问题,1月8号的时候还新建了工程,1月9号就出现了这个问题。这中 ...
今天电脑遇到这个问题一样一样的,请问楼主如何解决的
主题帖子精华
新手上路, 积分 7, 距离下一级还需 43 积分
在线时间0 小时
我也遇到了,你怎么解决的?
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
我也遇到了,你怎么解决的?
试试我二楼回复的方法!
主题帖子精华
新手上路, 积分 9, 距离下一级还需 41 积分
在线时间1 小时
我也遇到同样的问题,之前我装了VISUAL STUDIO 2015 乱改了我很多东西,但系统没有崩溃。
主题帖子精华
新手上路, 积分 10, 距离下一级还需 40 积分
在线时间0 小时
试试我二楼回复的方法!
测了有效 真心谢谢了
主题帖子精华
新手上路, 积分 20, 距离下一级还需 30 积分
在线时间4 小时
我现在还在用xp
主题帖子精华
新手上路, 积分 29, 距离下一级还需 21 积分
在线时间4 小时
楼主问题解决了吗?我也遇到这样的问题,好像是KEIL5非正常关闭导致的。
进注册表“HKEY_CURRENT_USER——SOFTWARE——Keil——礦ision5——Recent Projects”里面,保留一个默认的(我是保留了,估计删掉也可以),其余全部删掉,我的是这样就解决了,希望可以帮到你。如果真有效,多多接力帮助更多人
主题帖子精华
新手上路, 积分 29, 距离下一级还需 21 积分
在线时间4 小时
刚好我是今天碰到这个问题,也是上来找答案找了好久没解决,后来突来灵感既然是其他功能正常操作工程就不正常,何不进注册表找到对应项干掉试试呢,没想到真的成功了
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
今天电脑遇到这个问题一样一样的,请问楼主如何解决的
二楼的方法
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
**** 作者被禁止或删除 内容自动屏蔽 ****
有点忘了&&你试试
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
楼主问题解决了吗?我也遇到这样的问题,好像是KEIL5非正常关闭导致的。
进注册表“HKEY_CURRENT_USER—— ...
嗯 现在没有遇到了 2楼方法解决的 好久没遇到了!!下次遇到试试你的
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间22 小时
刚好我是今天碰到这个问题,也是上来找答案找了好久没解决,后来突来灵感既然是其他功能正常操作工程就不正 ...
怎么判断是注册表的那项 求解
Powered by&&|&& &&|&& &&|&&
KEIL C 使用总结大全!
18:37:08 && 阅读:6112&&
KEIL C 使用总结大全!
1、在Windows2000下面,我们可以把字体设置为Courier,这样就可以显示正常。
2、当使用有片外内存的MCU(如W77E58,它有1K片外内存)的时候,肯定要设置标志位,并且编译方式要选择大模式,否则会出错。
3、当使用Keil C跟踪程序运行状态的时候,要把引起Warning的语句屏蔽,否则有可能跟踪语句的时候会出错。
4、在调用数组的时候,Keil C是首先把数组Load进内存。如果要在C中使用长数组的时候,我们可以使用code关键字,这样就实现了汇编的DB的功能,Keil C是不会把标志code的数组Load入内存的,它会直接读取Rom。
5、拉高管脚的执行速度远远比检查管脚电平的要快。当编程涉及到有关通信,时序是很重要的。
6、在等待管脚电平变化的时候,我们需要设置好超时处理,否则程序就会因为一个没有预计的错误而死锁。
7、能用C语言实现的地方,尽量不要用汇编,尤其在算法的实现,用汇编是晦涩难懂。
8、程序的几个参数数组所占篇幅很大,其中液晶背景数组最长,有四千个Byte,因而把那些初始化数组都放在另外一个C文件,在主文件使用使用关键字extern定义,这样就不会对主文件的编写造成干扰。
9、所有函数之间的相关性越低越有利于以后功能的扩展。
10、6.20版在编译带code关键字的数组时,编译通过但是单片机运行结果是错误的,改用6.14版后正常。
------------------------------------------------------------------------------------------------------------------------------------------------------
问:C51 怎样将1个子程序段定位在1个固定的地址位置?&&&&&
以下2问题均要用C51解决
1。 怎样将1个子程序段定位在1个固定的地址位置?
&&& 例如将 INT BCD2HEX(INT XX)定位在1000H
2。 HOW在EEPROM 中固定的位置存放1字符串?
&&& 如在200H处放&COPYRIGHT 2001-11&
答: 函数定位与变量定位...
1、函数定位:
假如要把C源文件 tools.c 中的函数
int BIN2HEX(int xx)
放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在
* * *&& C O D E&& M E M O R Y&& * * *
行下找出要定位的函数的名称,应该形如:
CODE&&& xxxxH&&&& xxxxH&&&& UNIT&&&&&&&& ?PR?_BCD2HEX?TOOLS
Project-&Options for Target ...-&BL51 Locate:Code
中填写如下内容:
?PR?_BCD2HEX?TOOLS(0x1000)
再次Build,在M51中会发现该函数已放在CODE MEMORY的0x1000处了
2、赋初值的变量定位:
要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,则如下操作:
在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变
char code myVer = {&COPYRIGHT 2001-11&};
然后将该文件加入工程,编译,打开M51文件,若定义的是code型,则在
* * *&& C O D E&& M E M O R Y&& * * *
下可找到:
CODE&&& xxxxH&&&& xxxxH&&&& UNIT&&&&&&&& ?CO?INITVARS
Project-&Options for Target ...-&BL51 Locate:Code
?CO?INITVARS(0x200)
再次编译即可。
相应地,如为xdata变量,则InitVars.c中写:
char xdata myVer = {&COPYRIGHT 2001-11&};
然后将该文件加入工程,编译,打开M51文件,在
* * *& X D A T A&& M E M O R Y& * * *
下可找到:
XDATA&& xxxxH&&&& xxxxH&&&& UNIT&&&&&&&& ?XD?INITVARS
Project-&Options for Target ...-&BL51 Locate:Xdata
?XD?INITVARS(0x200)
再次编译即可。相应地,若定义的是data/idata等变量,则相应处理即可。
3、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序排列。
------------------------------------------------------------------------------------------------------------------------------------------------------
C51的一些误区和注意事项
1)C忌讳绝对定位。 常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如后,x的地址就是&x, 你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。
2)设置SP的问题。 原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,所以初学者是不必 要去理会的。这体现C的优越性,很多事情C编译时候做了。
3)用C的主程序结构: #i nclude &reg52.h& void main(void) { while(1); } 这是个最小的成功的C程序,包括头部文件和程序主体。 头部文件的名词解释:引用的外部资源文件,这个文件包括了硬件信息和外部模块提供的可使用的函数和变量的说明。可以用文本方 式打开reg52.h,仔细研究下,会有一些写程序的体会。
4)这样构成一个C项目 在C中,常用项目来管理。项目一般分为两大块:C文件块和头部文件块。 我们常把不同功能写在不同的C文件中,依靠项目的管理,最后把所有文件连接起来,这样就可以得到可以烧录的HEX文件或BIN文件。 这些C文件中,有且只有唯一一个包括main()函数,和3)中一样的C文件。 用头部文件把各个不同的C互相连接起来。一个C文件基本上要对应有一个H头部文件,这个H文件就包含本C文件中可以提供给外面使 用的变量和函数,没有在H文件中列出的文件,可以算是该C文件的内部函数和变量,外部C不能使用。 例子:a.C: unsigned char mW void Test1(void) { mW } void Test2(void) { } a.h文件中: ex extern void Test1(void); 这样主程序M.c中: #i nclude &reg52.h& /*C编译器内部自带的H文件,使用&&*/ #i nclude &a.h& /*自定义的H文件,一般用&&*/ void main(void) { Test1(); /*使用a.c模块文件中的函数*/ while(1){ /*使用a.c模块文件中的变量*/ } }
5)51家族 核心都是基于8031的,有很多在此核心上进行扩展,有的把程序存储器放在内部:89c(S)51..,有的增加了RAM:89c(S)52..,有的增加 了一些专用硬件80C552...,有的改变时钟时序W77E58...。市面上现在常用的主要有ATMEL公司的AT89X系列,PHILIPS的P87(89)x,台 湾WINBOND的w77(78)x系列,Cygnal的C8051Fx系列。
6)51单片机结构的C描述 这里不讲51的具体结构,只是引导初学者快速理解51单片机的物理结构。寄存器和IO及其它硬件设备的地址名称,在相应的C头部文件 中可以找到。51为reg51.h,52为reg52.h,以次类推,比如winbond的78E58就为w78e58.h这些H文件中的描述: srf,定义一个8位的设备。 srf16,定义一个16位的设备。 sbit,定义一个位的设备。 用这些语句定义后,就可以在C中象汇编一样使用这些硬件设备,这是单片机应用比标准C特殊的地方,其它差别很少。
7)在51系列中data,idata,xdata,pdata的区别 data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好) xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
8)startup.a51的作用 和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx=&100&;,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。 有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。
关于在 KEIL C51 中嵌入汇编以及C51与A51间的相互调用
&& 如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 [ycong_kuang]
有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者
通过一个简单例子对这个过程进行描述,希望能对初学者有所帮助。几年来,在这个论坛里笔者得到很多热心人指导,因此也希望
藉此尽一点绵薄之力。
在这个例子里,阐述了编写c51程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是
一个整型变量。例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所
要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。
step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。
相关文件如下:
//main.c文件
#include & reg51.h &
#define uchar unsigned char
#define uint unsigned int
extern uint AFUNC(uchar v_achr,bit v_bflag);
void main()
&&& bit BFLAG;
&&& uchar mav_
&&& uint&&&
&&& mav_chr=0xd4; BFLAG=&1&;
&&& mvintrslt=&AFUNC&(mav_chr,BFLAG);
//CFUNC.c文件
#define uchar unsigned char
#define uint unsigned int
uint AFUNC(uchar v_achr,bit v_bflag)
&&& uchar tmp_
&&& uint& tp_
&&& tmp_vchr=v_
&&& tp_vint=(uint)v_
&&& return tmp_vchr+(tp_vint&&8);
step2. 在 Project 窗口中包含汇编代码的 C 文件上右键,选择&Options for ...&,点击右边的&Generate Assembler SRC
&&&&&&& File&和&Assemble SRC File&,使检查框由灰色变成黑色(有效)状态;
step3. 根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工
&&&&&& 程的最后文件;
step4. build这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51文
&&&&&& 件),然后在工程里去掉库文件(如C51S.Lib)和CFUNC.c,而将CFUNC.A51添加到工程里。
//CFUNC.SRC文件如下
.\CFUNC.SRC generated from: CFUNC.c
NAME CFUNC
?PR?_AFUNC?CFUNC&&&& SEGMENT CODE
?BI?_AFUNC?CFUNC&&&& SEGMENT BIT OVERLAYABLE
&&& PUBLIC&&& ?_AFUNC?BIT
&&& PUBLIC&&& _AFUNC
&&& RSEG& ?BI?_AFUNC?CFUNC
?_AFUNC?BIT:
&&& v_bflag?041:&& DBIT&& 1
; #define uchar unsigned char
; #define uint unsigned int
; uint AFUNC(uchar v_achr,bit v_bflag)
&&& RSEG& ?PR?_AFUNC?CFUNC
&&& USING&&& 0
&&&&&&&&&&& ; SOURCE LINE # 5
;---- Variable 'v_achr?040' assigned to Register 'R7' ----
&&&&&&&&&&& ; SOURCE LINE # 6
;&&&& uchar tmp_
;&&&& uint&&& tp_
;&&&& tmp_vchr=v_
&&&&&&&&&&& ; SOURCE LINE # 10
;---- Variable 'tmp_vchr?042' assigned to Register 'R5' ----
&&& MOV&&&&& R5,AR7
;&&&& tp_vint=(uint)v_
&&&&&&&&&&& ; SOURCE LINE # 11
&&& MOV&&&&& C,v_bflag?041
&&& CLR&&&&& A
&&& RLC&&&&& A
;---- Variable 'tp_vint?043' assigned to Register 'R6/R7' ----
;&&&& return tmp_vchr+(tp_vint&&8);
&&&&&&&&&&& ; SOURCE LINE # 12
&&& MOV&&&&& R6,A
&&& MOV&&&&& R4,#00H
&&& CLR&&&&& A
&&& ADD&&&&& A,R5
&&& MOV&&&&& R7,A
&&& MOV&&&&& A,R4
&&& ADDC&&&& A,R6
&&& MOV&&&&& R6,A
&&&&&&&&&&& ; SOURCE LINE # 13
; END OF _AFUNC
step5. 检查main.c的&Generate Assembler SRC File&和&Assemble SRC File&是否有效,若是有效则点击使检查框变成无效状
&&&&&& 态;再次build这个工程,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了。
参考文献:
& 1.徐爱钧,彭秀华。单片机高级语言C51windows环境编程与应用,电子工业出版社
& 2.,& C51编程:关于在 KEIL C51 中直接嵌入汇编。。。帖子编号: 83838 发表用户:Youth
------------------------------------------------------------------------------------------------------------------------------------------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& keil中汇编函数调用c51函数 [ycong_kuang]
在keil的写法可参考89852帖子,具体如下:
与89852帖子相比,第一步在工程里多了一个被汇编调用的c51的函数文件(c51func.c),至于汇编函数还是先用c51编写出主体
(a51func.c),这样汇编程序接口和段都交给编译器处理,你只管在编译成汇编代码后按你的要求改写汇编代码就行了。
例程如下:
#include & reg51.h &
#define uchar unsigned char
#define uint unsigned int
extern uint AFUNC(uchar v_achr,bit v_bflag);
void main()
&&& bit BFLAG;
&&& uchar mav_
&&& uint&&&
&&& mav_chr=0xd4; BFLAG=&1&;
&&& mvintrslt=&AFUNC&(mav_chr,BFLAG);
//a51FUNC.c
#define uchar unsigned char
#define uint unsigned int
extern uint CFUNC(uint);
uint AFUNC(uchar v_achr,bit v_bflag)&&& //c51写的汇编函数,最终要变成汇编代码
&&& uchar tmp_
&&& uint& tp_
&&& tmp_vchr=v_
&&& tp_vint=(uint)v_
&&& return CFUNC(tp_vint);&&&&&&&&&&&& //这里调用一个c51函数
//c51FUNC.c
#define uchar unsigned char
#define uint unsigned int
uint CFUNC(uint v_int)&&&&&&&&&&&&&&& //被汇编函数调用c51函数
&&& return v_int&&2;
第二步是按89852帖子的step2,3,4把用c51写的(汇编)函数变成a51文件(今天我试了一下step3可以不要)例程编译结果如
; .\a51func.SRC generated from: a51func.c
NAME&&& A51FUNC
?PR?_AFUNC?A51FUNC&& SEGMENT CODE
?DT?_AFUNC?A51FUNC&& SEGMENT DATA OVERLAYABLE
?BI?_AFUNC?A51FUNC&& SEGMENT BIT OVERLAYABLE
&&& EXTRN&&& CODE (_CFUNC)
&&& PUBLIC&&& ?_AFUNC?BIT
&&& PUBLIC&&& _AFUNC
&&& RSEG& ?DT?_AFUNC?A51FUNC
?_AFUNC?BYTE:
&& tmp_vchr?042:&& DS&& 1
&&& RSEG& ?BI?_AFUNC?A51FUNC
?_AFUNC?BIT:
&&& v_bflag?041:&& DBIT&& 1
; //a51FUNC.c
; #define uchar unsigned char
; #define uint unsigned int
; extern uint CFUNC(uint);
; uint AFUNC(uchar v_achr,bit v_bflag)
&&& RSEG& ?PR?_AFUNC?A51FUNC
_AFUNC:&&&&&&& ;c51所写的函数产生的汇编代码从这里开始
&&& USING&&& 0
&&&&&&&&&&& ; SOURCE LINE # 8
;---- Variable 'v_achr?040' assigned to Register 'R7' ----
&&&&&&&&&&& ; SOURCE LINE # 9
;&&&& uchar tmp_
;&&&& uint& tp_
;&&&& tmp_vchr=v_
&&&&&&&&&&& ; SOURCE LINE # 13
&&& MOV&&&&& tmp_vchr?042,R7
;&&&& tp_vint=(uint)v_
&&&&&&&&&&& ; SOURCE LINE # 14
&&& MOV&&&&& C,v_bflag?041
&&& CLR&&&&& A
&&& MOV&&&&& R6,A
&&& RLC&&&&& A
&&& MOV&&&&& R7,A
;---- Variable 'tp_vint?043' assigned to Register 'R6/R7' ----
;&&&&& 这里说明R6,R7内容就是tp_vint
;&&&& return CFUNC(tp_vint);
&&&&&&&&&&& ; SOURCE LINE # 16
&&& LCALL&&& _CFUNC&&& ;这里调用了用c51写的函数
&&&&&&&&&&& ; SOURCE LINE # 17
; END OF _AFUNC
这个文件就是你的汇编函数所在文件,把函数里面的汇编代码修改成你所需的汇编函数就ok了。
建议参考 徐爱钧,彭秀华所写的《单片机高级语言C51windows环境编程与应用》或马忠梅所写的
《单片机的c语言应用程序设计》有关混合语言编程有关章节
------------------------------------------------------------------------------------------------------------------------------------------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 关于在 KEIL C51 中直接嵌入汇编。。。 [Youth]
有时在C51程序中需要嵌入一些汇编代码,这时当然可以用通常的作法:
按照 C51 与汇编的接口写一个汇编函数,然后在 C51 程序中调用该函数。(此种方法可在论坛里搜索,以前有很多帖子讲到,不再
下面介绍直接嵌入汇编代码的方法:
1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM
&; Assembler Code Here
#pragma ENDASM
2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择&Options for ...&,点击右边的&Generate Assembler SRC File&
和&Assemble SRC File&,使检查框由灰色变成黑色(有效)状态;
3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最
4、编译,即可生成目标代码。
&C51中变量的空间分配几个方法
在C51中变量的空间分配几个方法
liy-tj 发表于
1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。
2、 data区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
3、 确保你的程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。
4、 程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是: bdata bit LedS但位类型不能用在数组和结构体中。
5、 其他不频繁用到和对运算速度要求不高的变量都放到xdata区。
6、 如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。
7、 当使用到指针时,要指定指针指向的内存类型。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data *。其含义是指针p指向data区变量,而其本身存放在xdata区。
后参与讨论
阅读:2475
阅读:2522
阅读:4441
阅读:4535

我要回帖

更多关于 keil project窗口移动 的文章

 

随机推荐