//----创建线程----------------------------------------------------------------- //功能:为事件类型创建伪虚拟机,初始化上下文环境,安装执行函数,构成完整线程 //参数:evtt_id,待创建的线程所服务的事件类型id //返回:新创建的线程的虚拟机指针 //注: 移植敏感函数 //----------------------------------------------------------------------------- struct tagThreadVm *__CreateThread(struct tagEventType *evtt,u32 *stack_size) { struct tagThreadVm *result; //stack_size和cn_kernel_stack在windows版本中并没有用到,windows的线程栈是自己维护 //的,这样写比较接近实际cpu平台。 *stack_size = evtt->stack_size+sizeof(struct tagThreadVm); result=(struct tagThreadVm *)__MallocStack(*stack_size); if(NULL == result) { return result; } else { memset(result,0,sizeof(struct tagThreadVm)); } result->stack_top = CreateThread( NULL, 0, win_engine, evtt->thread_routine, CREATE_SUSPENDED, NULL ); // SetThreadAffinityMask( result->stack_top, 1 ); result->stack = 0; result->next = NULL; result->stack_size = 0; //保存栈深度 result->host_vm = NULL; //复位虚拟机并重置线程 __asm_reset_thread(evtt->thread_routine,result); return result; }
//----创建线程----------------------------------------------------------------- //功能:为事件类型创建线程,初始化上下文环境,安装执行函数,构成完整线程 //参数:evtt_id,待创建的线程所服务的事件类型id //返回:新创建的线程指针 //注: 移植敏感函数 //----------------------------------------------------------------------------- struct tagThreadVm *__CreateThread(struct tagEventType *evtt,u32 *stack_size) { struct tagThreadVm *result; ptu32_t len; //计算线程栈:线程+最大单个api需求的栈 len = evtt->stack_size+CN_KERNEL_STACK+sizeof(struct tagThreadVm); //栈顶需要对齐,malloc函数能保证栈底是对齐的,对齐长度可以使栈顶对齐 len = align_up_sys(len); result=(struct tagThreadVm *)__MallocStack(len); *stack_size = len; if(result==NULL) { Djy_SaveLastError(EN_MEM_TRIED); //内存不足,返回错误 return result; } #if CN_CFG_STACK_FILL != 0 len = M_CheckSize(result); memset(result,CN_CFG_STACK_FILL,len); #endif //看实际分配了多少内存,djyos内存分配使用块相联策略,如果分配的内存量大于 //申请量,可以保证其实际尺寸是对齐的。之所以注释掉,是因为当len大于申请量时, //对齐只是实际结果,而不是内存管理的规定动作,如果不注释掉,就要求内存管理 //模块必须提供对齐的结果,对模块独立性是不利的。 // len = M_CheckSize(result); result->stack_top = (u32*)((ptu32_t)result+len); //栈顶地址,移植敏感 result->next = NULL; result->stack_size = len - sizeof(struct tagThreadVm); //保存栈深度 result->host_vm = NULL; //复位线程并重置线程 __asm_reset_thread(evtt->thread_routine,result); return result; }
// ============================================================================= // 函数功能:__CreateThread // 创建线程 // 输入参数:evtt,线程关联的evtt // 输出参数:stack_size,创建的VM的stack的大小 // 返回值 : // 说明 :将evtt中的内容恢复到创建的VM当中 // ============================================================================= struct tagThreadVm *__CreateThread(struct tagEventType *evtt,u32 *stack_size) { struct tagThreadVm *result; ptu32_t len; //计算虚拟机栈:线程+最大单个api需求的栈 len = evtt->stack_size+CN_KERNEL_STACK+sizeof(struct tagThreadVm); //栈顶需要对齐,malloc函数能保证栈底是对齐的,对齐长度可以使栈顶对齐 len = align_up_sys(len); result=(struct tagThreadVm *)(__MallocStack(len)); *stack_size = len; if(result==NULL) { Djy_SaveLastError(EN_MEM_TRIED); //内存不足,返回错误 return result; } #if CN_CFG_STACK_FILL != 0 memset(result,CN_CFG_STACK_FILL,len); #endif result->stack_top = (u32*)((ptu32_t)result+len); //栈顶地址,移植敏感 result->next = NULL; result->stack_size = len - sizeof(struct tagThreadVm); //保存栈深度 result->host_vm = NULL; //复位虚拟机并重置线程 __asm_reset_thread(evtt->thread_routine,result); return result; }