用for写个双重循环的 延时函数
时间: 2023-07-12 22:27:49 浏览: 182
以下是使用双重循环的延时函数实现。注意,这种实现方式可能不是最可靠或最准确的,因为它依赖于处理器速度和负载情况。
```c
void delay_ms(unsigned int ms) {
for (int i = 0; i < ms; i++) {
for (int j = 0; j < 100000; j++) {
// 双重循环,等待耗时
}
}
}
```
使用示例:
```c
delay_ms(1000); // 延时 1 秒
```
请注意,这种实现方式可能会导致 CPU 占用率过高,因为它会一直占用 CPU 直到延时结束。因此,建议使用其他方法来实现延时功能。
相关问题
能用双重for循坏写个us级延时吗
虽然使用SysTick计时器来实现us级延时是比较精确的,但如果你想使用双重for循环来实现us级延时,也是可以的。下面是一个示例代码:
```c
void delay_us(unsigned int us)
{
for (int i = 0; i < us; i++) {
for (int j = 0; j < 12; j++) {
__NOP(); // 空操作指令,不执行任何操作,用于延时
}
}
}
```
这个函数使用了两个for循环来进行延时。内部的for循环执行了12次空操作指令,因为在大多数微控制器中,空操作指令的执行时间为1个时钟周期。由于我们需要延时us级别的时间,因此外部for循环执行us次内部for循环,总共执行的空操作指令次数为`us * 12`次。这种方法的精度不如使用SysTick计时器来进行延时,受到程序运行速度和其他因素的影响,延时时间可能会有一定的误差。
用汇编语言设计一个10ms的精确定时。(用双重循环实现)
好的,我可以为您解答这个问题。
首先,我们需要知道计算机时钟的频率。假设计算机时钟的频率为1GHz,也就是1秒钟有10亿个时钟周期。那么10ms就是1亿个时钟周期。
接下来,我们可以使用双重循环来实现定时器。具体步骤如下:
1.使用汇编语言编写计时函数,该函数接受一个参数,表示需要延时的时间(以毫秒为单位)。
2.计算需要循环的次数,假设每次循环需要1个时钟周期,那么需要循环1亿次。
3.使用两个嵌套的循环来实现计时。外层循环控制需要循环的次数,内层循环每次循环1个时钟周期。
4.在循环结束后,返回函数。
下面是示例代码:
```
delay:
push ebp
mov ebp, esp
mov eax, [ebp+8] ;获取函数参数,即需要延时的时间
mov ebx, 100 ;每毫秒需要循环的次数
mul ebx ;计算需要循环的次数
mov ecx, eax ;保存需要循环的次数
outer_loop:
mov ebx, 10000000 ;每次循环需要10个时钟周期
inner_loop:
dec ebx ;减少计数器
jnz inner_loop ;继续循环,直到计数器为0
dec ecx ;减少计数器
jnz outer_loop ;继续循环,直到计数器为0
pop ebp
ret
```
在上面的代码中,我们使用了mul指令来计算需要循环的次数,使用了内部计数器来控制循环次数。由于每次循环需要10个时钟周期,所以我们使用了一个计数器来控制内层循环的执行次数。
需要注意的是,由于不同的计算机时钟频率可能不同,所以需要根据实际情况来调整循环次数和计数器的值。