如果有挂起的切换,则不再切换。否则切换时需要保存的栈会出错。
解决不停创建、销毁线程时,内存暴涨不消的问题。这个问题估计跟没法完全释放线程有关
This commit is contained in:
parent
7172848991
commit
187b4d7a21
10
Debug.cpp
10
Debug.cpp
|
@ -26,7 +26,10 @@ void* operator new(uint size)
|
||||||
{
|
{
|
||||||
mem_printf("0x%08x ", p);
|
mem_printf("0x%08x ", p);
|
||||||
// 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测
|
// 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测
|
||||||
uint end = (uint)&__heap_limit;
|
//uint end = (uint)&__heap_limit;
|
||||||
|
//uint end = __get_PSP();
|
||||||
|
//if(!end) end = __get_MSP();
|
||||||
|
uint end = __get_MSP();
|
||||||
if((uint)p + size + 0x40 >= end) mem_printf(" + %d near HeapEnd=0x%08x", size, end);
|
if((uint)p + size + 0x40 >= end) mem_printf(" + %d near HeapEnd=0x%08x", size, end);
|
||||||
}
|
}
|
||||||
assert_param(p);
|
assert_param(p);
|
||||||
|
@ -43,7 +46,10 @@ void* operator new[](uint size)
|
||||||
{
|
{
|
||||||
mem_printf("0x%08x ", p);
|
mem_printf("0x%08x ", p);
|
||||||
// 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测
|
// 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测
|
||||||
uint end = (uint)&__heap_limit;
|
//uint end = (uint)&__heap_limit;
|
||||||
|
//uint end = __get_PSP();
|
||||||
|
//if(!end) end = __get_MSP();
|
||||||
|
uint end = __get_MSP();
|
||||||
if((uint)p + size + 0x40 >= end) mem_printf(" + %d near HeapEnd=0x%08x", size, end);
|
if((uint)p + size + 0x40 >= end) mem_printf(" + %d near HeapEnd=0x%08x", size, end);
|
||||||
}
|
}
|
||||||
assert_param(p);
|
assert_param(p);
|
||||||
|
|
2
Sys.h
2
Sys.h
|
@ -151,7 +151,7 @@ __inline void debug_printf( const char *format, ... ) {}
|
||||||
#endif //_Sys_H_
|
#endif //_Sys_H_
|
||||||
|
|
||||||
/*
|
/*
|
||||||
v2.6.2014.0919 支持抢占式多线程调度
|
v2.7.2014.0919 支持抢占式多线程调度
|
||||||
v2.6.2014.0823 平台文件独立,接管系统初始化控制权
|
v2.6.2014.0823 平台文件独立,接管系统初始化控制权
|
||||||
v2.5.2014.0819 增加堆栈溢出检测模块,重载new/delete实现,仅Debug有效
|
v2.5.2014.0819 增加堆栈溢出检测模块,重载new/delete实现,仅Debug有效
|
||||||
v2.4.2014.0811 实现系统多任务调度,一次性编译测试通过,多任务小灯例程4k
|
v2.4.2014.0811 实现系统多任务调度,一次性编译测试通过,多任务小灯例程4k
|
||||||
|
|
|
@ -127,7 +127,7 @@ Thread::~Thread()
|
||||||
if(State != Stopped) Stop();
|
if(State != Stopped) Stop();
|
||||||
|
|
||||||
Stack = StackTop - (StackSize >> 2);
|
Stack = StackTop - (StackSize >> 2);
|
||||||
if(Stack) delete Stack;
|
if(Stack) delete[] Stack;
|
||||||
Stack = NULL;
|
Stack = NULL;
|
||||||
StackTop = NULL;
|
StackTop = NULL;
|
||||||
}
|
}
|
||||||
|
@ -464,6 +464,9 @@ PendSV_NoSave // 此时整个上下文已经被保存
|
||||||
// 切换线程,马上切换时间片给下一个线程
|
// 切换线程,马上切换时间片给下一个线程
|
||||||
void Thread::Switch()
|
void Thread::Switch()
|
||||||
{
|
{
|
||||||
|
// 如果有挂起的切换,则不再切换。否则切换时需要保存的栈会出错
|
||||||
|
if(SCB->ICSR & SCB_ICSR_PENDSVSET_Msk) return;
|
||||||
|
|
||||||
// 准备当前任务和新任务的栈
|
// 准备当前任务和新任务的栈
|
||||||
curStack = 0;
|
curStack = 0;
|
||||||
if(Current)
|
if(Current)
|
||||||
|
@ -549,6 +552,8 @@ void Thread::Init()
|
||||||
// 每个线程结束时执行该方法,销毁线程
|
// 每个线程结束时执行该方法,销毁线程
|
||||||
void Thread::OnEnd()
|
void Thread::OnEnd()
|
||||||
{
|
{
|
||||||
|
SmartIRQ irq; // 关闭全局中断,确保销毁成功
|
||||||
|
|
||||||
Thread* th = Thread::Current;
|
Thread* th = Thread::Current;
|
||||||
if(th) delete th;
|
if(th) delete th;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue