KEIL的一些函数】的更多相关文章

函数指针在C语言中应用较为灵活.在单片机系统中,嵌入式操作系统.文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针.Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针对8051系列CPU硬件在标准ANSI C的基础上进行了扩展:但由于编译器及8051体系结构的限制,造成了在使用函数指针时有很多与ANSI C不同的地方.下面举例说明在不同的情形下函数指针的使用.以下代码均在Keil μVision3.v8.08 C51.默认优化等级的开发环境下验证通过. 1.指向…
一 Predefined Functions:http://www.keil.com/support/man/docs/uv4cl/uv4cl_df_predeffunct.htm 主要有三角/反三角函数计算.对/指数运算.在指定地址读和写字节/字/浮点/长整型.随机数.打印输出和输入.延迟和延时函数(信号函数调用) 二 The DEFINE command creates a symbol of a specified type in Toolbox,和执行操作http://www.keil.…
函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递.因为8051只有有限的堆栈空间(128字节或更少的64字节),函数变量必须通过不同的方式进行传递.8051的PL/M-51编译器,介绍在固定的存储空间存储变量的方式.当使用连接器时,程序建立一个调用树,计算出函数变量的互斥空间,然后覆盖它们.这就是连接器的“OVERLAY”指令.因为PL/M-51不…
keil的信号函数用于模拟和测试串行IO,模拟IO,端口通讯等重复发生的外部事件. 信号函数以关键字signal开头.在函数中必须调用twatch用于延时,不然keil会陷入死循环.twatch函数的参数表示要延时的CPU执行周期,比如twatch(1000000)表示一个信号函数延时1000000个CPU周期. 信号函数受到如下约束: 函数的返回值类型必须为void. 函数最多只能有8个参数. 信号函数可以调用其他重定义函数和用户函数. 信号函数之间不能相互调用. 信号函数可以被用户函数调用.…
指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用. keil51的指针,包含两种指针:普通指针,兼容标准C:内存特殊指针 1 普通指针 char * ptr; //指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节 char * xdate ptr; //指针存储在片外,xdate 是修饰ptr的 char * idate ptr; //指针存储在片内,指针指向的数据可以是…
OVERLAY代码重入问题:自己遇到的问题 编写的测试代码如下: #include <stdio.h> #define BYTE unsigned char #define BYTE unsigned char void main(void); void FUN2(void); void fun1(void); void main(void) { fun1(); } void fun1(void) { BYTE TMP1; FUN2(); } void FUN2(void) { BYTE TM…
在网上看到这段代码,所以自己尝试了,可以跑起来,但是没有精确的定时功能,仅仅是任务的调度而已. 数组中是11,而不是12.这里写错了... /* 简单的多任务操作系统 其实只有个任务调度切换,把说它是OS有点牵强,但它对于一些简单的开发应用来说, 简单也许就是最好的.尽情的扩展它吧.别忘了把你的成果分享给大家. 这是一个最简单的OS,一切以运行效率为重,经测试,切换一次任务仅20个机器周期, 也就是在标准51(工作于12M晶振)上20uS. 而为速度作出的牺牲是,为了给每个任务都分配一个私有堆栈…
使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串口并 print 一个数据吧. 新添加的文件需要添加到 Markfile 文件中,否则编译肯定会报错的.同时为了 vscode 不报错也把 include 路径在 c_cpp_properties.json 中放一份. .h 文件路径 -> Makefile + c_cpp_properties.j…
(1)初始值不是0的全局变量 在程序调到main()函数执行前,除了要进行内存清零.初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间). (2)未初始化的局部变量 实际的编译后的反汇编程序也看不到这些局部变量的初始化.这些局部变量占据哪些还未被使用的内存或者其他函数中局部变量释放的空间.倘若是后者,其他函数局部变量释放的空间并没有清零,所以使用这些释放空间的局部变量就一开始被赋值了,这是需要程序员小心的. void function() { unsig…
在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1.如果为1则清0,然后送出一个字符.因此你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1.这时你的程序就相当于直接死掉了.你可以通过改写putchar函数实现自己的目的.TI相当于是初始化~…