嵌入式操作系统内核原理和开发(多线程轮转)
上一篇 / 下一篇 2012-06-12 09:48:56 / 个人分类:杂谈
51Testing软件测试网s"J{J*pPZ void task_init(int index, UINT32 data[], int size, void (*func)())51Testing软件测试网\`.t*j)U'wP memset((void*)data, 0, size * sizeof(UINT32)); |
这是一个创建线程的函数,有堆栈、大小、函数入口。那么,我们的函数什么时候创建呢,其实就是在系统的开始位置就可以,51Testing软件测试网zBoAjb-e
51Testing软件测试网5NAh?Q)} void set_all_task()51Testing软件测试网%yQ_C]*_V for(index = 0; index < THREAD_MAX_NUMBER; index ++)51Testing软件测试网#bmT2a?\/H5g1I |
既然任务创建没有问题,那么下面就会涉及到简单轮转的问题。其实我们的方法特别简单,就是根据current_thread_id叠加,每一个thread都有自己的运转机会。代码如下所示,51Testing软件测试网.B F!g/`'?3x
51Testing软件测试网U/[B9ZT&i]4X*m void signal_handler(int m)51Testing软件测试网6f2m&v'e(o if(0 == quit[current_thread_id])51Testing软件测试网z@+@,c(^hD?@ printf("count = %d in main!\n\n", count ++); |
Ey t,\ lkTO0 当然,为了要实现真正的多线程运行,我们还要保证线程始终在运行。要达到这一点也不是很复杂,只需要把子函数设计为while(1)即可,
p,twE4F*E\:X{051Testing软件测试网!F'^%GVs7~7?void hello()51Testing软件测试网f1Xci$@
{
s s \`F.x,t0 while(1) {51Testing软件测试网]{
M Z!O8zrb
printf("id = %i, count = %d in thread!\n",current_thread_id, count ++);51Testing软件测试网RWF2s)f4F
swap(&new[current_thread_id], &old);
printf("id = %i, count = %d in thread!\n",current_thread_id, count ++);
)k}@w#t
_0 swap(&new[current_thread_id], &old);
s!C8r!{0I2W9|j3c0 }
xv?v9P3q0}
基本上要做到以上几点就可以实现了,最后给出完整的代码,大家可以在linux系统好好试试这个代码。
1G`4m[x#N6b#n051Testing软件测试网rE_5d;e wEh(O-[j@NKny\ OZ5k0?0r G%_A3K0#include <stdio.h> #define UINT32 unsigned int51Testing软件测试网 VKQv1M 1muxG+G'nc0struct itimerval oldtv; void set_timer() void swap(UINT32* prev, UINT32* next)51Testing软件测试网H`3z.Px3]0d "lea 0xc(%%ebp), %%eax\n\t" void hello() printf("id = %i, count = %d in thread!\n",current_thread_id, count ++); \G'u@2R[0void task_init(int index, UINT32 data[], int size, void (*func)())51Testing软件测试网PmF^7QH memset((void*)data, 0, size * sizeof(UINT32)); 2R#N` PN/q5nzh8G#d
v0void signal_handler(int m)51Testing软件测试网rD~,L^1F C9m iP]J9so0 if(0 == quit[current_thread_id]) printf("count = %d in main!\n\n", count ++); |