硬汉嵌入式论坛

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

[μCOS-III] UCOS中如何调用微秒?

[复制链接]

3

主题

54

回帖

63

积分

初级会员

积分
63
发表于 2015-12-8 10:30:57 | 显示全部楼层 |阅读模式
如果使用UCOS,bsp_DelayUS就不能用了,那有些时序需要微秒的。
是自己再弄个定时器中断来调用微秒?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-12-8 11:22:47 | 显示全部楼层
这个是我新创作的一个微妙延迟函数,可以试试,已经用在V4板子的
V4-625_uCOS-III实验_uCOS-III+STemWin+FatFS综合例子里面
其它的FreeRTOS,RTX也都采用了这种方法,简洁好用。


使用前请初始化
1.png

==============================================
us延迟的实现在bsp.c文件里面:

/*
*********************************************************************************************************
*    函 数 名: bsp_DelayMS
*    功能说明: 为了让底层驱动在带RTOS和裸机情况下有更好的兼容性
*             专门制作一个阻塞式的延迟函数,在底层驱动中ms毫秒延迟主要用于初始化,并不会影响实时性。
*    形    参: n 延迟长度,单位1 ms
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t _ulDelayTime)
{
    bsp_DelayUS(1000*_ulDelayTime);
}

/*
*********************************************************************************************************
*    函 数 名: bsp_DelayUS
*    功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
*                 OSSchedLock(&err);
*                bsp_DelayUS(5);
*                OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
*    形    参: _ulDelayTime  延迟长度,单位1 us
*    返 回 值: 无
*   说    明: 1. 主频168MHz的情况下,32位计数器计满是2^32/168000000 = 25.565秒
*                建议使用本函数做延迟的话,延迟在1秒以下。  
*             2. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行0.25us左右的时间。
*             下面数据测试条件:
*             (1). MDK5.15,优化等级0, 不同的MDK优化等级对其没有影响。
*             (2). STM32F407IGT6
*             (3). 测试方法:
*                 GPIOI->BSRRL = GPIO_Pin_8;
*                 bsp_DelayUS(10);
*                 GPIOI->BSRRH = GPIO_Pin_8;
*             -------------------------------------------
*                测试                 实际执行
*             bsp_DelayUS(1)          1.2360us
*             bsp_DelayUS(2)          2.256us
*             bsp_DelayUS(3)          3.256us
*             bsp_DelayUS(4)          4.256us
*             bsp_DelayUS(5)          5.276us
*             bsp_DelayUS(6)          6.276us
*             bsp_DelayUS(7)          7.276us
*             bsp_DelayUS(8)          8.276us
*             bsp_DelayUS(9)          9.276us
*             bsp_DelayUS(10)         10.28us
*            3. 两个32位无符号数相减,获取的结果再赋值给32位无符号数依然可以正确的获取差值。
*              假如A,B,C都是32位无符号数。
*              如果A > B  那么A - B = C,这个很好理解,完全没有问题
*              如果A < B  那么A - B = C, C的数值就是0xFFFFFFFF - B + A + 1。这一点要特别注意,正好用于本函数。
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t _ulDelayTime)
{
    uint32_t tCnt, tDelayCnt;
    uint32_t tStart;

    tStart = (uint32_t)CPU_TS_TmrRd();                       /* 刚进入时的计数器值 */
    tCnt = 0;
    tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);     /* 需要的节拍数 */               

    while(tCnt < tDelayCnt)
    {
        tCnt = (uint32_t)CPU_TS_TmrRd() - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */   
    }
}

回复

使用道具 举报

6

主题

390

回帖

408

积分

高级会员

积分
408
发表于 2015-12-8 11:26:14 | 显示全部楼层
[s:151]  [s:151]  [s:151]  [s:151]
回复

使用道具 举报

3

主题

54

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2015-12-8 11:30:37 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个是我新创作的一个微妙延迟函数,可以试试,已经用在V4板子的
V4-625_uCOS-III实验_uCOS-III+STemWin+FatFS综合例子里面
其它的FreeRTOS,RTX也都采用了这种方法,简洁好用。


....... (2015-12-08 11:22) 
非常感谢
我去看下那个例程!
[s:151]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-12-8 11:37:08 | 显示全部楼层

回 shampoo 的帖子

shampoo:非常感谢
我去看下那个例程!
[s:151] (2015-12-08 11:30) 
其实bsp_DelayUS也是可以用的,这个只是读操作,不影响滴答定时器,就是关闭滴答定时器中断时就不行了。或者滴答定时器没有初始化之前需要us延迟。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 05:25 , Processed in 0.168623 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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