一:内核级线程调度
1,当我insmod该进程(led-on),
led0被点亮,任务管理器查看: 该进程占用cpu99%
2,当我insmod该进程(led-off),
led0周期性闪烁,任务管理器查看:两个进程分别占用cpu49.7%
3,当我insmod该进程(dead),
led0停止闪烁,(灯灭了),系统死机,任务管理器调不出来。
二:用户级线程调度
2.1插入s3c2440xxx.ko驱动模块,
2.2创建设备文件节点,
2.3执行应用程序led-on并放到后台,
2.4执行应用程序led-off并放到后台,
2.5查看任务管理器:用示波器测量得出led管脚周期为10ms,占空比为50%,
2.6执行应用程序led-nothing并放到后台,
2.7查看任务管理器:用示波器测量得出led管脚周期为15ms,占空比为33%,偶尔变到66.6%
结论:
现象1,用户程序无sleep并且有while(1),用户线程能来回切换,说明这个切换是有东西在管的,到时间了就强迫退出
现象2,当3个应用程序共同影响led时,应用程序轮番对其进行操作,所以周期由10ms变成了15ms,占空比不是50%了,说明多任务对其产生了影响
现象3,占空比一般为33%,但有时变到66.6%,说明任务调度可能不是沿一个方向旋转,而是双向的!
三:应用程序调用驱动ioctl
3.1,
3.2,如下图为开启了一个while(1):
3.3,如下图为开启了两个while(1),显示的200us为两个while(1)即两个应用程序的切换时间。
四:用双踪检测出相邻两个GPIO翻转的时间差为300ns
for(iii = 0 ;iii <4; iii++)
{
leds_all_on();
leds_all_off();
}
可见,翻转周期约为2.75us,
五:内核级线程切换
代码shine2:
代码shine4:
代码shine6:
实验结果1(当插入shine2和shine4两个模块):
实验结果2(当插入shine6,shine2和shine4三个模块):
实验结论:
通过该实验可以得出内核级线程切换花费的时间为5ms。