Port ARM common files to SH-1
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1141 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
c07fd1e011
commit
bfd069ad6f
82
arch/sh/src/common/up_allocateheap.c
Normal file
82
arch/sh/src/common/up_allocateheap.c
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_allocateheap.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_allocate_heap
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The heap may be statically allocated by
|
||||||
|
* defining CONFIG_HEAP_BASE and CONFIG_HEAP_SIZE. If these
|
||||||
|
* are not defined, then this function will be called to
|
||||||
|
* dynamically set aside the heap region.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_allocate_heap(FAR void **heap_start, size_t *heap_size)
|
||||||
|
{
|
||||||
|
up_ledon(LED_HEAPALLOCATE);
|
||||||
|
*heap_start = (FAR void*)g_heapbase;
|
||||||
|
*heap_size = CONFIG_DRAM_END - g_heapbase;
|
||||||
|
}
|
314
arch/sh/src/common/up_assert.c
Normal file
314
arch/sh/src/common/up_assert.c
Normal file
@ -0,0 +1,314 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_assert.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Output debug info if stack dump is selected -- even if
|
||||||
|
* debug is not selected.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
# undef lldbg
|
||||||
|
# define lldbg lib_lowprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_getsp
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: getsp
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static inline uint32 up_getsp(void)
|
||||||
|
{
|
||||||
|
uint32 sp;
|
||||||
|
|
||||||
|
__asm__ __volatile__
|
||||||
|
(
|
||||||
|
"mov r15, %0\n\t"
|
||||||
|
: "=&z" (sp)
|
||||||
|
:
|
||||||
|
: "memory"
|
||||||
|
);
|
||||||
|
return sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_stackdump
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
static void up_stackdump(uint32 sp, uint32 stack_base)
|
||||||
|
{
|
||||||
|
uint32 stack ;
|
||||||
|
|
||||||
|
for (stack = sp & ~0x1f; stack < stack_base; stack += 32)
|
||||||
|
{
|
||||||
|
uint32 *ptr = (uint32*)stack;
|
||||||
|
lldbg("%08x: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||||
|
stack, ptr[0], ptr[1], ptr[2], ptr[3],
|
||||||
|
ptr[4], ptr[5], ptr[6], ptr[7]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_stackdump()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_registerdump
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
static inline void up_registerdump(void)
|
||||||
|
{
|
||||||
|
/* Are user registers available from interrupt processing? */
|
||||||
|
|
||||||
|
if (current_regs)
|
||||||
|
{
|
||||||
|
int regs;
|
||||||
|
|
||||||
|
/* Yes.. dump the interrupt registers */
|
||||||
|
|
||||||
|
for (regs = REG_R0; regs <= REG_R15; regs += 8)
|
||||||
|
{
|
||||||
|
uint32 *ptr = (uint32*)¤t_regs[regs];
|
||||||
|
lldbg("R%d: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||||
|
regs, ptr[0], ptr[1], ptr[2], ptr[3],
|
||||||
|
ptr[4], ptr[5], ptr[6], ptr[7]);
|
||||||
|
}
|
||||||
|
lldbg("SR: %08x\n", current_regs[REG_SR]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_registerdump()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_dumpstate
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
static void up_dumpstate(void)
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
uint32 sp = up_getsp();
|
||||||
|
uint32 ustackbase;
|
||||||
|
uint32 ustacksize;
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
|
uint32 istackbase;
|
||||||
|
uint32 istacksize;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get the limits on the user stack memory */
|
||||||
|
|
||||||
|
if (rtcb->pid == 0)
|
||||||
|
{
|
||||||
|
ustackbase = g_heapbase - 4;
|
||||||
|
ustacksize = CONFIG_PROC_STACK_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ustackbase = (uint32)rtcb->adj_stack_ptr;
|
||||||
|
ustacksize = (uint32)rtcb->adj_stack_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the limits on the interrupt stack memory */
|
||||||
|
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
|
istackbase = (uint32)&g_userstack;
|
||||||
|
istacksize = (CONFIG_ARCH_INTERRUPTSTACK & ~3) - 4;
|
||||||
|
|
||||||
|
/* Show interrupt stack info */
|
||||||
|
|
||||||
|
lldbg("sp: %08x\n", sp);
|
||||||
|
lldbg("IRQ stack:\n");
|
||||||
|
lldbg(" base: %08x\n", istackbase);
|
||||||
|
lldbg(" size: %08x\n", istacksize);
|
||||||
|
|
||||||
|
/* Does the current stack pointer lie within the interrupt
|
||||||
|
* stack?
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (sp <= istackbase && sp > istackbase - istacksize)
|
||||||
|
{
|
||||||
|
/* Yes.. dump the interrupt stack */
|
||||||
|
|
||||||
|
up_stackdump(sp, istackbase);
|
||||||
|
|
||||||
|
/* Extract the user stack pointer which should lie
|
||||||
|
* at the base of the interrupt stack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sp = g_userstack;
|
||||||
|
lldbg("sp: %08x\n", sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show user stack info */
|
||||||
|
|
||||||
|
lldbg("User stack:\n");
|
||||||
|
lldbg(" base: %08x\n", ustackbase);
|
||||||
|
lldbg(" size: %08x\n", ustacksize);
|
||||||
|
#else
|
||||||
|
lldbg("sp: %08x\n", sp);
|
||||||
|
lldbg("stack base: %08x\n", ustackbase);
|
||||||
|
lldbg("stack size: %08x\n", ustacksize);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Dump the user stack if the stack pointer lies within the allocated user
|
||||||
|
* stack memory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (sp > ustackbase || sp <= ustackbase - ustacksize)
|
||||||
|
{
|
||||||
|
#if !defined(CONFIG_ARCH_INTERRUPTSTACK) || CONFIG_ARCH_INTERRUPTSTACK < 4
|
||||||
|
lldbg("ERROR: Stack pointer is not within allocated stack\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
up_stackdump(sp, ustackbase);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then dump the registers (if available) */
|
||||||
|
|
||||||
|
up_registerdump();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_dumpstate()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: _up_assert
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void _up_assert(int errorcode) /* __attribute__ ((noreturn)) */
|
||||||
|
{
|
||||||
|
/* Are we in an interrupt handler or the idle task? */
|
||||||
|
|
||||||
|
if (current_regs || ((_TCB*)g_readytorun.head)->pid == 0)
|
||||||
|
{
|
||||||
|
(void)irqsave();
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
|
up_ledon(LED_PANIC);
|
||||||
|
up_mdelay(250);
|
||||||
|
up_ledoff(LED_PANIC);
|
||||||
|
up_mdelay(250);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exit(errorcode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_assert
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_assert(const ubyte *filename, int lineno)
|
||||||
|
{
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0 && defined(CONFIG_DEBUG)
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
up_ledon(LED_ASSERTION);
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0
|
||||||
|
lldbg("Assertion failed at file:%s line: %d task: %s\n",
|
||||||
|
filename, lineno, rtcb->name);
|
||||||
|
#else
|
||||||
|
lldbg("Assertion failed at file:%s line: %d\n",
|
||||||
|
filename, lineno);
|
||||||
|
#endif
|
||||||
|
up_dumpstate();
|
||||||
|
_up_assert(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_assert_code
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_assert_code(const ubyte *filename, int lineno, int errorcode)
|
||||||
|
{
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0 && defined(CONFIG_DEBUG)
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
up_ledon(LED_ASSERTION);
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0
|
||||||
|
lldbg("Assertion failed at file:%s line: %d task: %s error code: %d\n",
|
||||||
|
filename, lineno, rtcb->name, errorcode);
|
||||||
|
#else
|
||||||
|
lldbg("Assertion failed at file:%s line: %d error code: %d\n",
|
||||||
|
filename, lineno, errorcode);
|
||||||
|
#endif
|
||||||
|
up_dumpstate();
|
||||||
|
_up_assert(errorcode);
|
||||||
|
}
|
164
arch/sh/src/common/up_blocktask.c
Normal file
164
arch/sh/src/common/up_blocktask.c
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_blocktask.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_block_task
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The currently executing task at the head of
|
||||||
|
* the ready to run list must be stopped. Save its context
|
||||||
|
* and move it to the inactive list specified by task_state.
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* tcb: Refers to a task in the ready-to-run list (normally
|
||||||
|
* the task at the the head of the list). It most be
|
||||||
|
* stopped, its context saved and moved into one of the
|
||||||
|
* waiting task lists. It it was the task at the head
|
||||||
|
* of the ready-to-run list, then a context to the new
|
||||||
|
* ready to run task must be performed.
|
||||||
|
* task_state: Specifies which waiting task list should be
|
||||||
|
* hold the blocked task TCB.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_block_task(_TCB *tcb, tstate_t task_state)
|
||||||
|
{
|
||||||
|
/* Verify that the context switch can be performed */
|
||||||
|
|
||||||
|
if ((tcb->task_state < FIRST_READY_TO_RUN_STATE) ||
|
||||||
|
(tcb->task_state > LAST_READY_TO_RUN_STATE))
|
||||||
|
{
|
||||||
|
PANIC(OSERR_BADBLOCKSTATE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
boolean switch_needed;
|
||||||
|
|
||||||
|
/* Remove the tcb task from the ready-to-run list. If we
|
||||||
|
* are blocking the task at the head of the task list (the
|
||||||
|
* most likely case), then a context switch to the next
|
||||||
|
* ready-to-run task is needed. In this case, it should
|
||||||
|
* also be true that rtcb == tcb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_needed = sched_removereadytorun(tcb);
|
||||||
|
|
||||||
|
/* Add the task to the specified blocked task list */
|
||||||
|
|
||||||
|
sched_addblocked(tcb, (tstate_t)task_state);
|
||||||
|
|
||||||
|
/* If there are any pending tasks, then add them to the g_readytorun
|
||||||
|
* task list now
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (g_pendingtasks.head)
|
||||||
|
{
|
||||||
|
switch_needed |= sched_mergepending();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now, perform the context switch if one is needed */
|
||||||
|
|
||||||
|
if (switch_needed)
|
||||||
|
{
|
||||||
|
/* Are we in an interrupt handler? */
|
||||||
|
|
||||||
|
if (current_regs)
|
||||||
|
{
|
||||||
|
/* Yes, then we have to do things differently.
|
||||||
|
* Just copy the current_regs into the OLD rtcb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_copystate(rtcb->xcp.regs, current_regs);
|
||||||
|
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_copystate(current_regs, rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the user C context into the TCB at the (old) head of the
|
||||||
|
* g_readytorun Task list. if up_saveusercontext returns a non-zero
|
||||||
|
* value, then this is really the previously running task restarting!
|
||||||
|
*/
|
||||||
|
|
||||||
|
else if (!up_saveusercontext(rtcb->xcp.regs))
|
||||||
|
{
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_fullcontextrestore(rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
77
arch/sh/src/common/up_copystate.c
Normal file
77
arch/sh/src/common/up_copystate.c
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_copystate.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_undefinedinsn
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* A little faster than most memcpy's */
|
||||||
|
|
||||||
|
void up_copystate(uint32 *dest, uint32 *src)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < XCPTCONTEXT_REGS; i++)
|
||||||
|
{
|
||||||
|
*dest++ = *src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
131
arch/sh/src/common/up_createstack.c
Normal file
131
arch/sh/src/common/up_createstack.c
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_createstack.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Global Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_create_stack
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Allocate a stack for a new thread and setup
|
||||||
|
* up stack-related information in the TCB.
|
||||||
|
*
|
||||||
|
* The following TCB fields must be initialized:
|
||||||
|
* adj_stack_size: Stack size after adjustment for hardware,
|
||||||
|
* processor, etc. This value is retained only for debug
|
||||||
|
* purposes.
|
||||||
|
* stack_alloc_ptr: Pointer to allocated stack
|
||||||
|
* adj_stack_ptr: Adjusted stack_alloc_ptr for HW. The
|
||||||
|
* initial value of the stack pointer.
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* tcb: The TCB of new task
|
||||||
|
* stack_size: The requested stack size. At least this much
|
||||||
|
* must be allocated.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
STATUS up_create_stack(_TCB *tcb, size_t stack_size)
|
||||||
|
{
|
||||||
|
if (tcb->stack_alloc_ptr &&
|
||||||
|
tcb->adj_stack_size != stack_size)
|
||||||
|
{
|
||||||
|
sched_free(tcb->stack_alloc_ptr);
|
||||||
|
tcb->stack_alloc_ptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tcb->stack_alloc_ptr)
|
||||||
|
{
|
||||||
|
tcb->stack_alloc_ptr = (uint32 *)kzmalloc(stack_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcb->stack_alloc_ptr)
|
||||||
|
{
|
||||||
|
size_t top_of_stack;
|
||||||
|
size_t size_of_stack;
|
||||||
|
|
||||||
|
/* The Arm7Tdmi uses a push-down stack: the stack grows
|
||||||
|
* toward loweraddresses in memory. The stack pointer
|
||||||
|
* register, points to the lowest, valid work address
|
||||||
|
* (the "top" of the stack). Items on the stack are
|
||||||
|
* referenced as positive word offsets from sp.
|
||||||
|
*/
|
||||||
|
|
||||||
|
top_of_stack = (uint32)tcb->stack_alloc_ptr + stack_size - 4;
|
||||||
|
|
||||||
|
/* The Arm7Tdmi stack must be aligned at word (4 byte)
|
||||||
|
* boundaries. If necessary top_of_stack must be rounded
|
||||||
|
* down to the next boundary
|
||||||
|
*/
|
||||||
|
|
||||||
|
top_of_stack &= ~3;
|
||||||
|
size_of_stack = top_of_stack - (uint32)tcb->stack_alloc_ptr + 4;
|
||||||
|
|
||||||
|
/* Save the adjusted stack values in the _TCB */
|
||||||
|
|
||||||
|
tcb->adj_stack_ptr = (uint32*)top_of_stack;
|
||||||
|
tcb->adj_stack_size = size_of_stack;
|
||||||
|
|
||||||
|
up_ledon(LED_STACKCREATED);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERROR;
|
||||||
|
}
|
104
arch/sh/src/common/up_doirq.c
Normal file
104
arch/sh/src/common/up_doirq.c
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_doirq.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_doirq(int irq, uint32* regs)
|
||||||
|
{
|
||||||
|
up_ledon(LED_INIRQ);
|
||||||
|
#ifdef CONFIG_SUPPRESS_INTERRUPTS
|
||||||
|
PANIC(OSERR_ERREXCEPTION);
|
||||||
|
#else
|
||||||
|
if ((unsigned)irq < NR_IRQS)
|
||||||
|
{
|
||||||
|
/* Current regs non-zero indicates that we are processing
|
||||||
|
* an interrupt; current_regs is also used to manage
|
||||||
|
* interrupt level context switches.
|
||||||
|
*/
|
||||||
|
|
||||||
|
current_regs = regs;
|
||||||
|
|
||||||
|
/* Mask and acknowledge the interrupt */
|
||||||
|
|
||||||
|
up_maskack_irq(irq);
|
||||||
|
|
||||||
|
/* Deliver the IRQ */
|
||||||
|
|
||||||
|
irq_dispatch(irq, regs);
|
||||||
|
|
||||||
|
/* Indicate that we are no long in an interrupt handler */
|
||||||
|
|
||||||
|
current_regs = NULL;
|
||||||
|
|
||||||
|
/* Unmask the last interrupt (global interrupts are still
|
||||||
|
* disabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_enable_irq(irq);
|
||||||
|
}
|
||||||
|
up_ledoff(LED_INIRQ);
|
||||||
|
#endif
|
||||||
|
}
|
173
arch/sh/src/common/up_exit.c
Normal file
173
arch/sh/src/common/up_exit.c
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* common/up_exit.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_DUMP_ON_EXIT
|
||||||
|
#include <nuttx/fs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: _up_dumponexit
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Dump the state of all tasks whenever on task exits. This is debug
|
||||||
|
* instrumentation that was added to check file-related reference counting
|
||||||
|
* but could be useful again sometime in the future.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_DUMP_ON_EXIT) && defined(CONFIG_DEBUG)
|
||||||
|
static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg)
|
||||||
|
{
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0 || CONFIG_NFILE_STREAMS > 0
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sdbg(" TCB=%p name=%s\n", tcb, tcb->argv[0]);
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
|
if (tcb->filelist)
|
||||||
|
{
|
||||||
|
sdbg(" filelist refcount=%d\n",
|
||||||
|
tcb->filelist->fl_crefs);
|
||||||
|
|
||||||
|
for (i = 0; i < CONFIG_NFILE_DESCRIPTORS; i++)
|
||||||
|
{
|
||||||
|
struct inode *inode = tcb->filelist->fl_files[i].f_inode;
|
||||||
|
if (inode)
|
||||||
|
{
|
||||||
|
sdbg(" fd=%d refcount=%d\n",
|
||||||
|
i, inode->i_crefs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_STREAMS > 0
|
||||||
|
if (tcb->streams)
|
||||||
|
{
|
||||||
|
sdbg(" streamlist refcount=%d\n",
|
||||||
|
tcb->streams->sl_crefs);
|
||||||
|
|
||||||
|
for (i = 0; i < CONFIG_NFILE_STREAMS; i++)
|
||||||
|
{
|
||||||
|
struct file_struct *filep = &tcb->streams->sl_streams[i];
|
||||||
|
if (filep->fs_filedes >= 0)
|
||||||
|
{
|
||||||
|
#if CONFIG_STDIO_BUFFER_SIZE > 0
|
||||||
|
sdbg(" fd=%d nbytes=%d\n",
|
||||||
|
filep->fs_filedes,
|
||||||
|
filep->fs_bufpos - filep->fs_bufstart);
|
||||||
|
#else
|
||||||
|
sdbg(" fd=%d\n", filep->fs_filedes);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: _exit
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function causes the currently executing task to cease
|
||||||
|
* to exist. This is a special case of task_delete() where the task to
|
||||||
|
* be deleted is the currently executing task. It is more complex because
|
||||||
|
* a context switch must be perform to the the next ready to run task.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void _exit(int status)
|
||||||
|
{
|
||||||
|
_TCB* tcb;
|
||||||
|
|
||||||
|
/* Disable interrupts. They will be restored when the next
|
||||||
|
* task is started.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(void)irqsave();
|
||||||
|
|
||||||
|
slldbg("TCB=%p exitting\n", tcb);
|
||||||
|
|
||||||
|
#if defined(CONFIG_DUMP_ON_EXIT) && defined(CONFIG_DEBUG)
|
||||||
|
slldbg("Other tasks:\n");
|
||||||
|
sched_foreach(_up_dumponexit, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Destroy the task at the head of the ready to run list. */
|
||||||
|
|
||||||
|
(void)task_deletecurrent();
|
||||||
|
|
||||||
|
/* Now, perform the context switch to the new ready-to-run task at the
|
||||||
|
* head of the list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb = (_TCB*)g_readytorun.head;
|
||||||
|
slldbg("New Active Task TCB=%p\n", tcb);
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_fullcontextrestore(tcb->xcp.regs);
|
||||||
|
}
|
||||||
|
|
87
arch/sh/src/common/up_idle.c
Normal file
87
arch/sh/src/common/up_idle.c
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_idle.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_idle
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* up_idle() is the logic that will be executed when their
|
||||||
|
* is no other ready-to-run task. This is processor idle
|
||||||
|
* time and will continue until some interrupt occurs to
|
||||||
|
* cause a context switch from the idle task.
|
||||||
|
*
|
||||||
|
* Processing in this state may be processor-specific. e.g.,
|
||||||
|
* this is where power management operations might be
|
||||||
|
* performed.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_idle(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_SUPPRESS_INTERRUPTS) || defined(CONFIG_SUPPRESS_TIMER_INTS)
|
||||||
|
/* If the system is idle and there are no timer interrupts,
|
||||||
|
* then process "fake" timer interrupts. Hopefully, something
|
||||||
|
* will wake up.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sched_process_timer();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
156
arch/sh/src/common/up_initialize.c
Normal file
156
arch/sh/src/common/up_initialize.c
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_initialize.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/fs.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Define to enable timing loop calibration */
|
||||||
|
|
||||||
|
#undef CONFIG_ARCH_CALIBRATION
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_calibratedelay
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Delay loops are provided for short timing loops. This function, if
|
||||||
|
* enabled, will just wait for 100 seconds. Using a stopwatch, you can
|
||||||
|
* can then determine if the timing loops are properly calibrated.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_CALIBRATION) & defined(CONFIG_DEBUG)
|
||||||
|
static void up_calibratedelay(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
slldbg("Beginning 100s delay\n");
|
||||||
|
for (i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
up_mdelay(1000);
|
||||||
|
}
|
||||||
|
slldbg("End 100s delay\n");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_calibratedelay()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* up_initialize will be called once during OS initialization after the
|
||||||
|
* basic OS services have been initialized. The architecture specific
|
||||||
|
* details of initializing the OS will be handled here. Such things as
|
||||||
|
* setting up interrupt service routines, starting the clock, and
|
||||||
|
* registering device drivers are some of the things that are different
|
||||||
|
* for each processor and hardware platform.
|
||||||
|
*
|
||||||
|
* up_initialize is called after the OS initialized but before the user
|
||||||
|
* initialization logic has been started and before the libraries have
|
||||||
|
* been initialized. OS services and driver services are available.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_initialize(void)
|
||||||
|
{
|
||||||
|
/* Initialize global variables */
|
||||||
|
|
||||||
|
current_regs = NULL;
|
||||||
|
|
||||||
|
/* Calibrate the timing loop */
|
||||||
|
|
||||||
|
up_calibratedelay();
|
||||||
|
|
||||||
|
/* Initialize the interrupt subsystem */
|
||||||
|
|
||||||
|
up_irqinitialize();
|
||||||
|
|
||||||
|
/* Initialize the system timer interrupt */
|
||||||
|
|
||||||
|
#if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS)
|
||||||
|
up_timerinit();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Register devices */
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
|
devnull_register(); /* Standard /dev/null */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialize the serial device driver */
|
||||||
|
|
||||||
|
#ifdef CONFIG_USE_SERIALDRIVER
|
||||||
|
up_serialinit();
|
||||||
|
#elif defined(CONFIG_DEV_LOWCONSOLE)
|
||||||
|
lowconsole_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialize the netwok */
|
||||||
|
|
||||||
|
up_netinitialize();
|
||||||
|
|
||||||
|
/* Initializ USB */
|
||||||
|
|
||||||
|
up_usbinitialize();
|
||||||
|
|
||||||
|
up_ledon(LED_IRQSENABLED);
|
||||||
|
}
|
109
arch/sh/src/common/up_initialstate.c
Normal file
109
arch/sh/src/common/up_initialstate.c
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_initialstate.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_getsr
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static inline irqstate_t up_getsr(void)
|
||||||
|
{
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
__asm__ __volatile__
|
||||||
|
(
|
||||||
|
"stc sr, %0\n\t"
|
||||||
|
: "=&z" (flags)
|
||||||
|
:
|
||||||
|
: "memory"
|
||||||
|
);
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_initial_state
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* A new thread is being started and a new TCB
|
||||||
|
* has been created. This function is called to initialize
|
||||||
|
* the processor specific portions of the new TCB.
|
||||||
|
*
|
||||||
|
* This function must setup the intial architecture registers
|
||||||
|
* and/or stack so that execution will begin at tcb->start
|
||||||
|
* on the next context switch.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_initial_state(_TCB *tcb)
|
||||||
|
{
|
||||||
|
struct xcptcontext *xcp = &tcb->xcp;
|
||||||
|
|
||||||
|
/* Initialize the initial exception register context structure */
|
||||||
|
|
||||||
|
memset(xcp, 0, sizeof(struct xcptcontext));
|
||||||
|
xcp->regs[REG_SP] = (uint32)tcb->adj_stack_ptr;
|
||||||
|
xcp->regs[REG_PC] = (uint32)tcb->start;
|
||||||
|
#ifdef CONFIG_SUPPRESS_INTERRUPTS
|
||||||
|
xcp->regs[REG_SR] = up_getsr() | 0x000000f0;
|
||||||
|
#else
|
||||||
|
xcp->regs[REG_SR] = up_getsr() & ~0x000000f0;
|
||||||
|
#endif
|
||||||
|
}
|
68
arch/sh/src/common/up_interruptcontext.c
Normal file
68
arch/sh/src/common/up_interruptcontext.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_interruptcontext.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Global Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_interrupt_context
|
||||||
|
*
|
||||||
|
* Description: Return TRUE is we are currently executing in
|
||||||
|
* the interrupt handler context.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
boolean up_interrupt_context(void)
|
||||||
|
{
|
||||||
|
return current_regs != NULL;
|
||||||
|
}
|
75
arch/sh/src/common/up_lowputs.c
Normal file
75
arch/sh/src/common/up_lowputs.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_lowputs.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_lowputs
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This is a low-level helper function used to support debug.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_lowputs(const char *str)
|
||||||
|
{
|
||||||
|
while(*str)
|
||||||
|
{
|
||||||
|
up_lowputc(*str++);
|
||||||
|
}
|
||||||
|
}
|
90
arch/sh/src/common/up_mdelay.c
Normal file
90
arch/sh/src/common/up_mdelay.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_mdelay.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Variables
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_mdelay
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Delay inline for the requested number of milliseconds.
|
||||||
|
* *** NOT multi-tasking friendly ***
|
||||||
|
*
|
||||||
|
* ASSUMPTIONS:
|
||||||
|
* The setting CONFIG_BOARD_LOOPSPERMSEC has been calibrated
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_mdelay(unsigned int milliseconds)
|
||||||
|
{
|
||||||
|
volatile int i;
|
||||||
|
volatile int j;
|
||||||
|
|
||||||
|
for (i = 0; i < milliseconds; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < CONFIG_BOARD_LOOPSPERMSEC; j++)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
76
arch/sh/src/common/up_puts.c
Normal file
76
arch/sh/src/common/up_puts.c
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_puts.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_puts
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This is a low-level helper function used to support debug.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_puts(const char *str)
|
||||||
|
{
|
||||||
|
while(*str)
|
||||||
|
{
|
||||||
|
up_putc(*str++);
|
||||||
|
}
|
||||||
|
}
|
131
arch/sh/src/common/up_releasepending.c
Normal file
131
arch/sh/src/common/up_releasepending.c
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_releasepending.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_release_pending
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Release and ready-to-run tasks that have
|
||||||
|
* collected in the pending task list. This can call a
|
||||||
|
* context switch if a new task is placed at the head of
|
||||||
|
* the ready to run list.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_release_pending(void)
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
|
||||||
|
slldbg("From TCB=%p\n", rtcb);
|
||||||
|
|
||||||
|
/* Merge the g_pendingtasks list into the g_readytorun task list */
|
||||||
|
|
||||||
|
/* sched_lock(); */
|
||||||
|
if (sched_mergepending())
|
||||||
|
{
|
||||||
|
/* The currently active task has changed! We will need to
|
||||||
|
* switch contexts. First check if we are operating in
|
||||||
|
* interrupt context:
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (current_regs)
|
||||||
|
{
|
||||||
|
/* Yes, then we have to do things differently.
|
||||||
|
* Just copy the current_regs into the OLD rtcb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_copystate(rtcb->xcp.regs, current_regs);
|
||||||
|
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
slldbg("New Active Task TCB=%p\n", rtcb);
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_copystate(current_regs, rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the exception context into the TCB of the task that
|
||||||
|
* was currently active. if up_saveusercontext returns a non-zero
|
||||||
|
* value, then this is really the previously running task
|
||||||
|
* restarting!
|
||||||
|
*/
|
||||||
|
|
||||||
|
else if (!up_saveusercontext(rtcb->xcp.regs))
|
||||||
|
{
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
slldbg("New Active Task TCB=%p\n", rtcb);
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_fullcontextrestore(rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
78
arch/sh/src/common/up_releasestack.c
Normal file
78
arch/sh/src/common/up_releasestack.c
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_releasestack.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Global Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_release_stack
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* A task has been stopped. Free all stack
|
||||||
|
* related resources retained int the defunct TCB.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_release_stack(_TCB *dtcb)
|
||||||
|
{
|
||||||
|
if (dtcb->stack_alloc_ptr)
|
||||||
|
{
|
||||||
|
sched_free(dtcb->stack_alloc_ptr);
|
||||||
|
dtcb->stack_alloc_ptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dtcb->adj_stack_size = 0;
|
||||||
|
}
|
179
arch/sh/src/common/up_reprioritizertr.c
Normal file
179
arch/sh/src/common/up_reprioritizertr.c
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_reprioritizertr.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_reprioritize_rtr
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called when the priority of a running or
|
||||||
|
* ready-to-run task changes and the reprioritization will
|
||||||
|
* cause a context switch. Two cases:
|
||||||
|
*
|
||||||
|
* 1) The priority of the currently running task drops and the next
|
||||||
|
* task in the ready to run list has priority.
|
||||||
|
* 2) An idle, ready to run task's priority has been raised above the
|
||||||
|
* the priority of the current, running task and it now has the
|
||||||
|
* priority.
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* tcb: The TCB of the task that has been reprioritized
|
||||||
|
* priority: The new task priority
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_reprioritize_rtr(_TCB *tcb, ubyte priority)
|
||||||
|
{
|
||||||
|
/* Verify that the caller is sane */
|
||||||
|
|
||||||
|
if (tcb->task_state < FIRST_READY_TO_RUN_STATE ||
|
||||||
|
tcb->task_state > LAST_READY_TO_RUN_STATE ||
|
||||||
|
priority < SCHED_PRIORITY_MIN ||
|
||||||
|
priority > SCHED_PRIORITY_MAX)
|
||||||
|
{
|
||||||
|
PANIC(OSERR_BADREPRIORITIZESTATE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
boolean switch_needed;
|
||||||
|
|
||||||
|
slldbg("TCB=%p PRI=%d\n", tcb, priority);
|
||||||
|
|
||||||
|
/* Remove the tcb task from the ready-to-run list.
|
||||||
|
* sched_removereadytorun will return TRUE if we just
|
||||||
|
* remove the head of the ready to run list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_needed = sched_removereadytorun(tcb);
|
||||||
|
|
||||||
|
/* Setup up the new task priority */
|
||||||
|
|
||||||
|
tcb->sched_priority = (ubyte)priority;
|
||||||
|
|
||||||
|
/* Return the task to the specified blocked task list.
|
||||||
|
* sched_addreadytorun will return TRUE if the task was
|
||||||
|
* added to the new list. We will need to perform a context
|
||||||
|
* switch only if the EXCLUSIVE or of the two calls is non-zero
|
||||||
|
* (i.e., one and only one the calls changes the head of the
|
||||||
|
* ready-to-run list).
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_needed ^= sched_addreadytorun(tcb);
|
||||||
|
|
||||||
|
/* Now, perform the context switch if one is needed */
|
||||||
|
|
||||||
|
if (switch_needed)
|
||||||
|
{
|
||||||
|
/* If we are going to do a context switch, then now is the right
|
||||||
|
* time to add any pending tasks back into the ready-to-run list.
|
||||||
|
* task list now
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (g_pendingtasks.head)
|
||||||
|
{
|
||||||
|
sched_mergepending();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Are we in an interrupt handler? */
|
||||||
|
|
||||||
|
if (current_regs)
|
||||||
|
{
|
||||||
|
/* Yes, then we have to do things differently.
|
||||||
|
* Just copy the current_regs into the OLD rtcb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_copystate(rtcb->xcp.regs, current_regs);
|
||||||
|
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
slldbg("New Active Task TCB=%p\n", rtcb);
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_copystate(current_regs, rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the exception context into the TCB at the (old) head of the
|
||||||
|
* g_readytorun Task list. if up_saveusercontext returns a non-zero
|
||||||
|
* value, then this is really the previously running task restarting!
|
||||||
|
*/
|
||||||
|
|
||||||
|
else if (!up_saveusercontext(rtcb->xcp.regs))
|
||||||
|
{
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
slldbg("New Active Task TCB=%p\n", rtcb);
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_fullcontextrestore(rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
197
arch/sh/src/common/up_schedulesigaction.c
Normal file
197
arch/sh/src/common/up_schedulesigaction.c
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* common/up_schedulesigaction.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Funictions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_schedule_sigaction
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function is called by the OS when one or more
|
||||||
|
* signal handling actions have been queued for execution.
|
||||||
|
* The architecture specific code must configure things so
|
||||||
|
* that the 'igdeliver' callback is executed on the thread
|
||||||
|
* specified by 'tcb' as soon as possible.
|
||||||
|
*
|
||||||
|
* This function may be called from interrupt handling logic.
|
||||||
|
*
|
||||||
|
* This operation should not cause the task to be unblocked
|
||||||
|
* nor should it cause any immediate execution of sigdeliver.
|
||||||
|
* Typically, a few cases need to be considered:
|
||||||
|
*
|
||||||
|
* (1) This function may be called from an interrupt handler
|
||||||
|
* During interrupt processing, all xcptcontext structures
|
||||||
|
* should be valid for all tasks. That structure should
|
||||||
|
* be modified to invoke sigdeliver() either on return
|
||||||
|
* from (this) interrupt or on some subsequent context
|
||||||
|
* switch to the recipient task.
|
||||||
|
* (2) If not in an interrupt handler and the tcb is NOT
|
||||||
|
* the currently executing task, then again just modify
|
||||||
|
* the saved xcptcontext structure for the recipient
|
||||||
|
* task so it will invoke sigdeliver when that task is
|
||||||
|
* later resumed.
|
||||||
|
* (3) If not in an interrupt handler and the tcb IS the
|
||||||
|
* currently executing task -- just call the signal
|
||||||
|
* handler now.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
||||||
|
{
|
||||||
|
/* Refuse to handle nested signal actions */
|
||||||
|
|
||||||
|
sdbg("tcb=0x%p sigdeliver=0x%p\n", tcb, sigdeliver);
|
||||||
|
|
||||||
|
if (!tcb->xcp.sigdeliver)
|
||||||
|
{
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
/* Make sure that interrupts are disabled */
|
||||||
|
|
||||||
|
flags = irqsave();
|
||||||
|
|
||||||
|
/* First, handle some special cases when the signal is
|
||||||
|
* being delivered to the currently executing task.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sdbg("rtcb=0x%p current_regs=0x%p\n", g_readytorun.head, current_regs);
|
||||||
|
|
||||||
|
if (tcb == (_TCB*)g_readytorun.head)
|
||||||
|
{
|
||||||
|
/* CASE 1: We are not in an interrupt handler and
|
||||||
|
* a task is signalling itself for some reason.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!current_regs)
|
||||||
|
{
|
||||||
|
/* In this case just deliver the signal now. */
|
||||||
|
|
||||||
|
sigdeliver(tcb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CASE 2: We are in an interrupt handler AND the
|
||||||
|
* interrupted task is the same as the one that
|
||||||
|
* must receive the signal, then we will have to modify
|
||||||
|
* the return state as well as the state in the TCB.
|
||||||
|
*/
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Save the return PC and SR and one scratch register
|
||||||
|
* These will be restored by the signal trampoline after
|
||||||
|
* the signals have been delivered.
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
|
tcb->xcp.saved_pc = current_regs[REG_PC];
|
||||||
|
tcb->xcp.saved_sr = current_regs[REG_SR];
|
||||||
|
|
||||||
|
/* Then set up to vector to the trampoline with interrupts
|
||||||
|
* disabled
|
||||||
|
*/
|
||||||
|
|
||||||
|
current_regs[REG_PC] = (uint32)up_sigdeliver;
|
||||||
|
current_regs[REG_SR] |= 0x000000f0;
|
||||||
|
|
||||||
|
/* And make sure that the saved context in the TCB
|
||||||
|
* is the same as the interrupt return context.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_copystate(tcb->xcp.regs, current_regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, we are (1) signaling a task is not running
|
||||||
|
* from an interrupt handler or (2) we are not in an
|
||||||
|
* interrupt handler and the running task is signalling
|
||||||
|
* some non-running task.
|
||||||
|
*/
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Save the return PC and SR and one scratch register
|
||||||
|
* These will be restored by the signal trampoline after
|
||||||
|
* the signals have been delivered.
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
|
tcb->xcp.saved_pc = tcb->xcp.regs[REG_PC];
|
||||||
|
tcb->xcp.saved_sr = tcb->xcp.regs[REG_SR];
|
||||||
|
|
||||||
|
/* Then set up to vector to the trampoline with interrupts
|
||||||
|
* disabled
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb->xcp.regs[REG_PC] = (uint32)up_sigdeliver;
|
||||||
|
tcb->xcp.regs[REG_SR] |= 0x000000f0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
irqrestore(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CONFIG_DISABLE_SIGNALS */
|
145
arch/sh/src/common/up_sigdeliver.c
Normal file
145
arch/sh/src/common/up_sigdeliver.c
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* common/up_sigdeliver.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_sigdeliver
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This is the a signal handling trampoline. When a
|
||||||
|
* signal action was posted. The task context was mucked
|
||||||
|
* with and forced to branch to this location with interrupts
|
||||||
|
* disabled.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_sigdeliver(void)
|
||||||
|
{
|
||||||
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
uint32 regs[XCPTCONTEXT_REGS];
|
||||||
|
sig_deliver_t sigdeliver;
|
||||||
|
|
||||||
|
/* Save the errno. This must be preserved throughout the
|
||||||
|
* signal handling so that the the user code final gets
|
||||||
|
* the correct errno value (probably EINTR).
|
||||||
|
*/
|
||||||
|
|
||||||
|
int saved_errno = rtcb->pterrno;
|
||||||
|
|
||||||
|
up_ledon(LED_SIGNAL);
|
||||||
|
|
||||||
|
sdbg("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n",
|
||||||
|
rtcb, rtcb->xcp.sigdeliver, rtcb->sigpendactionq.head);
|
||||||
|
ASSERT(rtcb->xcp.sigdeliver != NULL);
|
||||||
|
|
||||||
|
/* Save the real return state on the stack. */
|
||||||
|
|
||||||
|
up_copystate(regs, rtcb->xcp.regs);
|
||||||
|
regs[REG_PC] = rtcb->xcp.saved_pc;
|
||||||
|
regs[REG_SR] = rtcb->xcp.saved_sr;
|
||||||
|
|
||||||
|
/* Get a local copy of the sigdeliver function pointer.
|
||||||
|
* we do this so that we can nullify the sigdeliver
|
||||||
|
* function point in the TCB and accept more signal
|
||||||
|
* deliveries while processing the current pending
|
||||||
|
* signals.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sigdeliver = rtcb->xcp.sigdeliver;
|
||||||
|
rtcb->xcp.sigdeliver = NULL;
|
||||||
|
|
||||||
|
/* Then restore the task interrupt statat. */
|
||||||
|
|
||||||
|
irqrestore(regs[REG_SR] & 0x000000f0);
|
||||||
|
|
||||||
|
/* Deliver the signals */
|
||||||
|
|
||||||
|
sigdeliver(rtcb);
|
||||||
|
|
||||||
|
/* Output any debug messaged BEFORE restoreing errno
|
||||||
|
* (becuase they may alter errno), then restore the
|
||||||
|
* original errno that is needed by the user logic
|
||||||
|
* (it is probably EINTR).
|
||||||
|
*/
|
||||||
|
|
||||||
|
sdbg("Resuming\n");
|
||||||
|
rtcb->pterrno = saved_errno;
|
||||||
|
|
||||||
|
/* Then restore the correct state for this thread of
|
||||||
|
* execution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_ledoff(LED_SIGNAL);
|
||||||
|
up_fullcontextrestore(regs);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CONFIG_DISABLE_SIGNALS */
|
||||||
|
|
128
arch/sh/src/common/up_udelay.c
Normal file
128
arch/sh/src/common/up_udelay.c
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_udelay.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define CONFIG_BOARD_LOOPSPER100USEC ((CONFIG_BOARD_LOOPSPERMSEC+5)/10)
|
||||||
|
#define CONFIG_BOARD_LOOPSPER10USEC ((CONFIG_BOARD_LOOPSPERMSEC+50)/100)
|
||||||
|
#define CONFIG_BOARD_LOOPSPERUSEC ((CONFIG_BOARD_LOOPSPERMSEC+500)/1000)
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Variables
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_udelay
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Delay inline for the requested number of microseconds. NOTE: Because
|
||||||
|
* of all of the setup, several microseconds will be lost before the actual
|
||||||
|
* timing looop begins. Thus, the delay will always be a few microseconds
|
||||||
|
* longer than requested.
|
||||||
|
*
|
||||||
|
* *** NOT multi-tasking friendly ***
|
||||||
|
*
|
||||||
|
* ASSUMPTIONS:
|
||||||
|
* The setting CONFIG_BOARD_LOOPSPERMSEC has been calibrated
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_udelay(unsigned int microseconds)
|
||||||
|
{
|
||||||
|
volatile int i;
|
||||||
|
|
||||||
|
/* We'll do this a little at a time because we expect that the
|
||||||
|
* CONFIG_BOARD_LOOPSPERUSEC is very inaccurate during to truncation in
|
||||||
|
* the divisions of its calculation. We'll use the largest values that
|
||||||
|
* we can in order to prevent significant error buildup in the loops.
|
||||||
|
*/
|
||||||
|
|
||||||
|
while (microseconds > 1000)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_BOARD_LOOPSPERMSEC; i++)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
microseconds -= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (microseconds > 100)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_BOARD_LOOPSPER100USEC; i++)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
microseconds -= 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (microseconds > 10)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_BOARD_LOOPSPER10USEC; i++)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
microseconds -= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (microseconds > 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_BOARD_LOOPSPERUSEC; i++)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
microseconds--;
|
||||||
|
}
|
||||||
|
}
|
158
arch/sh/src/common/up_unblocktask.c
Normal file
158
arch/sh/src/common/up_unblocktask.c
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_unblocktask.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "clock_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_unblock_task
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* A task is currently in an inactive task list
|
||||||
|
* but has been prepped to execute. Move the TCB to the
|
||||||
|
* ready-to-run list, restore its context, and start execution.
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* tcb: Refers to the tcb to be unblocked. This tcb is
|
||||||
|
* in one of the waiting tasks lists. It must be moved to
|
||||||
|
* the ready-to-run list and, if it is the highest priority
|
||||||
|
* ready to run taks, executed.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_unblock_task(_TCB *tcb)
|
||||||
|
{
|
||||||
|
/* Verify that the context switch can be performed */
|
||||||
|
|
||||||
|
if ((tcb->task_state < FIRST_BLOCKED_STATE) ||
|
||||||
|
(tcb->task_state > LAST_BLOCKED_STATE))
|
||||||
|
{
|
||||||
|
PANIC(OSERR_BADUNBLOCKSTATE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
|
||||||
|
/* Remove the task from the blocked task list */
|
||||||
|
|
||||||
|
sched_removeblocked(tcb);
|
||||||
|
|
||||||
|
/* Reset its timeslice. This is only meaningful for round
|
||||||
|
* robin tasks but it doesn't here to do it for everything
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if CONFIG_RR_INTERVAL > 0
|
||||||
|
tcb->timeslice = CONFIG_RR_INTERVAL / MSEC_PER_TICK;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Add the task in the correct location in the prioritized
|
||||||
|
* g_readytorun task list
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (sched_addreadytorun(tcb))
|
||||||
|
{
|
||||||
|
/* The currently active task has changed! We need to do
|
||||||
|
* a context switch to the new task.
|
||||||
|
*
|
||||||
|
* Are we in an interrupt handler?
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (current_regs)
|
||||||
|
{
|
||||||
|
/* Yes, then we have to do things differently.
|
||||||
|
* Just copy the current_regs into the OLD rtcb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_copystate(rtcb->xcp.regs, current_regs);
|
||||||
|
|
||||||
|
/* Restore the exception context of the rtcb at the (new) head
|
||||||
|
* of the g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_copystate(current_regs, rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We are not in an interrupt handler. Copy the user C context
|
||||||
|
* into the TCB of the task that was previously active. if
|
||||||
|
* up_saveusercontext returns a non-zero value, then this is really the
|
||||||
|
* previously running task restarting!
|
||||||
|
*/
|
||||||
|
|
||||||
|
else if (!up_saveusercontext(rtcb->xcp.regs))
|
||||||
|
{
|
||||||
|
/* Restore the exception context of the new task that is ready to
|
||||||
|
* run (probably tcb). This is the new rtcb at the head of the
|
||||||
|
* g_readytorun task list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
|
||||||
|
/* Then switch contexts */
|
||||||
|
|
||||||
|
up_fullcontextrestore(rtcb->xcp.regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
118
arch/sh/src/common/up_usestack.c
Normal file
118
arch/sh/src/common/up_usestack.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/common/up_usestack.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Global Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_use_stack
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Setup up stack-related information in the TCB
|
||||||
|
* using pre-allocated stack memory
|
||||||
|
*
|
||||||
|
* The following TCB fields must be initialized:
|
||||||
|
* adj_stack_size: Stack size after adjustment for hardware,
|
||||||
|
* processor, etc. This value is retained only for debug
|
||||||
|
* purposes.
|
||||||
|
* stack_alloc_ptr: Pointer to allocated stack
|
||||||
|
* adj_stack_ptr: Adjusted stack_alloc_ptr for HW. The
|
||||||
|
* initial value of the stack pointer.
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* tcb: The TCB of new task
|
||||||
|
* stack_size: The allocated stack size.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
STATUS up_use_stack(_TCB *tcb, void *stack, size_t stack_size)
|
||||||
|
{
|
||||||
|
size_t top_of_stack;
|
||||||
|
size_t size_of_stack;
|
||||||
|
|
||||||
|
if (tcb->stack_alloc_ptr)
|
||||||
|
{
|
||||||
|
sched_free(tcb->stack_alloc_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save the stack allocation */
|
||||||
|
|
||||||
|
tcb->stack_alloc_ptr = stack;
|
||||||
|
|
||||||
|
/* The Arm7Tdmi uses a push-down stack: the stack grows
|
||||||
|
* toward loweraddresses in memory. The stack pointer
|
||||||
|
* register, points to the lowest, valid work address
|
||||||
|
* (the "top" of the stack). Items on the stack are
|
||||||
|
* referenced as positive word offsets from sp.
|
||||||
|
*/
|
||||||
|
|
||||||
|
top_of_stack = (uint32)tcb->stack_alloc_ptr + stack_size - 4;
|
||||||
|
|
||||||
|
/* The Arm7Tdmi stack must be aligned at word (4 byte)
|
||||||
|
* boundaries. If necessary top_of_stack must be rounded
|
||||||
|
* down to the next boundary
|
||||||
|
*/
|
||||||
|
|
||||||
|
top_of_stack &= ~3;
|
||||||
|
size_of_stack = top_of_stack - (uint32)tcb->stack_alloc_ptr + 4;
|
||||||
|
|
||||||
|
/* Save the adjusted stack values in the _TCB */
|
||||||
|
|
||||||
|
tcb->adj_stack_size = top_of_stack;
|
||||||
|
tcb->adj_stack_size = size_of_stack;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
@ -36,14 +36,18 @@
|
|||||||
HEAD_ASRC = sh1_head.S
|
HEAD_ASRC = sh1_head.S
|
||||||
|
|
||||||
CMN_ASRCS =
|
CMN_ASRCS =
|
||||||
CMN_CSRCS =
|
CMN_CSRCS = up_allocateheap.c up_assert.c up_blocktask.c up_copystate.c \
|
||||||
|
up_createstack.c up_doirq.c up_exit.c up_idle.c up_initialize.c \
|
||||||
|
up_initialstate.c up_interruptcontext.c up_lowputs.c \
|
||||||
|
up_mdelay.c up_puts.c up_releasepending.c up_releasestack.c \
|
||||||
|
up_reprioritizertr.c up_udelay.c up_unblocktask.c up_usestack.c
|
||||||
|
|
||||||
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
|
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
|
||||||
CMN_CSRCS +=
|
CMN_CSRCS += up_schedulesigaction.c up_sigdeliver.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CHIP_ASRCS =
|
CHIP_ASRCS =
|
||||||
CHIP_CSRCS = sh1_lowputc.c sh1_irq.c
|
CHIP_CSRCS = sh1_lowputc.c sh1_irq.c sh1_timerisr.c
|
||||||
|
|
||||||
ifeq ($(CONFIG_USBDEV),y)
|
ifeq ($(CONFIG_USBDEV),y)
|
||||||
CHIP_CSRCS +=
|
CHIP_CSRCS +=
|
||||||
|
@ -329,11 +329,11 @@ __start0:
|
|||||||
|
|
||||||
.data
|
.data
|
||||||
.align 4
|
.align 4
|
||||||
.globl g_heapbase
|
.globl _g_heapbase
|
||||||
.type g_heapbase, object
|
.type _g_heapbase, object
|
||||||
g_heapbase:
|
_g_heapbase:
|
||||||
.long _ebss+CONFIG_PROC_STACK_SIZE
|
.long _ebss+CONFIG_PROC_STACK_SIZE
|
||||||
.size g_heapbase, .-g_heapbase
|
.size _g_heapbase, .-_g_heapbase
|
||||||
|
|
||||||
.end
|
.end
|
||||||
|
|
||||||
|
@ -83,8 +83,7 @@ void up_irqinitialize(void)
|
|||||||
/* Enable interrupts */
|
/* Enable interrupts */
|
||||||
|
|
||||||
#ifndef CONFIG_SUPPRESS_INTERRUPTS
|
#ifndef CONFIG_SUPPRESS_INTERRUPTS
|
||||||
# warning "enable value needed"
|
irqenable();
|
||||||
irqrestore(0);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +135,7 @@ void up_maskack_irq(int irq)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#warning "Should this be supported?"
|
#warning "Should this be supported?"
|
||||||
int up_irqpriority(int irq, ubyte priority)
|
void up_irqpriority(int irq, ubyte priority)
|
||||||
{
|
{
|
||||||
#warning "To be provided"
|
#warning "To be provided"
|
||||||
}
|
}
|
||||||
|
117
arch/sh/src/sh1/sh1_timerisr.c
Normal file
117
arch/sh/src/sh1/sh1_timerisr.c
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sh/src/sh1/sh1_timerisr.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "clock_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#include "chip.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The desired timer interrupt frequency is provided by the definition
|
||||||
|
* CLK_TCK (see include/time.h). CLK_TCK defines the desired number of
|
||||||
|
* system clock ticks per second. That value is a user configurable setting
|
||||||
|
* that defaults to 100 (100 ticks per second = 10 MS interval).
|
||||||
|
*/
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Global Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: up_timerisr
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The timer ISR will perform a variety of services for various portions
|
||||||
|
* of the systems.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int up_timerisr(int irq, uint32 *regs)
|
||||||
|
{
|
||||||
|
/* Process timer interrupt */
|
||||||
|
|
||||||
|
sched_process_timer();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: up_timerinit
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function is called during start-up to initialize
|
||||||
|
* the timer interrupt.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_timerinit(void)
|
||||||
|
{
|
||||||
|
#warning "Timer initialization logic needed"
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* Set the IRQ interrupt priority */
|
||||||
|
|
||||||
|
up_irqpriority(STR71X_IRQ_SYSTIMER, 1);
|
||||||
|
|
||||||
|
/* Attach the timer interrupt vector */
|
||||||
|
|
||||||
|
(void)irq_attach(STR71X_IRQ_SYSTIMER, (xcpt_t)up_timerisr);
|
||||||
|
|
||||||
|
/* And enable the timer interrupt */
|
||||||
|
|
||||||
|
up_enable_irq(STR71X_IRQ_SYSTIMER);
|
||||||
|
#endif
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user