使用C51进行单片机编程是事半功倍的事,但是很多算法上以及编译上的问题,往往使用ASM代码更为方便又高效。但不知什么原因,Keil在实现C51夹杂ASM代码比SDCC麻烦很多,方法如下:
预处理指令 #pragma asm 开始ASM代码
预处理指令 #pragma endasm 结束ASM代码
如果就这样直接编译的话,会出现以下错误:
error C272: 'asm/endasm' requires src-control to be active
解决方法:在 Files Toolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assemble SRC File 的勾选由灰色变为黑色,即使这两项有效!
这时进行编译没有问题,但是Link时产生了两个警告:
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
解决方法是需要在 Source Group 中添加一个 LIB 文件,根据专案的内容不同有所区别:
C51S.LIB - 没有浮点运算的 Small model
C51C.LIB - 没有浮点运算的 Compact model
C51L.LIB - 没有浮点运算的 Large model
C51FPS.LIB - 带浮点运算的 Small model
C51FPC.LIB - 带浮点运算的 Compact model
C51FPL.LIB - 带浮点运算的 Large model
LIB 方件在 Keil 安装目录下的 \C51\LIB\ 目录中。
关键字:Keil C51函数 ASM代码
引用地址:
在Keil C51函数中加入ASM代码
推荐阅读最新更新时间:2024-03-16 15:04
stm32用keil+stlink不识别问题
刚到手一块stm32f103c8t6的板子,刚好最近在用stm32cube,直接用cube配置了一个led灯闪烁的工程,用keil+stlink下载进去一切正常,用的SWD模式。 然后问题出现了,keil不识别板子了,options- debug里面stlink 的setting界面也找不到目标,SW device是空的。 最开始一度认为可能是硬件错误,排除了接线、驱动错误后(因为第一次下载是成功的),后来发现在按住reset后进去setting是可以识别的,同样按住reset松手一瞬间是可以download程序的,想到可能是程序的问题。 原因:在stm32cube配置工程中,如图sys下的debug选择Serial
[单片机]
STM32 KEIL下的堆栈设置
刚接手STM32时,你只编写一个 int main() { while(1); } BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632 编译后,就会发现这么个程序已用了1600多的RAM,要是在51单片机上,会心疼死了,这1600多的RAM跑哪儿去了,分析map,你会发现是堆和栈占用的 在startup_stm32f10x_md.s文件中,它的前面几行就有以上定义,这下该明白了吧。 Stack_Size EQU 0x00000400 Heap_Size EQU 0x00000200 顺便记号,关注
[单片机]
Keil环境下STM32F4工程创建步骤
Keil环境下STM32F4工程创建步骤 自己也是刚刚开始接触STM32,在开发环境配置和工程创建过程就花费了多半天的时间,写下此文以纪念自己入坑,也希望能帮助其他想要入坑的小伙伴儿顺利入坑,好了话不多说,下面请允许我开始我的表演: 首先咱们需要安装MDK5和STM32F4库安装包,以及固件库压缩包,打开作者百度网盘链接:https://pan.baidu.com/s/1y4IJX6uMieAMyUXNJt0yLg 提取码:nmxi 下载完成后双击图标 点击Next 点击Next 点击Next 填写信息,完成后点击Nex等待安装完成。 安装STM32F4库包 双击图标 路径会自动添加无需手动,点
[单片机]
keil c51 Compiler变量类型的问题,以及c的部分优化
最近和一位8051都老前辈接触51单片机(接触arm之后返璞归真??不过,51是个好东西),我用keil C写了一个test,他用汇编(他的汇编功力的是恐怖),我c生成的hex,经过反汇编之后对比两个程序,发现c生产的hex冗余码不是一般的多。特别是8位以上的乘除法,keil的C compiler直接套用一个固定的汇编子函数,通用,但冗长,效率很低。需要理解内部结构才能写出高效简洁的好程序,现在觉得《10天学会单片机》害人不浅啊。 我得到点点关于c优化提示: 1.数据类型使用一定要准确,要配合muc的特性。 从数据存储类型来说,8051系列有片内、片外程序存储器,分别对应code、data、xdata、idata以及根
[单片机]
keil-protues仿真(简单易用)
记得在上学的时候,在实验室里面经常用keil与protues进行对c51单片机的学习;现在已经告别51将近1年半的时间了,这几天自己在学习ucosII,想把ucos给移植到51单片机中,所以就需要了以前的keil、protues,可是都给忘了。。。那好吧接下来简单的复习一下: 1:从网上下载keil 4 从网上下载protues 2:安装以上2个软件,可能需要破解(这个大家应该都知道) 3:在keil 4中编写一个最简单的led闪烁的程序 #include AT89X51.H void sleep(int num) { while(num) { num--; } } void main()
[单片机]
Keil 5使用JLink连接正在运行的CPU
环境: 目标CPU:STM32F429 连接工具:JLink V9 连接方式:SWO 调试工具:Keil MDK 5.20 使用场景: 目标板正在运行,但是出BUG了,需要调试,而当前又没有在线debug, 于是就需要用调试器在不复位CPU的前提下附着到正在运行的板子上. 使用步骤: 1.首先确认你有与当前CPU运行的程序一样的源码,编译时生成了调试信息(Debug Information). 2.修改debug设置,去掉 Load Appcalition at Startup 的勾选. 3.检查JLink的设置, Connect:Normal 表示正常连接,不复位, Reset:Nor
[单片机]
proteus7.7+Keil2仿真80C51控制流水灯
在今年夏天发布的关于8051的诸多博文中, 我都是用STC89C52RC实验箱来验证8051控制程序的正确性的. 这样做的好处是可以直接和真正的8051单片机打交道, 且能熟练掌握将.hex文件烧写到8051程序存储器的步骤. 但凡事都不是绝对的. 若总是用实物来进行实验, 我们每修改一次控制程序, 就要重新烧写一次.hex文件: 在使用软件烧写的过程中, 有时还会出现各种各样的问题, 这无疑是较低效的. 况且如果实验箱的某个器件出现了故障, 这肯定会影响到实验结果, 继而影响我们对控制程序正确与否的判断. 由于我们大多数人对实验箱内部接线情况并不了解, 若实验箱真的出现故障, 我们也无法将故障原因找出. 除了实验箱本身存在的
[单片机]