Add exception hook function.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2551 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
bernard.xiong@gmail.com 2012-12-29 09:36:16 +00:00
parent d573786d52
commit 68fadd9edc
3 changed files with 66 additions and 17 deletions

View File

@ -12,6 +12,7 @@
* 2006-03-18 Bernard the first version * 2006-03-18 Bernard the first version
* 2006-04-25 Bernard add rt_hw_context_switch_interrupt declaration * 2006-04-25 Bernard add rt_hw_context_switch_interrupt declaration
* 2006-09-24 Bernard add rt_hw_context_switch_to declaration * 2006-09-24 Bernard add rt_hw_context_switch_to declaration
* 2012-12-29 Bernard add rt_hw_exception_install declaration
*/ */
#ifndef __RT_HW_H__ #ifndef __RT_HW_H__
@ -56,6 +57,11 @@ void rt_hw_console_output(const char *str);
void rt_hw_backtrace(rt_uint32_t *fp, rt_uint32_t thread_entry); void rt_hw_backtrace(rt_uint32_t *fp, rt_uint32_t thread_entry);
void rt_hw_show_memory(rt_uint32_t addr, rt_uint32_t size); void rt_hw_show_memory(rt_uint32_t addr, rt_uint32_t size);
/*
* exception interfaces
*/
void rt_hw_exception_install(void (*exception_handle)(void* context));
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -13,6 +13,7 @@
* 2011-02-14 onelife Modify for EFM32 * 2011-02-14 onelife Modify for EFM32
* 2011-06-17 onelife Merge all of the C source code into cpuport.c * 2011-06-17 onelife Merge all of the C source code into cpuport.c
* 2012-12-23 aozima stack addr align to 8byte. * 2012-12-23 aozima stack addr align to 8byte.
* 2012-12-29 Bernard Add exception hook.
*/ */
#include <rtthread.h> #include <rtthread.h>
@ -47,6 +48,8 @@ struct stack_frame
/* flag in interrupt handling */ /* flag in interrupt handling */
rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
rt_uint32_t rt_thread_switch_interrupt_flag; rt_uint32_t rt_thread_switch_interrupt_flag;
/* exception hook */
static rt_err_t (*rt_exception_hook)(void *context) = RT_NULL;
/** /**
* This function will initialize thread stack * This function will initialize thread stack
@ -92,23 +95,41 @@ rt_uint8_t *rt_hw_stack_init(void *tentry,
return stk; return stk;
} }
extern long list_thread(void);
extern rt_thread_t rt_current_thread;
/** /**
* fault exception handling * This function set the hook, which is invoked on fault exception handling.
*
* @param exception_handle the exception handling hook function.
*/ */
void rt_hw_hard_fault_exception(struct exception_stack_frame* contex) void rt_hw_exception_install(rt_err_t (*exception_handle)(void* context))
{ {
rt_kprintf("psr: 0x%08x\n", contex->psr); rt_exception_hook = exception_handle;
rt_kprintf(" pc: 0x%08x\n", contex->pc); }
rt_kprintf(" lr: 0x%08x\n", contex->lr);
rt_kprintf("r12: 0x%08x\n", contex->r12);
rt_kprintf("r03: 0x%08x\n", contex->r3);
rt_kprintf("r02: 0x%08x\n", contex->r2);
rt_kprintf("r01: 0x%08x\n", contex->r1);
rt_kprintf("r00: 0x%08x\n", contex->r0);
rt_kprintf("hard fault on thread: %s\n", rt_current_thread->name); /*
* fault exception handler
*/
void rt_hw_hard_fault_exception(struct exception_stack_frame* context)
{
extern long list_thread(void);
if (rt_exception_hook != RT_NULL)
{
rt_err_t result;
result = rt_exception_hook(context);
if (result == RT_EOK) return;
}
rt_kprintf("psr: 0x%08x\n", context->psr);
rt_kprintf(" pc: 0x%08x\n", context->pc);
rt_kprintf(" lr: 0x%08x\n", context->lr);
rt_kprintf("r12: 0x%08x\n", context->r12);
rt_kprintf("r03: 0x%08x\n", context->r3);
rt_kprintf("r02: 0x%08x\n", context->r2);
rt_kprintf("r01: 0x%08x\n", context->r1);
rt_kprintf("r00: 0x%08x\n", context->r0);
rt_kprintf("hard fault on thread: %s\n", rt_thread_self()->name);
#ifdef RT_USING_FINSH #ifdef RT_USING_FINSH
list_thread(); list_thread();
@ -126,3 +147,4 @@ void rt_hw_cpu_shutdown(void)
RT_ASSERT(0); RT_ASSERT(0);
} }

