Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2301_76519099
rt-thread
提交
e933c1f6
R
rt-thread
项目概览
2301_76519099
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
3
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e933c1f6
编写于
7月 05, 2021
作者:
F
fenghuijie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
调整异常处理代码结构,以支持backtrace功能
上级
782960f1
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
84 addition
and
21 deletion
+84
-21
include/rtdef.h
include/rtdef.h
+4
-0
libcpu/arm/cortex-a/start_gcc.S
libcpu/arm/cortex-a/start_gcc.S
+12
-1
libcpu/arm/cortex-a/trap.c
libcpu/arm/cortex-a/trap.c
+68
-20
未找到文件。
include/rtdef.h
浏览文件 @
e933c1f6
...
@@ -567,6 +567,10 @@ typedef siginfo_t rt_siginfo_t;
...
@@ -567,6 +567,10 @@ typedef siginfo_t rt_siginfo_t;
#define RT_SCHEDULE_IPI 0
#define RT_SCHEDULE_IPI 0
#endif
#endif
#ifndef RT_STOP_IPI
#define RT_STOP_IPI 1
#endif
/**
/**
* CPUs definitions
* CPUs definitions
*
*
...
...
libcpu/arm/cortex-a/start_gcc.S
浏览文件 @
e933c1f6
...
@@ -373,9 +373,18 @@ rt_hw_context_switch_interrupt_do:
...
@@ -373,9 +373,18 @@ rt_hw_context_switch_interrupt_do:
mrs
r6
,
spsr
@
/*
Save
CPSR
*/
mrs
r6
,
spsr
@
/*
Save
CPSR
*/
str
lr
,
[
r0
,
#
15
*
4
]
@
/*
Push
PC
*/
str
lr
,
[
r0
,
#
15
*
4
]
@
/*
Push
PC
*/
str
r6
,
[
r0
,
#
16
*
4
]
@
/*
Push
CPSR
*/
str
r6
,
[
r0
,
#
16
*
4
]
@
/*
Push
CPSR
*/
cps
#
Mode_SVC
mrs
r5
,
cpsr
@
/*
Save
CPSR
*/
and
r4
,
r6
,
#
0x1F
cmp
r4
,
#
Mode_USR
moveq
r6
,
#
Mode_SYS
orr
r6
,
r6
,
#
0x80
@
/*
Switch
to
previous
mode
,
then
save
SP
&
PC
*/
msr
cpsr_c
,
r6
str
sp
,
[
r0
,
#
13
*
4
]
@
/*
Save
calling
SP
*/
str
sp
,
[
r0
,
#
13
*
4
]
@
/*
Save
calling
SP
*/
str
lr
,
[
r0
,
#
14
*
4
]
@
/*
Save
calling
PC
*/
str
lr
,
[
r0
,
#
14
*
4
]
@
/*
Save
calling
PC
*/
msr
cpsr_c
,
r5
@
/*
Switch
back
to
current
mode
*/
.
endm
.
endm
.
align
5
.
align
5
...
@@ -482,6 +491,8 @@ secondary_cpu_start:
...
@@ -482,6 +491,8 @@ secondary_cpu_start:
.
bss
.
bss
.
align
2
//
align
to
2
~
2
=
4
.
align
2
//
align
to
2
~
2
=
4
.
global
sub_stack_top
/*
used
for
backtrace
to
calculate
stack
top
of
irq
mode
*/
sub_stack_start
:
sub_stack_start
:
.
space
(
SUB_ISR_Stack_Size
*
(
RT_CPUS_NR
-
1
))
.
space
(
SUB_ISR_Stack_Size
*
(
RT_CPUS_NR
-
1
))
sub_stack_top
:
sub_stack_top
:
...
...
libcpu/arm/cortex-a/trap.c
浏览文件 @
e933c1f6
...
@@ -35,6 +35,18 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs)
...
@@ -35,6 +35,18 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs)
rt_kprintf
(
"cpsr:0x%08x
\n
"
,
regs
->
cpsr
);
rt_kprintf
(
"cpsr:0x%08x
\n
"
,
regs
->
cpsr
);
}
}
void
(
*
rt_trap_hook
)(
struct
rt_hw_exp_stack
*
regs
,
const
char
*
ex
,
unsigned
int
exception_type
);
/**
* This function will set a hook function to trap handler.
*
* @param hook the hook function
*/
void
rt_hw_trap_set_hook
(
void
(
*
hook
)(
struct
rt_hw_exp_stack
*
regs
,
const
char
*
ex
,
unsigned
int
exception_type
))
{
rt_trap_hook
=
hook
;
}
/**
/**
* When comes across an instruction which it cannot handle,
* When comes across an instruction which it cannot handle,
* it takes the undefined instruction trap.
* it takes the undefined instruction trap.
...
@@ -72,12 +84,20 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
...
@@ -72,12 +84,20 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
}
}
}
}
#endif
#endif
if
(
rt_trap_hook
==
RT_NULL
)
{
rt_kprintf
(
"undefined instruction:
\n
"
);
rt_kprintf
(
"undefined instruction:
\n
"
);
rt_hw_show_register
(
regs
);
rt_hw_show_register
(
regs
);
#ifdef RT_USING_FINSH
#ifdef RT_USING_FINSH
list_thread
();
list_thread
();
#endif
#endif
rt_hw_cpu_shutdown
();
rt_hw_cpu_shutdown
();
}
else
{
rt_trap_hook
(
regs
,
"undefined instruction"
,
UND_EXCEPTION
);
}
}
}
/**
/**
...
@@ -91,12 +111,19 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
...
@@ -91,12 +111,19 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
*/
*/
void
rt_hw_trap_swi
(
struct
rt_hw_exp_stack
*
regs
)
void
rt_hw_trap_swi
(
struct
rt_hw_exp_stack
*
regs
)
{
{
if
(
rt_trap_hook
==
RT_NULL
)
{
rt_kprintf
(
"software interrupt:
\n
"
);
rt_kprintf
(
"software interrupt:
\n
"
);
rt_hw_show_register
(
regs
);
rt_hw_show_register
(
regs
);
#ifdef RT_USING_FINSH
#ifdef RT_USING_FINSH
list_thread
();
list_thread
();
#endif
#endif
rt_hw_cpu_shutdown
();
rt_hw_cpu_shutdown
();
}
else
{
rt_trap_hook
(
regs
,
"software instruction"
,
SWI_EXCEPTION
);
}
}
}
/**
/**
...
@@ -109,12 +136,19 @@ void rt_hw_trap_swi(struct rt_hw_exp_stack *regs)
...
@@ -109,12 +136,19 @@ void rt_hw_trap_swi(struct rt_hw_exp_stack *regs)
*/
*/
void
rt_hw_trap_pabt
(
struct
rt_hw_exp_stack
*
regs
)
void
rt_hw_trap_pabt
(
struct
rt_hw_exp_stack
*
regs
)
{
{
if
(
rt_trap_hook
==
RT_NULL
)
{
rt_kprintf
(
"prefetch abort:
\n
"
);
rt_kprintf
(
"prefetch abort:
\n
"
);
rt_hw_show_register
(
regs
);
rt_hw_show_register
(
regs
);
#ifdef RT_USING_FINSH
#ifdef RT_USING_FINSH
list_thread
();
list_thread
();
#endif
#endif
rt_hw_cpu_shutdown
();
rt_hw_cpu_shutdown
();
}
else
{
rt_trap_hook
(
regs
,
"prefetch abort"
,
PABT_EXCEPTION
);
}
}
}
/**
/**
...
@@ -127,12 +161,19 @@ void rt_hw_trap_pabt(struct rt_hw_exp_stack *regs)
...
@@ -127,12 +161,19 @@ void rt_hw_trap_pabt(struct rt_hw_exp_stack *regs)
*/
*/
void
rt_hw_trap_dabt
(
struct
rt_hw_exp_stack
*
regs
)
void
rt_hw_trap_dabt
(
struct
rt_hw_exp_stack
*
regs
)
{
{
if
(
rt_trap_hook
==
RT_NULL
)
{
rt_kprintf
(
"data abort:"
);
rt_kprintf
(
"data abort:"
);
rt_hw_show_register
(
regs
);
rt_hw_show_register
(
regs
);
#ifdef RT_USING_FINSH
#ifdef RT_USING_FINSH
list_thread
();
list_thread
();
#endif
#endif
rt_hw_cpu_shutdown
();
rt_hw_cpu_shutdown
();
}
else
{
rt_trap_hook
(
regs
,
"data abort"
,
DABT_EXCEPTION
);
}
}
}
/**
/**
...
@@ -144,12 +185,19 @@ void rt_hw_trap_dabt(struct rt_hw_exp_stack *regs)
...
@@ -144,12 +185,19 @@ void rt_hw_trap_dabt(struct rt_hw_exp_stack *regs)
*/
*/
void
rt_hw_trap_resv
(
struct
rt_hw_exp_stack
*
regs
)
void
rt_hw_trap_resv
(
struct
rt_hw_exp_stack
*
regs
)
{
{
if
(
rt_trap_hook
==
RT_NULL
)
{
rt_kprintf
(
"reserved trap:
\n
"
);
rt_kprintf
(
"reserved trap:
\n
"
);
rt_hw_show_register
(
regs
);
rt_hw_show_register
(
regs
);
#ifdef RT_USING_FINSH
#ifdef RT_USING_FINSH
list_thread
();
list_thread
();
#endif
#endif
rt_hw_cpu_shutdown
();
rt_hw_cpu_shutdown
();
}
else
{
rt_trap_hook
(
regs
,
"reserved trap"
,
RESV_EXCEPTION
);
}
}
}
void
rt_hw_trap_irq
(
void
)
void
rt_hw_trap_irq
(
void
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录