1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/cpu/msp430-common/cpu.c

84 lines
2.1 KiB
C
Raw Normal View History

/******************************************************************************
Copyright (C) 2013, Freie Universitaet Berlin (FUB). All rights reserved.
These sources were developed at the Freie Universitaet Berlin, Computer Systems
and Telematics group (http://cst.mi.fu-berlin.de).
-------------------------------------------------------------------------------
This file is part of RIOT.
This file is subject to the terms and conditions of the LGPLv2.
See the file LICENSE in the top level directory for more details.
*******************************************************************************/
#include "cpu.h"
#include "kernel.h"
#include "kernel_internal.h"
2010-10-28 11:22:57 +02:00
#include "sched.h"
volatile int __inISR = 0;
char __isr_stack[MSP430_ISR_STACK_SIZE];
void thread_yield()
{
__save_context();
dINT();
2010-10-28 11:22:57 +02:00
/* have active_thread point to the next thread */
sched_run();
eINT();
__restore_context();
}
void cpu_switch_context_exit(void)
{
2010-10-28 11:22:57 +02:00
active_thread = sched_threads[0];
sched_run();
__restore_context();
}
/**
* mspgcc handles main specially - it does not return but falls
* through to section .fini9.
* To "fix" this, we put a return in section .fini9 to make main
* behave like a regular function. This enables a common
* thread_stack_init behavior. */
__attribute__((section (".fini9"))) void __main_epilogue(void) { __asm__("ret"); }
//----------------------------------------------------------------------------
// Processor specific routine - here for MSP
//----------------------------------------------------------------------------
char *thread_stack_init(void (*task_func)(void), void *stack_start, int stack_size)
{
unsigned short *stk;
stk = (unsigned short *)(stack_start + stack_size);
2010-10-28 11:22:57 +02:00
*stk = (unsigned short) sched_task_exit;
--stk;
*stk = (unsigned short) task_func;
--stk;
/* initial value for SR */
*stk = GIE;
--stk;
/* Space for registers. */
for (unsigned int i = 15; i > 4; i--) {
*stk = i;
--stk;
}
//stk -= 11;
return (char *) stk;
}
int inISR()
{
return __inISR;
}