ISR与回调函数的关系及TI MCU SDK定时器回调执行流程咨询
定时器ISR与带参数回调的调用逻辑
TI MCU SDK里的定时器ISR是SDK预先封装好的通用中断服务程序,并非你直接编写的裸机ISR,它通过以下方式实现带参数回调的调用:
- 你在注册回调时,除了传入回调函数指针,还会同时传入一个用户上下文参数(比如定时器句柄、自定义数据结构指针),这个参数会被SDK存储到对应定时器的控制结构体(如
Timer_Handle关联的内部结构体)中。 - 当定时器触发中断时,CPU跳转到这个通用ISR,ISR会先完成硬件中断清除、状态校验等必要操作,然后从控制结构体中取出你注册的回调函数指针和上下文参数。
- 最后,通用ISR以函数调用的形式,将上下文参数传递给你的回调函数——这就实现了带输入参数的回调调用,而你编写的回调函数自然就有了输入参数。
CPU实际执行流程
- 定时器计数达到预设条件(溢出/匹配值),向CPU发送中断请求。
- CPU立即暂停当前正在执行的用户代码,将当前程序计数器(PC)、寄存器组等运行上下文保存到栈中。
- CPU根据中断向量表,跳转到SDK实现的定时器通用ISR入口地址。
- 通用ISR执行流程:
- 清除定时器的中断标志位,防止中断重复触发。
- 从定时器控制结构体中读取预先存储的回调函数指针和用户上下文参数。
- 调用你的回调函数,并传入上下文参数。
- 回调函数执行完成后,返回到通用ISR,ISR完成收尾校验工作。
- ISR执行结束,CPU从栈中恢复之前保存的运行上下文,回到被中断的用户代码位置继续执行。
补充说明:裸机环境下直接编写的ISR确实要求无输入参数、无返回值,这是硬件中断机制的限制。但SDK封装的通用ISR完全符合这个规范,它只是在内部做了一层封装,把带参数的回调作为ISR的内部调用环节,既满足了硬件要求,又给开发者提供了更灵活的回调使用方式。
内容的提问来源于stack exchange,提问作者weyman xia
相关产品推荐
相关产品推荐

