ERIKA如何配置Systick

7 篇文章 8 订阅

一、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的节拍
SysTick
需要将DEVICE类型选择为SYSTICK,同时为了保证Systick的节拍频率与设置的一致,需要检查CPU_CLK的时钟频率是否与配置的一致。
通过查看CPU_DATA可以得到当前系统的时钟频率
在这里插入图片描述
或者是查看生成的OS配置文件中的 OSEE_CPU_CLOCK
在这里插入图片描述
建议:不要直接修改动态代码中的配置参数,ERIKA提供可视化的配置工具。通过工具修改,以保证Oil文件与动态代码的一致性。

三、ERIKA如何初始化SysTick

1、初始化接口

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

Systick
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。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值