RTOS - preemptive
收錄於 : 關於Ameba的一百篇
續前篇 : RTOS-multitask
接續 Jserv 的課程作業 :
mini-arm-os 的 hackpad
embedded-2016
embedded-2015
github 程式 - link
example 5 是 systick, 之前這篇有介紹過 - systick
要注意 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))
這篇針對 example 6 - preemptive
1. 原本 svc_handler 做的事情, 我們移到 systick
2. 把第一次 save 的 kernel state, 搬到 task_init() / init_activate_env()
程式 : github
結果:
續前篇 : 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
結果:
留言
張貼留言