关闭

嵌入式操作系统内核原理和开发(多线程轮转)

发表于:2012-6-11 10:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  之前我们也谈到了线程创建,基本上简单的系统就可以跑起来了,但是还没有到多线程运行的地步。所以,我们下面试图所要做的工作就是创建更多的线程,让更多的线程运行起来。为了做好这一点,首先我们需要对task_init重新修整一下,

void task_init(int index, UINT32 data[], int size, void (*func)())
{
        UINT32 unit = size;

        memset((void*)data, 0, size * sizeof(UINT32));
        data[unit -1] = (UINT32) func;
        data[unit -2] = 0;
        data[unit -3] = 0;
        data[unit -4] = 0;
        data[unit -5] = 0;
        data[unit -6] = 0;
        data[unit -7] = 0;
        data[unit -8] = 0;
        data[unit -9] = 0;
        data[unit -10] = (UINT32) &data[unit - 9];
        new[index] = (UINT32) &data[unit -10];
}

  这是一个创建线程的函数,有堆栈、大小、函数入口。那么,我们的函数什么时候创建呢,其实就是在系统的开始位置就可以,

void set_all_task()
{
        int index;

        for(index = 0; index < THREAD_MAX_NUMBER; index ++)
            task_init(index, task_stack[index], STACK_LENGTH, hello);
}

  既然任务创建没有问题,那么下面就会涉及到简单轮转的问题。其实我们的方法特别简单,就是根据current_thread_id叠加,每一个thread都有自己的运转机会。代码如下所示,

void signal_handler(int m)
{
        current_thread_id = current_thread_id % THREAD_MAX_NUMBER;

        if(0 == quit[current_thread_id])
        {
            swap(&old, &new[current_thread_id]);
        }

        printf("count = %d in main!\n\n",  count ++);
        current_thread_id ++;
}

  当然,为了要实现真正的多线程运行,我们还要保证线程始终在运行。要达到这一点也不是很复杂,只需要把子函数设计为while(1)即可,

void hello()
{
     while(1) {
            printf("id = %i, count = %d in thread!\n",current_thread_id,  count ++);
            swap(&new[current_thread_id], &old);

            printf("id = %i, count = %d in thread!\n",current_thread_id,  count ++);
            swap(&new[current_thread_id], &old);
        }
}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号