RTT之定时与中断理解

定时管理这部分看过一遍了,只是再总结一下要点:

两类定时机制:单次触发和周期性触发。

超时函数所执行的环境:分为中断环境与线程环境。默认是中断环境。

RTT定时器工作机制:

1、系统经过的tick

2、定时器链表rt_timer_list,按照超时时间排序的方式插入到定时器链表中。并且加入了跳表算法(其实就是加了索引)。

创建定时器,最终是调用timer.c中rt_list_init(),其中的timer->row类型为rt_list_t

RTT之定时与中断理解_第1张图片

然后在SysTick_Handler中,调用timer.c中rt_timer_check()函数,在此函数中,查询rt_timer_list链表,rt_timer_list是定义在timer.c中的一个全局变量static rt_list_t rt_timer_list[RT_TIMER_SKIP_LIST_LEVEL];//其类型也为rt_list_t与创建时的ROW类型一致。并通过rt_timer_check()来进行两者的关联。

RTT之定时与中断理解_第2张图片

这样就可以实现定时功能。RTT也是由SysTick来实现定时功能的。

定时器管理:

创建:rt_timer_create()从内存堆中分配一个定时器控制块,然后初始化控制块。

删除:rt_timer_delete()从rt_timer_list链表中删除,释放内存控制块所占空间

静态:

创建:rt_timer_init():初始化定时器控制块

删除:rt_timer_detach():从容器中脱离,但占用内存不会释放。

启动:定时器状态改为激活,并插入到rt_timer_list中。

停止:状态改为停止,并脱离rt_timer_list链表。

控制:编程接口,查看或改变定时器设置。

精确延时:rt_hw_us_delay();

定时器的上下文

超时处理都是在中断中进行的,需要时刻关心超时函数都进行了哪些工作。

软件定时器指单独创建一个定时线程来处理时间。也必须是OS_tick的整数倍。

 

异常:

同步异常:指由同部事件产生的异常。如除零错误。

异步异常:指由外部事件产生的异常。如中断。

同步异常必须立即去处理,异步异常可以延缓或忽略。

中断:

中断服务程序必须放在统一的地址上(NVIC的中断向量偏移寄存器中)。

中断处理机制:

独立中断栈:中断时会将栈指针,更换到系统事先预留出来的中断栈空间中。运行异常和中断程序使用主堆栈(MSP)。

中断会抢占所有线程,优先运行。

中断管理:

装载:将用户的中断服务程序同中断号关联起来。

屏蔽中断源:如其意

打开屏蔽中断源:如其意

全局中断开/关:如其意

中断通知:

rt_interrupt_enter():通知内核进入中断状态,并增加嵌套深度。

rt_interrupt_leave():相对。

rt_interrupt_get_nest():是否是处于上下文切换中
 

基础,了解,了解。

你可能感兴趣的:(嵌入式开发零星时间堆记)