View File

@ -15,6 +15,7 @@
* 2012-01-01 aozima support context switch load/store FPU register. * 2012-01-01 aozima support context switch load/store FPU register.
* 2012-12-11 lgnq fixed the coding style. * 2012-12-11 lgnq fixed the coding style.
* 2012-12-23 aozima stack addr align to 8byte. * 2012-12-23 aozima stack addr align to 8byte.
* 2012-12-29 Bernard Add exception hook.
*/ */
#include <rtthread.h> #include <rtthread.h>
@ -27,6 +28,8 @@
rt_uint32_t rt_interrupt_from_thread; rt_uint32_t rt_interrupt_from_thread;
rt_uint32_t rt_interrupt_to_thread; rt_uint32_t rt_interrupt_to_thread;
rt_uint32_t rt_thread_switch_interrupt_flag; rt_uint32_t rt_thread_switch_interrupt_flag;
/* exception hook */
static rt_err_t (*rt_exception_hook)(void *context) = RT_NULL;
struct exception_stack_frame struct exception_stack_frame
{ {
@ -131,11 +134,28 @@ rt_uint8_t *rt_hw_stack_init(void *tentry,
return stk; return stk;
} }
extern void rt_hw_interrupt_thread_switch(void); /**
extern long list_thread(void); * This function set the hook, which is invoked on fault exception handling.
extern rt_thread_t rt_current_thread; *
* @param exception_handle the exception handling hook function.
*/
void rt_hw_exception_install(rt_err_t (*exception_handle)(void* context))
{
rt_exception_hook = exception_handle;
}
void rt_hw_hard_fault_exception(struct exception_stack_frame *exception_stack) void rt_hw_hard_fault_exception(struct exception_stack_frame *exception_stack)
{ {
extern long list_thread(void);
if (rt_exception_hook != RT_NULL)
{
rt_err_t result;
result = rt_exception_hook(exception_stack);
if (result == RT_EOK) return;
}
rt_kprintf("psr: 0x%08x\n", exception_stack->psr); rt_kprintf("psr: 0x%08x\n", exception_stack->psr);
rt_kprintf(" pc: 0x%08x\n", exception_stack->pc); rt_kprintf(" pc: 0x%08x\n", exception_stack->pc);
rt_kprintf(" lr: 0x%08x\n", exception_stack->lr); rt_kprintf(" lr: 0x%08x\n", exception_stack->lr);
@ -145,7 +165,7 @@ void rt_hw_hard_fault_exception(struct exception_stack_frame *exception_stack)
rt_kprintf("r01: 0x%08x\n", exception_stack->r1); rt_kprintf("r01: 0x%08x\n", exception_stack->r1);
rt_kprintf("r00: 0x%08x\n", exception_stack->r0); rt_kprintf("r00: 0x%08x\n", exception_stack->r0);
rt_kprintf("hard fault on thread: %s\n", rt_current_thread->name); rt_kprintf("hard fault on thread: %s\n", rt_thread_self()->name);
#ifdef RT_USING_FINSH #ifdef RT_USING_FINSH
list_thread(); list_thread();
@ -160,3 +180,4 @@ void rt_hw_cpu_shutdown(void)
RT_ASSERT(0); RT_ASSERT(0);
} }