硬汉嵌入式论坛

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

[有问必答] bsp_DelayMS 函数为什么参数N 应该>2

[复制链接]

4

主题

37

回帖

49

积分

初级会员

积分
49
发表于 2015-3-9 22:45:31 | 显示全部楼层 |阅读模式
*******************************************************************************************************
* 函 数 名: bsp_DelayMS
* 功能说明: ms级延迟,延迟精度为正负1ms
* 形    参:n : 延迟长度,单位1 ms。 n 应大于2
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t n)
{
/* 避免 n = 1 出现主程序死锁 */
if (n <= 1)
{
  n = 2;
}

__set_PRIMASK(1);    /* 关中断 */
g_Tmr[0].count = n;
g_Tmr[0].flag = 0;
__set_PRIMASK(0);    /* 开中断 */
while (1)
{
  CPU_IDLE(); /* 此处是空操作。用户可以定义,让CPU进入IDLE状态,以降低功耗;或实现喂狗 */
  /* 等待延迟时间到 */
  if (g_Tmr[0].flag == 1)
  {
   break;
  }
}
}





/* 避免 n = 1 出现主程序死锁 */
这个怎么理解啊  我觉得 也可以啊

在SysTick中断中周期调用 下面的函数 N=1时也可以啊 只不过可能不到一毫秒标志位就置1了,只不过不精确 不会死锁吧


*********************************************************************************************************
* 函 数 名: bsp_SoftTimerDec
* 功能说明: 每隔1ms对所有定时器变量减1。必须被SysTick_ISR周期性调用。
* 形    参:_tmr : 定时器变量指针
* 返 回 值: 无
*********************************************************************************************************
*/
static void bsp_SoftTimerDec(SOFT_TMR *_tmr)
{
if (_tmr->flag == 0)
{
  if (_tmr->count > 0)
  {
   /* 如果定时器变量减到1则设置定时器到达标志 */
   if (--_tmr->count == 0)
   {
    _tmr->flag = 1;
   }
  }
}
}
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-9 23:23:16 | 显示全部楼层
可以的,没问题,建议看新版的代码http://www.armbbs.cn/forum.php?mod=viewthread&tid=1285
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2015-3-10 06:51:54 | 显示全部楼层
谢谢版主解答  看来N =1也是可以的 新版本的的代码已经解决了 这个问题 我看看新版的代码 再次感谢
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2015-3-10 07:07:58 | 显示全部楼层
看了 新版的 也是要求 N=2啊,N =1 为什么不可以 ? 我理解的意思是N =1 可能延时极短的时间 ,不到 1ms  ,起不到作用所以要 N=2
/*
*********************************************************************************************************
*    函 数 名: bsp_DelayMS
*    功能说明: ms级延迟,延迟精度为正负1ms
*    形    参:  n : 延迟长度,单位1 ms。 n 应大于2
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t n)
{
    if (n == 0)
    {
        return;
    }
    else if (n == 1)
    {
        n = 2;
    }

    DISABLE_INT();              /* 关中断 */

    s_uiDelayCount = n;
    s_ucTimeOutFlag = 0;

    ENABLE_INT();                  /* 开中断 */

    while (1)
    {
        bsp_Idle();                /* CPU空闲执行的操作, 见 bsp.c 和 bsp.h 文件 */

        /*
            等待延迟时间到
            注意:编译器认为 s_ucTimeOutFlag = 0,所以可能优化错误,因此 s_ucTimeOutFlag 变量必须申明为 volatile
        */
        if (s_ucTimeOutFlag == 1)
        {
            break;
        }
    }
}
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-10 08:12:38 | 显示全部楼层

回 蓝瑟lemon 的帖子

蓝瑟lemon:看了 新版的 也是要求 N=2啊,N =1 为什么不可以 ? 我理解的意思是N =1 可能延时极短的时间 ,不到 1ms  ,起不到作用所以要 N=2
/*
*********************************************************************************************************
*    .. (2015-03-10 07:07) 
是这样的,你的理解是对的。主要就是为了防止这种情况出现。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2015-3-10 10:57:45 | 显示全部楼层

回 席萌0209 的帖子

席萌0209:是这样的,你的理解是对的。主要就是为了防止这种情况出现。 (2015-03-10 08:12)
嗯 谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 16:49 , Processed in 0.263927 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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