C语言中的延迟函数不延迟

C语言中的延迟函数不延迟,c,keil,C,Keil,这是一个非常奇怪的问题,因为它应该能工作,但它不能。 我的任务是做一个简单的函数来延迟程序 所以 在使用函数之后: 我希望有1秒的延迟,所以我增加了100000次迭代(100次之前),但时间没有改变。 为什么??这是合乎逻辑的,如果我增加迭代次数,时间应该更长 编辑: #包括 无效延迟(){ long int i; 对于(i=0;i使用nop()函数将大量的NO-OP指令插入到C代码中。计算出目标上单个nop所需的时间,并根据需要使用尽可能多的指令。来源:keil.com/support/do

这是一个非常奇怪的问题,因为它应该能工作,但它不能。 我的任务是做一个简单的函数来延迟程序

所以

在使用函数之后: 我希望有1秒的延迟,所以我增加了100000次迭代(100次之前),但时间没有改变。

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

编辑:

#包括
无效延迟(){
long int i;
对于(i=0;i使用nop()函数将大量的NO-OP指令插入到C代码中。计算出目标上单个nop所需的时间,并根据需要使用尽可能多的指令。来源:keil.com/support/docs/606.htm

对于此“样本”,请尝试延迟(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;

}
#包括
#包括
#布拉格马O0
无效延迟(易失性uint32\u t cnt){
而(cnt--)
_不;
}
无NOP的无效延迟(挥发性uint32\u t cnt){
而(cnt-);
}
int main(){
//将针脚16 P1设置为输出
IO1DIR=0x10000;
//将针脚16 P1设置在1上
IO1SET=0x10000;
延迟(1000);
延迟使用OTNOP(3000);
//将针脚16端口P1设置为0
IO1CLR=0x10000;
}

请在问题中包含程序的源代码,格式为代码(突出显示并使用“{}”按钮)。文本的图片远没有那么有用。@KeithThompson好的。我很确定你的C编译器会认为这个循环什么都不做,只是向前跳过。要确保循环被执行,请在循环中放入int a=0;之类的内容。这样编译器就不会忽略这个循环。有两种方法可以做到这一点:1.使用nop()函数在C代码中插入大量NO-OP指令。计算目标上单个NOP所需的时间,并根据需要使用尽可能多的时间。2.创建一个函数,该函数启动计时器,在溢出时生成中断。该中断设置一个标志,函数在启动计时器后等待该标志。当该标志为设置后,函数停止计时器并返回。源代码:可以用一种更简单的方法完成吗?在我的家庭作业中的指令中,我必须使用for循环,所以;对于我的类级别编程来说太高级了。我通过一个简单的操作添加了一个函数DelayWithotNop,在这种情况下,您必须使用正确的值对其进行测试,以达到当前硬件中1秒的延迟
#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;

}