添加了中断保护,定义了四个函数如下:
#define NVIC_Shut 0x00000001
OS_CPU_SR OS_CPU_SR_Save(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (cpu_sr);
}
//#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
//#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
OS_CPU_SR OS_ENTER_CRITICAL(void)
{
OS_CPU_SR cpu_sr;
cpu_sr = OS_CPU_SR_Save();
OS_CPU_SR_Restore(NVIC_Shut);
return cpu_sr;
}
void OS_EXIT_CRITICAL(OS_CPU_SR cpu_sr)
{
OS_CPU_SR_Restore(cpu_sr);
}
在myfree和mymalloc中保护程序添加如下:
//释放内存(外部调用)
//memx:所属内存块
//ptr:内存首地址
void myfree(u8 memx,void *ptr)
{
OS_CPU_SR cpu_sr = 0;
u32 offset;
if(ptr==NULL)return;//地址为0.
cpu_sr = OS_ENTER_CRITICAL(); //添加保护
offset=(u32)ptr-(u32)mallco_dev.membase[memx];
my_mem_free(memx,offset); //释放内存
OS_EXIT_CRITICAL(cpu_sr);
}
//分配内存(外部调用)
//memx:所属内存块
//size:内存大小(字节)
//返回值:分配到的内存首地址.
void *mymalloc(u8 memx,u32 size)
{
OS_CPU_SR cpu_sr = 0;
u32 offset;
cpu_sr = OS_ENTER_CRITICAL(); //添加保护
offset=my_mem_malloc(memx,size);
OS_EXIT_CRITICAL(cpu_sr);
if(offset==0XFFFFFFFF)return NULL;
else return (void*)((u32)mallco_dev.membase[memx]+offset);
}
运行后还是会出现卡死的问题,串口打出的信息为:
Assertion "pbuf_take: invalid buf" failed at line 973 in ..LWIPlwip-1.4.1srccorepbuf.c
请问是添加的方法不对吗?
添加了中断保护,定义了四个函数如下:
#define NVIC_Shut 0x00000001
OS_CPU_SR OS_CPU_SR_Save(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (cpu_sr);
}
//#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
//#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
OS_CPU_SR OS_ENTER_CRITICAL(void)
{
OS_CPU_SR cpu_sr;
cpu_sr = OS_CPU_SR_Save();
OS_CPU_SR_Restore(NVIC_Shut);
return cpu_sr;
}
void OS_EXIT_CRITICAL(OS_CPU_SR cpu_sr)
{
OS_CPU_SR_Restore(cpu_sr);
}
在myfree和mymalloc中保护程序添加如下:
//释放内存(外部调用)
//memx:所属内存块
//ptr:内存首地址
void myfree(u8 memx,void *ptr)
{
OS_CPU_SR cpu_sr = 0;
u32 offset;
if(ptr==NULL)return;//地址为0.
cpu_sr = OS_ENTER_CRITICAL(); //添加保护
offset=(u32)ptr-(u32)mallco_dev.membase[memx];
my_mem_free(memx,offset); //释放内存
OS_EXIT_CRITICAL(cpu_sr);
}
//分配内存(外部调用)
//memx:所属内存块
//size:内存大小(字节)
//返回值:分配到的内存首地址.
void *mymalloc(u8 memx,u32 size)
{
OS_CPU_SR cpu_sr = 0;
u32 offset;
cpu_sr = OS_ENTER_CRITICAL(); //添加保护
offset=my_mem_malloc(memx,size);
OS_EXIT_CRITICAL(cpu_sr);
if(offset==0XFFFFFFFF)return NULL;
else return (void*)((u32)mallco_dev.membase[memx]+offset);
}
运行后还是会出现卡死的问题,串口打出的信息为:
Assertion "pbuf_take: invalid buf" failed at line 973 in ..LWIPlwip-1.4.1srccorepbuf.c
请问是添加的方法不对吗?
举报