欢迎来到天天文库
浏览记录
ID:61499531
大小:40.00 KB
页数:5页
时间:2021-02-07
《嵌入式操作系统内核原理和开发(多线程轮转).doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、嵌入式操作系统内核原理和开发(多线程轮转)之前我们也谈到了线程创建,基本上简单的系统就可以跑起来了,但是还没有到多线程运行的地步。所以,我们下面试图所要做的工作就是创建更多的线程,让更多的线程运行起来。为了做好这一点,首先我们需要对task_init重新修整一下,[cpp]viewplaincopy1voidtask_init(intindex,UINT32data[],intsize,void(*func)())2{3UINT32unit=size;45memset((void*)data,0,size*sizeof(UINT32));6data[uni
2、t-1]=(UINT32)func;7data[unit-2]=0;8data[unit-3]=0;9data[unit-4]=0;10data[unit-5]=0;11data[unit-6]=0;12data[unit-7]=0;13data[unit-8]=0;14data[unit-9]=0;15data[unit-10]=(UINT32)&data[unit-9];16new[index]=(UINT32)&data[unit-10];17}这是一个创建线程的函数,有堆栈、大小、函数入口。那么,我们的函数什么时候创建呢,其实就是在系统的开始位置就
3、可以,[cpp]viewplaincopy18voidset_all_task()19{20intindex;2122for(index=0;index4、l_handler(intm)26{27current_thread_id=current_thread_id%THREAD_MAX_NUMBER;12if(0==quit[current_thread_id])3{4swap(&old,&new[current_thread_id]);5}67printf("count=%dinmain!",count++);8current_thread_id++;9}当然,为了要实现真正的多线程运行,我们还要保证线程始终在运行。要达到这一点也不是很复杂,只需要把子函数设计为while(1)即可,[cpp]vi5、ewplaincopy10voidhello()11{12while(1){13printf("id=%i,count=%dinthread!",current_thread_id,count++);14swap(&new[current_thread_id],&old);1516printf("id=%i,count=%dinthread!",current_thread_id,count++);17swap(&new[current_thread_id],&old);18}19}基本上要做到以上几点就可以实现了,最后给出完整的代码,大家可以在l6、inux系统好好试试这个代码。[cpp]viewplaincopy20#include21#include22#include23#include24#include25#include2627#defineUINT32unsignedint28#defineSTACK_LENGTH51229#defineTHREAD_MAX_NUMBER103031structitimervaloldtv;32UINT32old=0;1UINT32cou7、nt=0;2UINT32task_stack[THREAD_MAX_NUMBER][STACK_LENGTH]={0};3UINT32new[THREAD_MAX_NUMBER]={0};4UINT32quit[THREAD_MAX_NUMBER]={0};5UINT32current_thread_id=0;67voidset_timer()8{9structitimervalitv;10itv.it_interval.tv_sec=1;11itv.it_interval.tv_usec=0;12itv.it_value.tv_sec=1;13itv.i8、t_value.tv_usec=0;14setitimer(ITI
4、l_handler(intm)26{27current_thread_id=current_thread_id%THREAD_MAX_NUMBER;12if(0==quit[current_thread_id])3{4swap(&old,&new[current_thread_id]);5}67printf("count=%dinmain!",count++);8current_thread_id++;9}当然,为了要实现真正的多线程运行,我们还要保证线程始终在运行。要达到这一点也不是很复杂,只需要把子函数设计为while(1)即可,[cpp]vi
5、ewplaincopy10voidhello()11{12while(1){13printf("id=%i,count=%dinthread!",current_thread_id,count++);14swap(&new[current_thread_id],&old);1516printf("id=%i,count=%dinthread!",current_thread_id,count++);17swap(&new[current_thread_id],&old);18}19}基本上要做到以上几点就可以实现了,最后给出完整的代码,大家可以在l
6、inux系统好好试试这个代码。[cpp]viewplaincopy20#include21#include22#include23#include24#include25#include2627#defineUINT32unsignedint28#defineSTACK_LENGTH51229#defineTHREAD_MAX_NUMBER103031structitimervaloldtv;32UINT32old=0;1UINT32cou
7、nt=0;2UINT32task_stack[THREAD_MAX_NUMBER][STACK_LENGTH]={0};3UINT32new[THREAD_MAX_NUMBER]={0};4UINT32quit[THREAD_MAX_NUMBER]={0};5UINT32current_thread_id=0;67voidset_timer()8{9structitimervalitv;10itv.it_interval.tv_sec=1;11itv.it_interval.tv_usec=0;12itv.it_value.tv_sec=1;13itv.i
8、t_value.tv_usec=0;14setitimer(ITI
此文档下载收益归作者所有