RTOS - preemptive

收錄於 : 關於Ameba的一百篇

續前篇 : RTOS-multitask


接續 Jserv 的課程作業 :

mini-arm-os 的 hackpad

   embedded-2016

   embedded-2015

github 程式 - link


example 5 是 systick, 之前這篇有介紹過 - systick


Ameba  clock 是 166MHz
#define CPU_CLOCK_HZ (500000000/3)  

/* 100 ms per tick. */
#define TICK_RATE_HZ 10


要注意 SYSTICK_LOAD 只有 24 bit. 所以 TICK_RATE_HZ 設成 1 就會超過了


/* SysTick Memory Map */
#define __REG_TYPE  volatile uint32_t
#define __REG   __REG_TYPE *
#define SYSTICK    ((__REG_TYPE) 0xE000E010)
#define SYSTICK_CTRL  ((__REG) (SYSTICK + 0x00))
#define SYSTICK_LOAD  ((__REG) (SYSTICK + 0x04))
#define SYSTICK_VAL ((__REG) (SYSTICK + 0x08))
#define SYSTICK_CALIB ((__REG) (SYSTICK + 0x0C))

    /* SysTick configuration */
  *SYSTICK_LOAD = (CPU_CLOCK_HZ / TICK_RATE_HZ) - 1UL;
  *SYSTICK_VAL = 0;
  *SYSTICK_CTRL = 0x07;


所以一秒印一次的話, 可以在 systick 裡計數 : 

void systick_handler(void)
{
  static int i=0;

  if ( ((i++)% 10) == 0 ) {
      Serial.print("systick : ");
      Serial.println(i);
  }
}




這篇針對 example 6 - preemptive


1. 原本 svc_handler 做的事情, 我們移到 systick


2. 把第一次 save 的 kernel state, 搬到 task_init() / init_activate_env()

程式 : github

結果:





留言

熱門文章