Пример #1
0
//----创建线程-----------------------------------------------------------------
//功能:为事件类型创建伪虚拟机,初始化上下文环境,安装执行函数,构成完整线程
//参数: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;
}
Пример #2
0
//----创建线程-----------------------------------------------------------------
//功能:为事件类型创建线程,初始化上下文环境,安装执行函数,构成完整线程
//参数: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;
}
Пример #3
0
// =============================================================================
// 函数功能:__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;
}