外部中断和定时器联用后的一个小BUG

2019-08-15 16:22发布

void TIM5_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)
        {
                g_mode.mode();
        }
        TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}

这是一个函数定时访问

void EXTI1_IRQHandler(void)
{
        g_exti.exti_flag ++;                                                                                                                                                                                                               
        g_mode.MODE_data.exti_count = g_exti.exti_flag;                                                                                                                                                                                                                                       
        EXTI_ClearITPendingBit(EXTI_Line1);                                                                                                                                                                 
}

这是一个外部中断  记下访问次数赋给  g_mode.MODE_data.exti_count

void Mode(void)
{
        if(g_mode.MODE_data.timer1_flag == 0)
        {
                g_mode.MODE_data.timer1_flag = 1;                                                                                                                                                                        //ÅD¶Ï±êÖ¾ÖÃ1
               
                if(g_mode.MODE_data.exti_count--)
                {                       
                                GPIO_ResetBits(GPIOA,GPIO_Pin_7);        //下面是另一个定时器写的定时函数
                                SoftwareTimers.Register_fun(g_motor.motor_left, 1, 0);
                               
                                SoftwareTimers.Register_fun(g_camera.camera_on, 5, 0);
                                SoftwareTimers.Register_fun(g_camera.camera_off, 10, 0);
                               
                                SoftwareTimers.Register_fun(g_motor.motor_mid, 15, 0);
                               
                                SoftwareTimers.Register_fun(g_camera.camera_on, 20, 0);
                                SoftwareTimers.Register_fun(g_camera.camera_off, 25, 0);
                               
                                SoftwareTimers.Register_fun(g_motor.motor_right, 30, 0);
                               
                                SoftwareTimers.Register_fun(g_camera.camera_on, 35, 0);
                                SoftwareTimers.Register_fun(g_camera.camera_off, 40, 0);
                               
                                SoftwareTimers.Register_fun(g_motor.motor_mid, 45, 0);
                               
                                SoftwareTimers.Register_fun(g_mode.clear_flag, 46, 0);
                }
        }
}

void Clear_Flag(void)
{
        g_mode.MODE_data.timer1_flag = 0;
}


这是那个定时触发的函数,标志最后清除

#ifndef __EXTI_H
#define __EXTI_H

#include "user_conf.h"  
#define pulse_mode_rising         1                               
#define capture_pulse 1

typedef struct
{
        u32 exti_flag;
        void(*exti_init)(void);       
}Exti_Fun;

void Exti_Init_Fun(void);

extern Exti_Fun g_exti;

#endif  


头文件exti.h

#ifndef __MODE_H
#define __MODE_H

#include "user_conf.h"  

typedef struct
{
        u8 timer1_flag;
        u32 exti_count;
}modedata;


typedef struct
{
  modedata MODE_data;
        void(*mode)(void);
        void(*clear_flag)(void);
}Mode_Fun;

void Mode(void);
void Clear_Flag(void);

extern Mode_Fun g_mode;

#endif


头文件 mode.h

现在的BUG是  外部中断来了之后  函数在if(g_mode.MODE_data.exti_count--) 判断不过,实时调试g_mode.MODE_data.exti_count为5为6仍进不去
我如果我把if(g_mode.MODE_data.exti_count--) 去掉
会定时触发


请各位看一下




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
正点原子
1楼-- · 2019-08-15 21:30
可以仿真解决问题
聚东风
2楼-- · 2019-08-16 02:59
库函数我不用的,但是
if(g_mode.MODE_data.exti_count--)
我建议你别贪图省事...嵌入式需要理解计算机是怎么去理解数据的
if(g_mode.MODE_data.exti_count>0)
{
    g_mode.MODE_data.exti_count--;
}
mygod
3楼-- · 2019-08-16 07:23
一般出现这个问题和编译器的优化选项有关,要么关闭优化,要么加关键字volatile.
再回复楼上,f(g_mode.MODE_data.exti_count--)  这写法是可以的,如果 这都不行的话,那程序都不用写了
聚东风
4楼-- · 2019-08-16 09:26
 精彩回答 2  元偷偷看……
mygod
5楼-- · 2019-08-16 10:54
聚东风 发表于 2017-7-21 09:03
从逻辑上来说,if中判定的语句是要执行的,你一个递减在那里,有一定的可能会导致g_mode.MODE_data.exti_cou ...

为0 时候进不了 if() 里面了
聚东风
6楼-- · 2019-08-16 12:05
mygod 发表于 2017-7-21 09:09
为0 时候进不了 if() 里面了

QQ图片20170721091525.png

一周热门 更多>