硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4384|回复: 6
收起左侧

[FreeRTOS] osDelay这个函数的位置会影响程序执行吗

[复制链接]

27

主题

70

回帖

151

积分

初级会员

积分
151
发表于 2018-10-26 16:05:21 | 显示全部楼层 |阅读模式
本帖最后由 ^张浩然 于 2018-10-26 16:09 编辑

这样LED3灯就会闪烁
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
                osDelay(1000);
  HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
    osDelay(1000);
                HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
               
  }
  /* USER CODE END StartTask02 */
}
这样LED3就不会闪烁
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
               
  HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
    osDelay(1000);
                HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
  }
  /* USER CODE END StartTask02 */
}
什么原因呢,我打断点发现LED3不闪烁的情况下osDelay上面的语句是没有执行的,帮忙解释下,谢谢

回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2018-10-26 16:15:38 | 显示全部楼层
当然不一样了,你看你第二个,写了一次SET,然后立即回到for开头写了一次RESET,这么短的间隔,LED当然反应不过来。
回复

使用道具 举报

27

主题

70

回帖

151

积分

初级会员

积分
151
 楼主| 发表于 2018-10-29 10:07:35 | 显示全部楼层
ghslfgkkl88 发表于 2018-10-26 16:15
当然不一样了,你看你第二个,写了一次SET,然后立即回到for开头写了一次RESET,这么短的间隔,LED当然反应 ...

HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
    osDelay(1000);
                HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
这个应该能够正常闪烁有,执行完RESET延时了1000然后执行SET,执行完SET到RESET这个过程来不及反应,现在是这个状态下,灯就不动
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2018-10-29 10:15:28 | 显示全部楼层
“执行完SET到RESET这个过程来不及反应”
你跟我说说,为啥来不及反应?就两个函数调用,调用了HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);,然后立即回到for(;;)开头调用HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);,以MCU的速度,这可以说是几乎没有延时
回复

使用道具 举报

27

主题

70

回帖

151

积分

初级会员

积分
151
 楼主| 发表于 2018-10-29 10:32:50 | 显示全部楼层
ghslfgkkl88 发表于 2018-10-29 10:15
“执行完SET到RESET这个过程来不及反应”
你跟我说说,为啥来不及反应?就两个函数调用,调用了HAL_GPIO_W ...

HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
    osDelay(1000);
                HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
执行完RESET延时了1000然后执行SET,这个应该能够正常闪烁,为啥现在没有呢,灯根本不反应
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2018-10-29 10:41:44 | 显示全部楼层
^张浩然 发表于 2018-10-29 10:32
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
    osDelay(1000);
                 ...

原来你是这里想岔了,不知道你的RESET输出时是灯亮还是灯灭。我就假设RESET时灯亮,SET时灯灭。

你想想,输出RESET时,灯亮;然后过了1000ms后输出SET,按理此时灯要灭。但是灯还没来得及灭多久,结果立即回到for(;;)开头输出RESET让灯亮了。也就是说,并不是灯没灭,而是灭的时间太短,你根本看不出来。假设MCU从HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);执行到HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);只需要1us。那么你的灯就只亮了1us,其他时间都是灭的。你想想,每秒钟你的灯亮1us,你看得出来?
回复

使用道具 举报

27

主题

70

回帖

151

积分

初级会员

积分
151
 楼主| 发表于 2018-10-29 10:52:23 | 显示全部楼层
ghslfgkkl88 发表于 2018-10-29 10:41
原来你是这里想岔了,不知道你的RESET输出时是灯亮还是灯灭。我就假设RESET时灯亮,SET时灯灭。

你想 ...

谢谢,我明白了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 21:07 , Processed in 0.167407 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表