中断服务函数的编写要求

中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
  中断服务程序需要满足如下要求:
  (1)不能返回值;
  (2)不能向ISR传递参数;
  (3) ISR应该尽可能的短小精悍;
  (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

 

个人的一点理解 
如果说中断服务程序有返回值,那么它的值返回给谁呢?
在系统的运行过程中,一定是某种中断源出发了相应的中断,系统上挂接的中断服务程序进行现场的处理,例如告警等操作,然后清中断。
也就是说,中断服务程序链接在某一类中断源上,而这些中断源的产生是随机的,所以,中断服务程序并没有一个固定的调用者,也没有固定的返回地址,所以返回值也没有用吧。

http://qizhying533.blog.163.com/blog/static/193627032011430115550980/

SysTick 定时器是 ARM Cortex - M 架构中的一个内置计时器,用于生成固定时间间隔的定时中断,其服务函数编写与具体需求相关。以下以实现精准延时功能为例,介绍编写方法。 首先,明确 SysTick 中断是基于定时器的,它提供周期性触发的定时中断,可用于系统的定时和调度,中断间隔由加载到 SysTick 寄存器的值决定。对于实现精准延时,可按如下步骤编写服务函数[^1] [^2]。 在编写代码时,定义一个全局变量 `systime` 用于记录 SysTick 中断的次数,在 SysTick 中断服务函数 `SysTick_Handler` 中对该变量进行递增操作。以下是代码示例: ```c // 全局变量,用于记录 SysTick 中断次数 volatile unsigned int systime = 0; // SysTick 中断服务函数 void SysTick_Handler(void) { systime++; } ``` 上述代码中,`volatile` 关键字确保编译器不会对 `systime` 变量进行优化,保证每次中断时 `systime` 都会正确递增。 接着,编写延时函数。通过记录进入延时函数时的 `systime` 值,然后在循环中判断 `systime` 的增量是否达到所需的延时时间(以毫秒为单位)。代码示例如下: ```c // 延时函数,单位为毫秒 void delay_ms(unsigned int ms) { unsigned int temp; temp = systime; while ((systime - temp) < ms); } ``` 此延时函数会在 `systime` 的增量达到 `ms` 时退出循环,从而实现所需的延时。 要使用上述代码,还需要对 SysTick 定时器进行初始化,设置合适的中断间隔。以下是一个简单的初始化示例: ```c #include "stm32fxxx.h" // 根据具体芯片型号选择头文件 // SysTick 初始化函数 void SysTick_Init(void) { // 配置 SysTick 时钟源为内核时钟 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // 设置 SysTick 重载值,实现 1ms 中断一次 SysTick_Config(SystemCoreClock / 1000); } ``` 在主函数中调用 `SysTick_Init` 进行初始化,然后就可以使用 `delay_ms` 函数进行延时操作。 ```c int main(void) { SysTick_Init(); while (1) { // 延时 500ms delay_ms(500); // 其他操作 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值