OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7279|回复: 3

在操作系统中使用systick的延时函数问题

[复制链接]

21

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-4-12
在线时间
0 小时
发表于 2013-5-4 10:58:14 | 显示全部楼层 |阅读模式
原子哥用的延时函数是采用系统滴答定时器做的,每次延时,都是开定时器,关闭定时器,而在操作系统,

比如μcosii或者rt-thread中,需要用systick作为系统的心跳,

但是这样的话,每次在计时时都会被延时函数所关闭,或者又打开,这个冲突该怎么解决呢?  


第二个,假如在外部中断里面,用了这个延时函数,系统就卡在延时函数里面出不来了。

按道理,systick的中断优先级比外部中断的高,在进入外部中断了之后,

用延时函数时,因为有秒中断,肯定会被systick所抢占,然后再退出,继续执行外部中断。。怎么还会卡住了?


原子哥,有空的时候帮我解答下。谢谢


自信人生一百年
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-4 12:16:19 | 显示全部楼层
回复【楼主位】liuliuzelin:
---------------------------------
请看战舰板的SYSTEM文件夹介绍。
战舰板的delay.c直接支持UCOSII,但是RTT没有添加,不过也类似,用到了一种时间时间摘取法,来实现和ucosii共存。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
发表于 2013-5-28 21:44:56 | 显示全部楼层
回复【楼主位】liuliuzelin:

原子哥用的延时函数是采用系统滴答定时器做的,每次延时,都是开定时器,关闭定时器,而在操作系统,
比如μcosii或者rt-thread中,需要用systick作为系统的心跳,
但是这样的话,每次在计时时都会被延时函数所关闭,或者又打开,这个冲突该怎么解决呢?  
第二个,假如在外部中断里面,用了这个延时函数,系统就卡在延时函数里面出不来了。
按道理,systick的中断优先级比外部中断的高,在进入外部中断了之后,
用延时函数时,因为有秒中断,肯定会被systick所抢占,然后再退出,继续执行外部中断。。怎么还会卡住了?
原子哥,有空的时候帮我解答下。谢谢

---------------------------------
RTT官网有个贴也讨论到这个问题。原理都是一样。在一个系统时钟里面拿出一点时间来等,不过要注意一个系统剩下的时间够不够用,代码如下


代码: 全选
#include <core_cm3.h>
void rt_hw_us_delay(int us)
{
    rt_uint32_t delta;
    rt_uint32_t current_delay;

        /* 获得延时经过的tick数 */
    us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND));

        /* 获得当前时间 */
    delta = SysTick->VAL;

        /* 循环获得当前时间,直到达到指定的时间后退出循环 */
    do
    {
        if ( delta > SysTick->VAL )
            current_delay = delta - SysTick->VAL;
        else
        /* 延时跨越了一次OS tick的边界时的处理 */
            current_delay = SysTick->LOAD + delta - SysTick->VAL;
    } while( current_delay < us );
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-29 00:30:08 | 显示全部楼层
我的延时用的是时间摘取法,不需要中断.
当延时小于1个systick时钟节拍的时候,就会禁止所有中断,进行延时,这是此种延时方法的一个缺点.
但是如果这个小的中断延时可以接受的话,就不存在其他任何问题了.
任何地方都可以调用我们的systick延时函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 05:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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