占用式和非占用式程序结构分析
来源:互联网 发布:淘宝主营类目如何更改 编辑:程序博客网 时间:2024/05/16 01:29
本文是2013年写的,后来整理成了系统文章,请访问 http://nicekwell.net/ 查看单片机编程系列文章。
以下是2013年原文:
一、什么是占用式程序
voiddelay5(unsignedchar n)
{
voidrefresh7()
{
}
二、占用式程序的缺点
三、对占用式程序的改造
voidrefresh7()
{
r=0;
}
voidrefresh7()
{
}
voidrefresh7()
{
}
四、改造的本质
五、非占用式程序结构的优势
1、非占用式程序相比于占用式程序,增加了一定的代码,虽然会使整体效率降低,但是提高了各个任务之间的切换速度,可以对各个任务都能很快地响应。这点类似于操作系统,虽然降低了效率,但是各个任务间的快速切换可以达到各个任务“并行处理”的效果,光是这点的好处就已经很大了。
2、非占用式程序结构可以放进定时器
之前写过一片《单片机用定时器分配任务程序结构总结》已经发现用定时器分配任务的好处,有些简短的代码可以直接放进定时器里。
在改造之前的扫描程序是不适合放在定时器中断处理程序里执行的,因为太长,可能还没执行完就来了下一个中断。就算勉强执行完了,留给主进程处理其它事情的时间也不多了。
而改为非占用式之后,可以在中断处理程序里直接调用扫描程序,它会很快地执行完,然后有充足的时间留给其他任务。
先拿“三大改造”的第三点说明,它虽然形式上消除了延时函数,但是每次调用此函数时对num变量的处理,以及有其产生的相关判断语句,总的代码量比原来的要多。
但是,这真的就仅仅是这样了吗?改造之前的函数,执行玩退出之后所有的led全是熄灭的,只有在此函数执行过程中(延时阶段)才会点亮(传统数码管扫描亦是如此)。
而改造之后的函数,它的功能就是指定一下每个灯的亮灭,然后立马退出,在执行其它任务的过程中该点亮的灯是在点亮的状态。这样就提高了整体的亮度,在执行其他任务的过程中,从某种意义上说也是在执行当前任务。
if(key==0)
{
}
staticunsignedcharkeylast;
if(key==0 &&keylast==1)
{
}
keylast=key;
六、非占用式程序的一般结构
七、吐槽
最近开发DYS388写了不少程序,以前在写程序的过程中就隐约发现了所谓占用式和非占用式程序结构的区别,程序写多了肯定能发现问题,但是如果不停下来总结,而是一味的开发,那是不会有进步的。
组织庞大的程序需要正确的理论指导,学习很多的知识也需要进行总结。知识点太多不可能学完,只有将他们提升到理论层次,将这种思维方式刻在脑子里才能灵活地运用,并从容地接受新的知识。
- 占用式和非占用式程序结构分析
- Unity3D 图片空间和内存占用分析
- 程序占用内存分析
- 内存占用分析
- linux内存占用分析
- 内存占用分析
- linux内存占用分析
- VGGNet 内存占用分析
- cpu占用高分析
- 文件大小和占用空间
- Android使用procrank和dumpsys meminfo分析内存占用情况
- Unity3D–Texture图片空间和内存占用分析
- Unity3D–Texture图片空间和内存占用分析
- Unity3D–Texture图片空间和内存占用分析
- Unity3D–Texture图片空间和内存占用分析
- Unity3D:Texture图片空间和内存占用分析
- Android使用procrank和dumpsys meminfo分析内存占用情况
- Android使用procrank和dumpsysmeminfo分析内存占用情况
- VB6.0让图片自适应Picture图片框大小
- PyCharm 教程(四)显示行号
- VB的一些小问题总结
- 单片机程序结构再分析
- hdu 1075 What Are You Talking About(字典树)
- 占用式和非占用式程序结构分析
- Rosetta Stone 4.1.15 下载破解和语言包
- mysql插入Timestamp类型时报java.sql.Timestamp错
- 解决C、C++程序执行结果一闪而过的方法---system("pause"
- YII实现ThinkPHP的表单令牌
- python中全局变量的使用
- mina
- 弹出层
- python中string和bool的转换