查看: 1500|回复: 3

[求助] freertos ke06 定时器中断误差15us

[复制链接]
回帖奖励 8 NXP金币 回复本帖可获得 1 NXP金币奖励! 每人限 1 次
  • TA的每日心情
    郁闷
    2021-1-26 11:20
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    10

    主题

    32

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    204
    最后登录
    2021-2-2
    发表于 2021-1-26 10:59:20 | 显示全部楼层 |阅读模式
    哈喽,大家好。    我在MKE06Z上使用了freertos操作系统,最近发现进入定时器0中断不及时的状况。在定时器中断内,我每隔500us翻转一个引脚的电平,通过示波器得知,定的是500us,但是40%的情况出现定时器超过505us才响应,20%出现超过510us响应,5%出现超过520us响应。
        对此我做了以下几个实验来排除问题。

        1.使用裸机跑程序。不加freertos,就一个功能:定时器。发现示波器上稳稳的。定的是500us,绝对没有一次超过500us响应。
        2.实验1排除了我定时器中断编程错误的原因。第二步排除中断优先级不够的问题,如果中断优先级不够,那肯定是先执行优先级高的中断服务程序,所以出现误差是在所难免的。然后我在初始化设定这样设置:
    1.   NVIC_SetPriority(PIT_CH0_IRQn, (1<<__NVIC_PRIO_BITS));
    2.                 NVIC_SetPriority(PIT_CH1_IRQn,(1<<__NVIC_PRIO_BITS));
    3.                 NVIC_SetPriority(IRQ_IRQn, (1<<__NVIC_PRIO_BITS)+1);
    4.                 NVIC_SetPriority(ADC0_IRQn,  (1<<__NVIC_PRIO_BITS)+1);
    5.                 NVIC_SetPriority(UART0_IRQn, (1<<__NVIC_PRIO_BITS)+2);
    6.                 NVIC_SetPriority(UART1_IRQn, (1<<__NVIC_PRIO_BITS)+2);       
    7.                 NVIC_SetPriority(UART2_IRQn, (1<<__NVIC_PRIO_BITS)+2);       
    8.                 NVIC_SetPriority(RTC_IRQn,   (1<<__NVIC_PRIO_BITS)+3);
    复制代码
      发现实验结果没有变化。我想可能是操作系统接口的那三个中断引起的误差,然后把这三个中断优先级也往后排了一下
    1. NVIC_SetPriority(SVCall_IRQn,  (1<<__NVIC_PRIO_BITS)+1);
    2.                 NVIC_SetPriority(PendSV_IRQn,  (1<<__NVIC_PRIO_BITS)+1);
    3.                 NVIC_SetPriority(SysTick_IRQn,  (1<<__NVIC_PRIO_BITS)+1);
    复制代码
       发现实验结果没有变化,我想可能我设置的中断优先级有问题,尽管我是严格按照论坛大佬的方案去更改NVIC优先级的参考链接:[经验分享]关于Kinetis L系列中断优先级设置问题的解决方案
    https://www.nxpic.org.cn/module/ ... amp;fromuid=3424147
    (出处: 恩智浦技术社区)

    我又设置了不受操作系统管辖的中断优先级还是不行。
    1. #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
    复制代码

    于是进入下一个实验
        3.全部关闭,现在我的程序除了定时器中断,什么中断统统被我关闭,问题没解决,谁也别想进入中断了!UART0,1 RTC,ADC,IRQ,KBI,的初始化函数,一律代码注释,直接不开启了,我再去看定时器中断,哎,还是老样子,问题一模一样,还在那放着。



    现在暂时找不到下一个应该怎么找出问题的测试内容,恳请各位路过的高手指点迷津,不胜感激!

    我知道答案 目前已有3人回答
    抗疫加油
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-1-26 14:06:05 | 显示全部楼层

    回帖奖励 +1 NXP金币

    关注一下这个帖子。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19934
    最后登录
    2024-4-19
    发表于 2021-1-27 09:22:41 | 显示全部楼层

    回帖奖励 +1 NXP金币

    os应该有自带的滴答定时器,你建个任务然后等滴答计数器等于500us,再去反转电平
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-1-26 11:20
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    10

    主题

    32

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    204
    最后登录
    2021-2-2
     楼主| 发表于 2021-1-27 10:02:38 | 显示全部楼层
    小恩GG 发表于 2021-1-27 09:22
    os应该有自带的滴答定时器,你建个任务然后等滴答计数器等于500us,再去反转电平 ...

    你好,谢谢你的回答。请问os自带的滴答定时器,实时性应该没有这么强吧,我这里很特殊,能够容忍的误差在2-3us内,超过这个时间可能引起IGBT触发波形异常,然后IGBT就会发生爆炸,火光冲天,耳朵都要聋半天。这个触发波形很独特,用PWM不够完成,因为不是单纯正反相方波,而且方波内还需要补充一些小的触发波形而且波形还要忽大忽小,有些复杂,所以每次在PIT中断内重装我预设的初值是我最理想的解决方案。您的意思是指在freertos内使用定时器中断是会引起中断响应不及时对吧,在您的预料之内。如果我再想不到办法的话,就只能抛弃我在这款芯片上已经用了两年多的freertos,转战裸机了。但是我程序量这么大,跑while(1)太痛苦了
    抗疫加油
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 20:05 , Processed in 0.121147 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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