函数指针在声明的时候形式就已经定死了,有什么方法能使中断服务可以灵活地执行不同形式的外部函数?


写了一个如下定义的函数

   
  int CountdownTimer_Init(u32 settime,u32 period,FunType fp)
  
{
if (countdowntimer_on==TRUE) return 1;//计时器正被使用
countdowntimer_on=TRUE;
tick_settime=settime;
RCC->APB1ENR|=1<<2;//TIM4时钟使能
TIM4->ARR=10000*period; //设定计数器自动重装值//刚好1ms
TIM4->PSC=Clock_PLL*800; //预分频器,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM4->DIER|=1<<0; //允许更新中断
TIM4->DIER|=1<<6; //允许触发中断

TIM4->CR1|=0x01; //使能定时器4
MY_NVIC_Init(2,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2

tick_start=tick_now;
funcp=fp;
return 0;
}

void TIM4_IRQHandler(void)
{
tick_now++;
(*funcp)();
TIM4->SR&=~(1<<0);//清除中断标志位
if(tick_now-tick_start>=tick_settime)
{
RCC->APB1RSTR|=1<<2;//TIM4复位
RCC->APB1RSTR&=~(1<<2);
countdowntimer_on=FALSE;
}
}

这样可以通过fp传入另外的函数指针来实现相应的中断服务
现在的问题是函数指针在声明的时候形式就已经定死了,也没法传入不同的参数个数
有什么方法能使中断服务可以灵活地执行不同形式的外部函数?

c 嵌入式

芹泽多摩雄 12 years, 1 month ago

有些MCU的中断向量是编译时就固定下来的,也有些MCU可以在运行时修改中断向量。

其实你的问题在这两类MCU上都可以解决。

   
  void foo( char *pcPara );
  
void bar( char *pcPara );
void (*fp)( char *pcPara );
char param[N];

main()
{
while ( 1 ){
if ( 某种情况 ){ // 关键是你的切换条件是什么?何时切换?
fp = foo;
} else {
fp = bar;
}
}
}

interrupt()
{
fp( param );
}

星海巡游者 answered 12 years, 1 month ago

Your Answer