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

写了一个如下定义的函数

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

sonyanda
sonyanda
41
编辑于2012-11-28
评论 (1)链接2012-11-28 
  • 0 支持
    到底是要实现执行可改变的函数还是要传入不同的参数了?
    如果时要执行不同的函数,gamesun的方法是可以的
    如果是要传入不同的参数,那可能的需要你的编译器支持或者用汇编来写
    – lcq07 2013-08-07

有些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 );
}
gamesun
编辑于 2013-08-06
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2013-08-06
德问是一个专业的编程问答社区,请 登录注册 后再提交答案