Cortex-M处理器集成了一个24BIT的向下计数的Systick定时器。通过Systick中断,定时触发OS内核。用来产生系统节拍,进行任务管理和上下文切换。
SysTick主要包含四个寄存器
在ERIKA OS中可以通过编辑Oil文件来配置SysTick的节拍
需要将DEVICE类型选择为SYSTICK,同时为了保证Systick的节拍频率与设置的一致,需要检查CPU_CLK的时钟频率是否与配置的一致。
通过查看CPU_DATA可以得到当前系统的时钟频率
或者是查看生成的OS配置文件中的 OSEE_CPU_CLOCK
建议:不要直接修改动态代码中的配置参数,ERIKA提供可视化的配置工具。通过工具修改,以保证Oil文件与动态代码的一致性。
在配置好OS的各项配置后,只需要调用OS 接口 StartOs,OS即可开始调度。那么ERIKA是如何将Systick初始化呢?
ERIKA 通过接口osEE_cortex_m_system_timer_init初始化Systick。
接口函数实现如下:
/** \brief System Timer Initialization. */
FUNC(void, OS_CODE) osEE_cortex_m_system_timer_init(void)
{
osEE_cortex_m_systick_set_period(
((OSTICKDURATION / OSEE_KILO) / OSEE_KILO) * (OSEE_CPU_CLOCK / OSEE_KILO)
);
osEE_cortex_m_systick_enable_int();
osEE_cortex_m_systick_start();
}
主要看这里设置系统周期的函数:
#define OSEE_S_J(s1,s2) OSEE_STRING_JOIN(s1,s2)
#define OSEE_INTEGER_DEFINES_SUFFIX U
#define OSTICKDURATION (1000000U)
#define OSEE_CPU_CLOCK (48000000U)
#define OSEE_KILO OSEE_S_J(1000, OSEE_INTEGER_DEFINES_SUFFIX)
这里是基于48M时钟配置的,1ms系统节拍。
OSEK将中断分为两类: ISR category 1、ISAR category2。
/*
* System Timer ISR.
*/
ISR2(osEE_cortex_m_system_timer_handler)
{
OsEE_CDB * p_cdb = osEE_get_curr_core();
osEE_counter_increment(p_cdb->p_sys_counter_db);
}
ERIKA 定义两种中断Systick的中断服务函数
FUNC(void, OS_CODE) (v)( void ) \
{ \
osEE_cortex_m_isr1_stub(f); \
}
#endif /* !OSEE_API_DYNAMIC */
#define OSEE_CORTEX_M_ISR2_DEFINITION(v,t) \
/* Declare The ISR User handler */ \
FUNC(void, OS_CODE) (v)( void ) \
{ \
osEE_cortex_m_isr2_stub(t); \
}
其中category 1需要用户自己显示SysTick中断服务函数 category2是在Systick_Handler中调用
osEE_cortex_m_isr2_stub,最终调用ERIKA 提供的Systick服务函数osEE_cortex_m_system_timer_handler。