【问题标题】:Delay function in C not delayingC中的延迟函数不延迟
【发布时间】:2019-02-28 19:41:29
【问题描述】:

这是一个非常奇怪的问题,因为它应该可以工作,但它没有。 我的任务是做一个延迟程序的简单功能。

所以time before use a function

使用函数后: time after using 我想要有 1 秒的延迟,所以我增加了 100000(100 之前)的迭代次数,但时间没有改变。 after increasing iteration

为什么?合乎逻辑的是,如果我增加迭代次数,时间应该更长......

编辑:

#include <LPC21xx.H>

void Delay(){
    long int i;
    for(i=0; i<48000000000;i++){
    }
}

int main(){
    //set pin 16 P1 as out
    IO1DIR = 0x10000;
    //set pin 16  P1 on 1
    IO1SET = 0x10000;
    Delay();
    //set pin 16 port P1 on 0
    IO1CLR = 0x10000;

}

我使用的是 uVision Keil。

【问题讨论】:

  • 请在您的问题中包含程序的源代码,格式为代码(突出显示并使用“{}”按钮)。文字图片的用处要小得多。
  • @KeithThompson 好的。
  • 我很确定你的 C 编译器会认为这个循环什么都不做,只是向前跳过。为了确保执行循环,请输入类似 int a=0; 的内容。循环内。这样编译器就不会忽略循环。
  • 这里有 2 种方法可以做到这一点: 1. 使用 nop () 函数将一些 NO-OP 指令插入到 C 代码中。计算出目标上单个 NOP 所需的时间,并尽可能多地使用。 2. 创建一个启动定时器的函数,该定时器在溢出时产生中断。中断设置一个标志,函数在启动定时器后等待。当标志被设置时,函数停止计时器并返回。来源:keil.com/support/docs/606.htm 代码:stackoverflow.com/questions/21553964/…

标签: c keil


【解决方案1】:

使用 nop () 函数将许多 NO-OP 指令插入到您的 C 代码中。计算出目标上单个 NOP 所需的时间,并尽可能多地使用。来源:keil.com/support/docs/606.htm

对于这个“示例”,您可以尝试使用 Delay(1000) 来更改此值;

#include <LPC21xx.H>
#include <intrins.h>

#pragma O0
void Delay(volatile uint32_t cnt) {
    while(cnt--)
        _nop_();
}

void DelayWithoutNop(volatile uint32_t cnt) {
    while(cnt--);
}


int main(){
    //set pin 16 P1 as out
    IO1DIR = 0x10000;
    //set pin 16  P1 on 1
    IO1SET = 0x10000;
    Delay(1000);
    DelayWithotNop(3000);
    //set pin 16 port P1 on 0
    IO1CLR = 0x10000;

}

【讨论】:

  • 可以用更简单的方法吗?在我的家庭作业中,我必须使用 for 循环,所以 _nop_();对于我的班级编程水平来说太高级了。
  • 我通过简单的操作添加了一个函数DelayWithotNop,在这种情况下,您必须根据您当前的硬件使用正确的值来测试它以达到1秒的延迟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2016-03-22
相关资源
最近更新 更多