我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论。
(1)全局变量:如果程序中定义了全局变量,而且初始值不是0。此时,在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到内存的指定区域(编译过程中为全局变量分配的空间)。
(2)局部变量:局部变量通常使用那些缓冲内存(用作保存运算过程的中间数据)。初始化的局部变量,通常程序中都会对用到的缓冲内存重新赋值。
但是,对于没有初始化的局部变量需要注意“无知情的情况下被赋了值”。下边的子函数中定义了变量,但是并未初始化。按照标准C语言的准则,未初始化的变量的初值默认是0,但是KEIL对未初始化的局部变量的处理不是这样的。
void function()
{
unsigned char k,j;
if(k else{
}
}
实际的编译后的反汇编程序看不到对这些局部变量的初始化。这些局部变量可能会占据那些还未被使用的内存或者其他子函数中局部变量已经释放的空间(但是这些空间可能并没有清零)。倘若是后者,其他函数局部变量释放的空间由于并没有清零,所以这些局部变量就一开始被赋了不能预先知道的值,这是不希望看到的。所以如果使用一个局部变量,就给这个变量赋个初值。
(3)谨防程序在“无知情的情况下被优化”。如下函数的内容经过keil的编译后,就变成了“REI”。也就是说function的内容全被忽略掉。解释:keil对程序进行了优化,由于function的内容并没有任何作用,所以优化时就把这些内容忽略掉。倘若在变量前边加上volatile”,这部分内容就不会被忽略。
void function()
{
unsigned char i,j,k;
i=j+k;
}
总结如收功 练功不收功 到老一场空
关键字:Keil c语言 编译器
引用地址:
Keil的c语言编译器
推荐阅读最新更新时间:2024-03-16 15:30
单片机C语言编程应注意的若干问题
作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对用编程者来说具有十分重要的意义。 1 单片机C语言主要特点 用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的
[单片机]
AVR单片机的C语言开发简介
Avr单片机和其他单片机一样,有自己的指令和寄存器,特定的IO口操作方法,有定时器,AD转换,串行口,PWM输出,EEPROM等。为了缩短大家学习的时间,快速的了解avr编程思路,拟定avr程序设计系列教程。我使用avr也不是很长时间,技术有限,错误再所难免,还请指出,以期改正。 【说明】:本页是针对从来没有碰过单片机或者用过单片机而没有用c语言的朋友,如果你已经用过其他单片机,此页说明可能对你没有很大帮助,且显得有些幼稚,请你跳过。 本站所有程序都是在icc+avrstudio下进行的,如果你没有配置好环境 采用icc的原因之一是它自带一个非常好用的application builder,生成的代码结构清晰,层次清楚,特别
[单片机]
keil工程选项设置
首先点击左边 Project 窗口的 Target 1,然后使用菜单“Project- Option for target ‘target1’”即出现对工程设置的对话框,这个对话框可谓非常复杂,共有 8 个页面,要全部搞清可不容易,好在绝大部份设置项取默认值就行了。 1、target选项 图5 设置对话框中的 Target 页面,如图 5 所示,Xtal 后面的数值是晶振频率值,默认值是所选目标 CPU 的最高可 用 频 率 值 , 对 于 我 们 所 选 的AT89C51 而言是 24M,该数值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你
[单片机]
N76E003 工程创建教程
一、准备工作: 1、下载编译工具keil c51 2、下载N76E003提供的 板级支持包(BSP),可到 nuvoton上下载 二、开发环境搭建 1、安装keil c51,然后和谐。。。不能随便发链接所以软件需要自己网上找一下,很多。 2、安装N76E003 keil支持包Nuvoton_8051_Keil_uVision_Driver_v2.00.6561.exe(在N76E003提供的 板级支持包(BSP)中),这样可以在keil 的device中找到N76E003 3、安装nu-link驱动 NuMicro NuLink Command Tool 2.00.6561.exe(在N76E003提供的 板级支持包(BSP)
[单片机]
单片机c语言程序(按键和消抖)
#include reg52.h #define uint unsigned int #define uchar unsigned char sbit d1=P1^0; sbit dula=P2^6; sbit wela=P2^7; sbit Key1=P3^4; uchar code table ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e,0x79,0x71 }; uchar num; void delay(uint
[单片机]
STM32CubeMX(Keil5)开发之路——8Flash读写
运行环境 Windows10 STM32CubeMX___Version 5.0.0 Keil5(MDK5)___Version 5.15 简介 本例程主要讲解如何对芯片内的Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是STM32F103ZET6,512K大小的Flash。 STM32CubeMx基本配置 基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目 printf重定向例程请参考 STM32CubeMx(Keil5)开发之路——3发送USART数据和printf重定向 代码修改 1——选择main.c文件 2——添加全局
[单片机]
msp430的一些常用的C语言控制程序---RS232
//需要调试助手辅助才能观察到收或接的数据 #include msp430x14x.h // void OSC_Init(void); void USATR0_Init(void); // void main(){ WDTCTL = WDTPW + WDTHOLD; OSC_Init(); USATR0_Init(); _BIS_SR(GIE);//用调试助手可以检测,也可以结合按键观察到数据的传输 } // void OSC_Init(void){ BSCTL1 &= ~XT2OFF;//XT2振荡器开启 do //清OSCFault标志 { IFG1 &= ~OFIFG; for
[单片机]
keil c51如何实现2进制操作
#define LongToBin(n) \ ( (n 21)&0x80 \ (n 18)&0x40 \ (n 15)&0x20 \ (n 12)&0x10 \ (n 9)&0x08 \ (n 6)&0x04 \ (n 3)&0x02 \ (n 0)&0x01 \ ) #define Bin(n) (0x##n##L) 1. \的作用是指下行的内容是接着上行未完成的内容 2. ##的作用是连接字符的作用 例如:0x##11110000##L 替代后0x11110000 将8个十进制数转换为十六进制,L表示长整型数32bits 3.uchar a; a=
[单片机]