新博客:http://sparkandshine.net/
分类: 嵌入式
2011-10-27 10:33:30
摘要:
本文基于STM32F103RBT6微控制器,深入源码,详细分析了时钟中断处理程序Systick_isr。
一、Systick_isr源代码
注:时钟中断处理程序与硬件相关,我用的是STM32F103RBT6。
二、源码分析
2.1 CLOCK_SECOND宏
CLOCK_SECOND定义了1秒钟产生时钟中断的次数,默认情况是32次,可以通过宏CLOCK_CONF_SECOND来配置。源代码如下:
2.2 SCB & ICSR
该语句主要对寄存器进行设置,SCB指System Control Block,ICSR指Interrupt Control State Register,SCB_ICSR_PENDSTCLR是Clear pending SysTick bit。
2.3 etimer_pending函数和etimer_next_expiration_time函数
etimer_pending函数检查timerlist是否为空(若返回true表示不为空),etimer_next_expiration_time函数返回next_expiration(即到了next_expiration才有etimer到期。另,若timerlist为空则返回0),并与系统当前时间current_clock比较,若next_expiration小于等于current_clock,则表明还没有etimer到期,于是把系统进程etimer_process的needspoll设为1,使其具有更快地再次获得执行。
2.3.1 etimer_pending函数
检查timerlist是否为空,若不为空则返回true,否则返回false,源码如下:
2.3.2 etimer_next_expiration_time函数
next_expiration是指timerlist下一个到期的时间,即到了next_expiration就会有etimer到期,由update_time计算,详情见博文《Contiki学习笔记:系统进程etimer_process》。
2.4 etimer_request_poll函数
将系统进程etimer_process的needspoll设为1,使其获得更高优先级,即让etimer_process更快地再次获得执行。详情见博文《Contiki学习笔记:系统进程etimer_process》。
Jelline2012-09-20 22:10:15