arm程序中的软件延时程序的问题!

写arm的流水灯程序,用的软件延时,一直出错(仿真的时候死机)。一直不知道是为什么,后来把延时函数前加了个static声明,就可以了。于是我想是不是延时函数重名的问题,改了一个名字,但没有加上static声明,结果还是不行,于是排除了延时函数重名的可能。想知道为什么加了一个static声明就可以呢?不要对我说static的作用,这个我了解。

静态全局变量有以下特点: 该变量在全局数据区分配内存; 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化); 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的; 静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处: 静态全局变量不能被其它文件所用; 其它文件中可以定义相同名字的变量,不会发生冲突;通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。 但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。 静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。 静态局部变量有以下特点: 该变量在全局数据区分配内存; 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化; 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0; 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-10
******************************************************************************
8M 延时计算公式 = 6.25+(n-1)*0.75 us
7.3728M 延时计算公式 = 6.78+(n-1)*0.81 us 或者 6.51+(n-1)*0.82 us
4M 延时计算公式 = 12.5+(n-1)*1.5 us
3.6864M 延时计算公式 = 13.56+(n-1)*1.63 us
2M 延时计算公式 = 25.00+(n-1)*3.0 us
1M 延时计算公式 = 50.00+(n-1)*6.0 us
*******************************************************************************/
void delay (unsigned int n)
{
unsigned int i;
i = n;
while (i--)
{
;
}
}
/******************************************************************************
8M 延时计算公式 = 6.0+(n-1)*0.75 us
7.3728M 延时计算公式 = 6.51+(n-1)*0.81 us 或者 6.51+(n-1)*0.82 us
4M 延时计算公式 = 12.0+(n-1)*1.5 us
3.6864M 延时计算公式 = 13.02+(n-1)*1.63 us
2M 延时计算公式 = 24.00+(n-1)*3.0 us
1M 延时计算公式 = 48.00+(n-1)*6.0 us
*******************************************************************************/
void delay (unsigned int n)
{
unsigned int i;
for (i=n;i>0;i--)
{
;
}
}
/******************************************************************************
8M 延时计算公式 = 6.13+(n-1)*0.75 us
7.3728M 延时计算公式 = 6.65+(n-1)*0.81 us 或者 6.51+(n-1)*0.82 us
4M 延时计算公式 = 12.25+(n-1)*1.5 us
3.6864M 延时计算公式 = 13.29+(n-1)*1.63 us
2M 延时计算公式 = 24.5+(n-1)*3.0 us
1M 延时计算公式 = 49.0+(n-1)*6.0 us
*******************************************************************************/
void delay (unsigned int n)
{
unsigned int i;
for (i=0;i<n;i++);
}
/******************************************************************************
8M 1.13us
7.3728M 1.22us
4M 2.25us
3.6864M 2.44us
2M 4.5us
1M 9.0us
*******************************************************************************/
void delay_1us (void)
{
NOP();
}
/******************************************************************************
8M 延时计算公式 = 2.88+(n-1)*0.75 us
7.3728M 延时计算公式 = 6.24+(n-1)*0.81 us 或者 6.24+(n-1)*0.82 us
4M 延时计算公式 = 5.75+(n-1)*1.5 us
3.6864M 延时计算公式 = 6.24+(n-1)*1.63 us 或者 6.24+(n-1)*1.62 us
2M 延时计算公式 = 11.5 +(n-1)*3.0 us
1M 延时计算公式 = 23.0+(n-1)*6.0 us
*******************************************************************************/
void delay (unsigned int n)
{
while (n--);
}
/*******************************************************************************
NOP();延时时间,这个就不用多说了吧
8M 0.125us
7.3728M 0.14us 0.27us
4M 0.25us
3.6864M 0.27us
2M 0.5us
1M 1.0us
*******************************************************************************/

arm程序中的软件延时程序的问题!
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。 静态局部变量有以下特点: 该变量在全局数据区分配内存; 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化; 静态局...

arm delay()延时函数问题
请检查下两个程序的运行逻辑问题,是否是加上 delay延时函数后,运行逻辑出现问题,也就是两个程序的运行结果是最后把led关闭了。请仔细检查和做点实验,写点测试程序验证一下。

arm中delay延时函数具体时间怎么计算??
ARM结构理具体计算指令执行时间一般情况下没有意义,除非你关闭预取指缓冲这样指令执行时间可以预测,应该根据flash频率计算,具体怎么计算我不知道,但是如果要得到精确延时在arm结构里是不能用单纯赋变量延时的,利用定时器比较靠谱

学习arm,在keil环境里面编程 延时函数delay(60000),请问60000的单位是...
这个是看你的程序了。。看下那个delay的函数是怎么样的??还有这个还跟你芯片的工作频率有关的。。。想知道延时有多少。。建议用示波器

ucos移植到ARM中,我要延时六分钟怎么表示
这个跟很多因素有关,比如定时器设置多少时间中断一次(就是指TICK),还有ucos里OS_TICKS_PER_SEC设置的是什么。如果实在是不知道直接用OSTimeDly(10);数字可以改。

...定时器每20ms进中断,中断里执行100ms软件延时函数,当100ms延时函数...
首先,你这么做不科学。不应在中断里进行延时。回答你的问题,“定时中断中执行20ms后应该再次进定时中断”,在51中,不是这样的。51内部有记录中断服务级别的标志,每个中断优先级有一个标志,这个标志用户程序是看不到的。进行中断后,对应优先级的中断服务状态标志自动被置位,同级别的中断都不再响应...

请问各位,ucos ii中的软件定时器和延时有什么区别?
4、软件定时器和延时都是基于“系统的节拍”来计时\/定时的,虽然软件定时器是在一个高优先级的任务中管理,这个任务也是由“系统节拍中断“中向其发送信号量,因此还是基于“系统的节拍”。5、没必要去对它们的区别做出一个定义,关键还是去理解它们的应用场合,它们都能解决什么问题。

ARM7内核LPC2138芯片,晶振10M,延时函数为5ms,为什么输出是延时确实35ms...
这个颜色5ms的函数时网上的函数,不一定适合你的CPU操作频率,你要自己修改的;此外延时还要收中断的影响;

for(i=50000;i>0;i--);和for(i=0;i<50000;i++);在单片机延时程序...
i++); 时间短些,不过这种影响是微乎其微的,如果for循环中套用for循环,那么时间准确度就有待验证了,不过话说回来,网上有很多稳定的ms级计数器。另外一种解决途径就是使用中断来实现,比较的精确。提醒的是:不同的单片机跑同一个程序,会有微弱的不同,这个与单片机本身硬件条件有关系。

ARM汇编指令NOP指令问题
3. 从ARMv4架构开始,NOP指令通常被编译器生成为一个无操作的指令,如MOV R0, R0。这样的指令不会对寄存器的值产生任何影响,但会消耗一个指令周期,从而实现延时。4. NOP指令在ARM汇编语言中的使用场景很广泛,尤其是在需要硬件设备响应延时的场合。例如,在向硬件设备发送信号并等待其响应之后,可能...

相似回答
大家正在搜