From ff8b5098cd50dc32eedfe58e7f9ecb4ccadee25a Mon Sep 17 00:00:00 2001 From: Felix Kopp Date: Fri, 12 Jun 2020 12:29:27 +0200 Subject: [PATCH] Enable SysTick on sched_init --- arch/at91sam3x8e/Makefile | 1 + arch/at91sam3x8e/sched_hwtimer.c | 54 ++++++++++++++++++++++++++++++++ arch/at91sam3x8e/startup.c | 4 +-- include/arch/sched.h | 45 ++++++++++++++++++++++++++ kernel/sched.c | 7 +++-- 5 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 arch/at91sam3x8e/sched_hwtimer.c create mode 100644 include/arch/sched.h diff --git a/arch/at91sam3x8e/Makefile b/arch/at91sam3x8e/Makefile index 025bf3e..6f481ff 100644 --- a/arch/at91sam3x8e/Makefile +++ b/arch/at91sam3x8e/Makefile @@ -27,6 +27,7 @@ ARDIX_ARCH_PWD = $(PWD)/arch/at91sam3x8e ARDIX_SOURCES += \ $(ARDIX_ARCH_PWD)/isr_sched.c \ + $(ARDIX_ARCH_PWD)/sched_hwtimer.c \ $(ARDIX_ARCH_PWD)/startup.c ARDIX_ASM_SOURCES += \ diff --git a/arch/at91sam3x8e/sched_hwtimer.c b/arch/at91sam3x8e/sched_hwtimer.c new file mode 100644 index 0000000..0b9daa8 --- /dev/null +++ b/arch/at91sam3x8e/sched_hwtimer.c @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 2020 Felix Kopp + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +int sched_hwtimer_init(unsigned int freq) +{ + uint32_t ticks = F_CPU / freq; + if (ticks > REG_SYSTICK_LOAD_RELOAD_MASK) + return 1; + + REG_SYSTICK_LOAD = (ticks & REG_SYSTICK_LOAD_RELOAD_MASK) - 1; + REG_SYSTICK_VAL = 0U; + REG_SYSTICK_CTRL = REG_SYSTICK_CTRL_CLKSOURCE_MASK + | REG_SYSTICK_CTRL_TICKINT_MASK + | REG_SYSTICK_CTRL_ENABLE_MASK; + + return 0; +} + +void sched_hwtimer_pause(void) +{ + REG_SYSTICK_CTRL &= ~REG_SYSTICK_CTRL_ENABLE_MASK; +} + +void sched_hwtimer_resume(void) +{ + REG_SYSTICK_CTRL |= REG_SYSTICK_CTRL_ENABLE_MASK; +} diff --git a/arch/at91sam3x8e/startup.c b/arch/at91sam3x8e/startup.c index ea2d436..eb1b9b0 100644 --- a/arch/at91sam3x8e/startup.c +++ b/arch/at91sam3x8e/startup.c @@ -143,8 +143,8 @@ __section(.vectors) const void *exception_table[] = { &isr_svc, /* SVC call (used for syscalls) */ &isr_debug_mon, /* reserved for debug */ NULL, /* reserved */ - &isr_pend_sv, /* PendSV */ - &isr_sys_tick, /* SysTick (used by the scheduler) */ + &isr_pend_sv, /* PendSV (used by the scheduler) */ + &isr_sys_tick, /* SysTick */ /* * Ok I am REALLY tired of writing out mnemonics. diff --git a/include/arch/sched.h b/include/arch/sched.h new file mode 100644 index 0000000..c73a100 --- /dev/null +++ b/include/arch/sched.h @@ -0,0 +1,45 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 2020 Felix Kopp + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +/** + * Initialize a hardware timer for schduling. + * + * @param freq: The timer frequency in Hertz. + */ +int sched_hwtimer_init(unsigned int freq); + +/** + * Temporarily pause the scheduling timer (for atomic contexts). + */ +void sched_hwtimer_pause(void); + +/** + * Resume the previously paused scheduling timer. + */ +void sched_hwtimer_resume(void); diff --git a/kernel/sched.c b/kernel/sched.c index 279cc49..fbd1662 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -25,6 +25,7 @@ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -53,9 +54,9 @@ int sched_init(void) procs[i].pid = -1; } - /* TODO: initialize SysTick */ + i = sched_hwtimer_init(10000); - return 0; + return i; } void *sched_process_switch(void *curr_sp) @@ -65,7 +66,7 @@ void *sched_process_switch(void *curr_sp) while (true) { nextproc = nextproc->next; - if (nextproc->state == PROC_QUEUE) { + if (nextproc->state == PROC_QUEUE || nextproc->state == PROC_READY) { _current_process->state = PROC_QUEUE; nextproc->state = PROC_READY; _current_process = nextproc;