大家好、我有以下设置:连接到 INT_GPIOC 和 INT_GPIOD (左轮中断 C 和右轮中断 D)的轮编码器和 INT_TIMER2A 中断、自 INIT 起增加计数器的秒数。 目的是每次触发对应于轮编码器的中断时、它都会生成一条消息、其中包含 INIT 以来的时间以及有关轮侧和方向的信息、并通过 UART 转发发送。 问题是,在某些情况下,事件的时间戳似乎顺序错误,这种情况似乎是在定时器_interrupt_fires i.e 每次经过一秒时发生的(请参阅下面的示例序列)。 我怀疑这与相互重叠的中断相关、但我不确定如何解决它? 我还想将 UART 发送例程(serial_write_message)移至远离中断的主循环。 但是、在这种情况下、我应该阻止 GPIOC 和 GPIOD 中断在 serial_write_message_is 完成之前触发、但不要将它们松开、例如下面的内容、但我不确定是否可以在主代码中将中断排队等待执行时间? 如果有任何解决问题的建议、我将不胜感激。
伪代码通过 UART 在主代码中而非中断中发送消息:
while (1){ //flag 指示新消息 if (new_message){ //队列中断例程生成 new_message_string,直到将旧消息写入 UART (但不会释放中断) BLOCK_GPIO_INTERRUPTS (); //new_message_string 内容在中断例程中设置 serial_write_message (new_message_string);
//可以接受来自中断的旧消息写入的新消息 UNBLOAD_GPIO_INTERRUPTS (); new_message = 0; }
损坏事件的示例序列
0 117.908203 0 1
0 117.956008 1 1.
0 117.960891 0 1
0 117.999351 1
0 118.4722 0 1.
0 118.56480 0 1
0 118.59448 1 1.
0 118.102294 0 1.
0 118.103828 1 1.
0 118.156608 0 1.
0 118.163978 1.
0 118.202339 0 1
0 118.206573 1 1.
生成和执行中断的实际代码:
静态空 init_interrupts (){ GPIOPinIntEnable (GPIO_PORTD_base、input1); GPIOPinIntEnable (GPIO_PORTC_BASE、input2); IntEnable (INT_GPIOD); IntEnable (INT_GPIOC); IntEnable (INT_TIMER2A); TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT); IntMasterEnable (); TimerEnable (TIMER2_base、TIMER_A); } void system_time(){ TIMERIntClear (TIMER2_base、TIMER_TINA_TIMEOUT); second_INIT = seconds_sine_init + 1; } void IntGPIOD (void){ if (!GPIOPinRead (GPIO_PORT_TIMEOUT) TIMEOUT = secreturn_HIGH; }void INPUT (GPIOD) 1和 INPUT (LOFT)+ INPUT (INTOP0) 1);INPUT (INTOPUR1 & INPUT (INTOP0)高电平) 0:1; int wheel = 0; int wheet_dir = 1; char rower_direction = motor_get_direction (); if (rower_dir='f'){ wheel_dir = 'b'){ wheel rowe_dir='0'; }else if (rowrowe_dir='l'){ wheel ='rand_dir ='0';}wheel ='randrowel_dir_dir_dir=0' GPIOPinIntClear (GPIO_PORTD_base、input1); float realtime = seconds_sine_init +(float)(SysCtlClockGet ()-1 - TimerValueGet (TIMER2_base、timer_A))/((float) SysCtlClockGet ()); char message[80]- TimerValueGet (TIMER2_base、timer_a)/((turel tel))/(%tlef )/yclockGet (%tlef))、%tlef、%t&tlen、%tlef、%t&t serial_write_message (message、message_len); }