在线时间26 小时
UID3424147
注册时间2017-9-18
NXP金币8
TA的每日心情 | 郁闷 2021-1-26 11:20 |
---|
签到天数: 5 天 [LV.2]偶尔看看I
中级会员
- 积分
- 207
- 最后登录
- 2021-2-2
|
哈喽,大家好。 我在MKE06Z上使用了freertos操作系统,最近发现进入定时器0中断不及时的状况。在定时器中断内,我每隔500us翻转一个引脚的电平,通过示波器得知,定的是500us,但是40%的情况出现定时器超过505us才响应,20%出现超过510us响应,5%出现超过520us响应。
对此我做了以下几个实验来排除问题。
1.使用裸机跑程序。不加freertos,就一个功能:定时器。发现示波器上稳稳的。定的是500us,绝对没有一次超过500us响应。
2.实验1排除了我定时器中断编程错误的原因。第二步排除中断优先级不够的问题,如果中断优先级不够,那肯定是先执行优先级高的中断服务程序,所以出现误差是在所难免的。然后我在初始化设定这样设置:
- NVIC_SetPriority(PIT_CH0_IRQn, (1<<__NVIC_PRIO_BITS));
- NVIC_SetPriority(PIT_CH1_IRQn,(1<<__NVIC_PRIO_BITS));
- NVIC_SetPriority(IRQ_IRQn, (1<<__NVIC_PRIO_BITS)+1);
- NVIC_SetPriority(ADC0_IRQn, (1<<__NVIC_PRIO_BITS)+1);
- NVIC_SetPriority(UART0_IRQn, (1<<__NVIC_PRIO_BITS)+2);
- NVIC_SetPriority(UART1_IRQn, (1<<__NVIC_PRIO_BITS)+2);
- NVIC_SetPriority(UART2_IRQn, (1<<__NVIC_PRIO_BITS)+2);
- NVIC_SetPriority(RTC_IRQn, (1<<__NVIC_PRIO_BITS)+3);
复制代码 发现实验结果没有变化。我想可能是操作系统接口的那三个中断引起的误差,然后把这三个中断优先级也往后排了一下- NVIC_SetPriority(SVCall_IRQn, (1<<__NVIC_PRIO_BITS)+1);
- NVIC_SetPriority(PendSV_IRQn, (1<<__NVIC_PRIO_BITS)+1);
- NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS)+1);
复制代码 发现实验结果没有变化,我想可能我设置的中断优先级有问题,尽管我是严格按照论坛大佬的方案去更改NVIC优先级的参考链接:[经验分享]关于Kinetis L系列中断优先级设置问题的解决方案
https://www.nxpic.org.cn/module/ ... amp;fromuid=3424147
(出处: 恩智浦技术社区)
我又设置了不受操作系统管辖的中断优先级还是不行。
- #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
复制代码
于是进入下一个实验
3.全部关闭,现在我的程序除了定时器中断,什么中断统统被我关闭,问题没解决,谁也别想进入中断了!UART0,1 RTC,ADC,IRQ,KBI,的初始化函数,一律代码注释,直接不开启了,我再去看定时器中断,哎,还是老样子,问题一模一样,还在那放着。
现在暂时找不到下一个应该怎么找出问题的测试内容,恳请各位路过的高手指点迷津,不胜感激!
|
|