增加mem fault的错误处理流程[默认杀死当前task]

This commit is contained in:
zhangzheng
2023-09-29 12:57:40 +08:00
parent 3b5a7b14b3
commit 224ca9f33c
5 changed files with 39 additions and 32 deletions

View File

@@ -33,6 +33,7 @@
#include "mm_man.h"
#include "task.h"
#include "thread.h"
#include "map.h"
/** @addtogroup Template_Project
* @{
*/
@@ -66,11 +67,11 @@ void NMI_Handler(void)
void HardFault_Handler(void)
{
printk("%s\n", __FUNCTION__);
task_kill(thread_get_current_task());
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
// while (1)
// {
// }
}
/**
@@ -101,9 +102,10 @@ void MemManage_Handler(void)
{
printk("semgement fault.\n");
/*TODO:杀死进程*/
while (1)
{
}
// while (1)
// {
// }
goto end;
}
return;
}
@@ -116,24 +118,23 @@ void MemManage_Handler(void)
{
printk("semgement fault.\n");
/*TODO:杀死进程*/
while (1)
{
}
// while (1)
// {
// }
goto end;
}
return;
}
if (SCB->CFSR & 16)
{
printk("压栈错误\n");
fault_addr = arch_get_user_sp();
fault_addr = arch_get_user_sp();
if (mm_page_alloc_fault(&cur_task->mm_space.mm_pages, fault_addr) == NULL)
{
printk("semgement fault.\n");
/*TODO:杀死进程*/
while (1)
{
}
goto end;
}
return;
}
@@ -142,17 +143,13 @@ void MemManage_Handler(void)
printk("浮点惰性压栈错误\n");
}
// else
printk("semgement fault.\n");
/*TODO:杀死进程*/
// while (1)
// {
printk("semgement fault.\n");
/*TODO:杀死进程*/
while (1)
{
}
// }
// thread_sched();
/* Go to infinite loop when Memory Manage exception occurs */
end:
task_kill(thread_get_current_task());
}
/**
@@ -165,9 +162,10 @@ void BusFault_Handler(void)
printk("%s\n", __FUNCTION__);
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
// while (1)
// {
// }
task_kill(thread_get_current_task());
}
/**
@@ -203,9 +201,10 @@ void UsageFault_Handler(void)
printk("除零错误\n");
}
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
// while (1)
// {
// }
task_kill(thread_get_current_task());
}
// /**

View File

@@ -21,3 +21,4 @@ typedef struct task
void task_init(task_t *task, ram_limit_t *ram, int is_knl);
task_t *task_create(ram_limit_t *lim, int is_knl);
int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size);
void task_kill(task_t *tk);

View File

@@ -173,7 +173,14 @@ static void task_release_stage2(kobject_t *kobj)
}
printk("release tk %x\n", tk);
}
void task_kill(task_t *tk)
{
kobj_del_list_t kobj_list;
kobj_del_list_init(&kobj_list);
obj_unmap(&tk->obj_space, vpage_create3(KOBJ_DELETE_RIGHT, 0, TASK_PROT), &kobj_list);
kobj_del_list_to_do(&kobj_list);
thread_sched();
}
task_t *task_create(ram_limit_t *lim, int is_knl)
{
task_t *tk = mm_limit_alloc(lim, sizeof(task_t));

View File

@@ -22,7 +22,6 @@ int main(int argc, char *args[])
{
// futex_init();
ulog_write_str(LOG_PROT, "init..\n");
// mpu_test();
#if 0
ulog_test();
factory_test();
@@ -33,6 +32,7 @@ int main(int argc, char *args[])
ipc_timeout_test();
mm_test();
app_test();
mpu_test();
#endif
ipc_test();
uenv_t env = *u_get_global_env();

View File

@@ -15,5 +15,5 @@ void factory_test(void)
printf("factory_create_ipc no memory\n");
return;
}
task_unmap(TASK_PROT, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd));
handler_free_umap(hd);
}