ERIKA如何配置Systick

目录

  • 一、Systick简介
  • 二、 ERIKA OS如何配置Systick
  • 三、ERIKA如何初始化SysTick
    • 1、初始化接口
    • 2、接口实现
  • 四、SysTick中断服务函数
    • 1、OSEK 的中断管理
    • 2、Systick中断

一、Systick简介

Cortex-M处理器集成了一个24BIT的向下计数的Systick定时器。通过Systick中断,定时触发OS内核。用来产生系统节拍,进行任务管理和上下文切换。
SysTick主要包含四个寄存器

  1. SysTick->CTRL(控制和状态寄存器)
  2. SysTick->LOAD(重装计数器)
  3. SysTick->VAL(当前计数值)
  4. SysTick->CALIB(校准计数器)
    通过配置Syctick可以定时触发SysTick中断,从而在Systick_Handler中实现OS相关功能

二、 ERIKA OS如何配置Systick

在ERIKA OS中可以通过编辑Oil文件来配置SysTick的节拍
ERIKA如何配置Systick_第1张图片
需要将DEVICE类型选择为SYSTICK,同时为了保证Systick的节拍频率与设置的一致,需要检查CPU_CLK的时钟频率是否与配置的一致。
通过查看CPU_DATA可以得到当前系统的时钟频率
ERIKA如何配置Systick_第2张图片
或者是查看生成的OS配置文件中的 OSEE_CPU_CLOCK
ERIKA如何配置Systick_第3张图片
建议:不要直接修改动态代码中的配置参数,ERIKA提供可视化的配置工具。通过工具修改,以保证Oil文件与动态代码的一致性。

三、ERIKA如何初始化SysTick

1、初始化接口

在配置好OS的各项配置后,只需要调用OS 接口 StartOs,OS即可开始调度。那么ERIKA是如何将Systick初始化呢?

ERIKA如何配置Systick_第4张图片
ERIKA 通过接口osEE_cortex_m_system_timer_init初始化Systick。

2、接口实现

接口函数实现如下:

/** \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系统节拍。

四、SysTick中断服务函数

1、OSEK 的中断管理

OSEK将中断分为两类: ISR category 1、ISAR category2。

  1. ISR category 1 1类中断不使用OS服务,OS也不管理此中断。当中断服务函数结束后,处理器继续执行之前被中断打断的任务。中断对任务管理没有影响。
  2. ISR category 2 2类中断需要在发生中断时,OS提供中断服务函数执行的环境。类似于一次任务切换。但是,定义2类中断需要定义一个Notification的中断服务函数。中断服务函数以如下的方式定义,并且在TDB(Task Descriptor Block)中初始化。
/*
 * 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);
}

2、Systick中断

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。

你可能感兴趣的:(AUTOSAR,S32K)