[i=s] 本帖最后由 超电磁侠 于 2011-1-14 20:08 编辑 [/i][size=4][font=宋体]3[font=宋体]、[/font][font=Times New Roman]RTOS[/font][font=宋体],实时操作系统[/font][/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体] 首先我们来理解一下多任务,以电脑为例,我们现在在[font=Times New Roman]windows[/font][font=宋体]下同时打开好几个程序是习以为常的,每一个程序就对应一个“任务”,我们的[/font][font=Times New Roman]cpu[/font][font=宋体]只有一个,(虽然现在多核很常见,我们不扯远)所以[/font][font=Times New Roman]windows[/font][font=宋体]会将[/font][font=Times New Roman]cpu[/font][font=宋体]按一个时间来分配给各个任务, 让它们看起来是在“同时”运行一样。为什么我们会感觉不到延迟?电脑[/font][font=Times New Roman]CPU[/font][font=宋体]每秒数百万次以上的运算能力不是摆在那看的[/font][font=Times New Roman]....[/font][/font][font=宋体][/font][/size][size=4][font=宋体]说回单片机,虽然运算能力不像通用处理器那样强,但是也能实现多任务,一种办法是状态机([font=Times New Roman]state machine[/font][font=宋体]),什么是状态机? 有很多种解释,在编程上,可以说是根据条件进行筛选进入不同的任务循环。[/font][/font][font=宋体][/font][/size][size=4][font=宋体]第二种办法就是[font=Times New Roman]RTOS[/font][font=宋体],[/font][font=Times New Roman]real-time operating system[/font][font=宋体],比起状态机,[/font][font=Times New Roman]rtos[/font][font=宋体]能实现任务调度,任务间的信息交换,对于我们写鼠标固件来说,最重要的是能比较精确地控制每个任务的执行。[/font][font=Times New Roman]RTOS[/font][font=宋体]的任务调度有很多种,就[/font][font=Times New Roman]CCS[/font][font=宋体]提供的[/font][font=Times New Roman]RTOS[/font][font=宋体]来说,它是一个循环型的([/font][font=Times New Roman]round-robin[/font][font=宋体])的任务系统,每个任务预先指定一个执行时间,每个任务的运行时间都是相同的。一个任务执行完毕,就等待到执行另外一个任务的时刻。下面我们就来试一下用[/font][font=Times New Roman]CCS[/font][font=宋体]的[/font][font=Times New Roman]RTOS[/font][font=宋体]。[/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[color=#FF0000] [font=宋体]上面那些依然是基本三件套,略[/font][/color][/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]#use rtos(timer=0, minor_cycle=100ms) // [font=宋体]使用[/font][font=Times New Roman]rtos[/font][font=宋体],使用[/font][font=Times New Roman]0[/font][font=宋体]号计时器,关于[/font][font=Times New Roman]18f14k50[/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[font=宋体]的计时器有多少个请参考[/font][font=Times New Roman]PDF[/font][font=宋体], [/font][font=Times New Roman]minor_cycle, [/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[font=宋体]将时间按多少秒来分段[/font][/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]#task(rate=1000ms, max=100ms) // [font=宋体]任务参数,[/font][font=Times New Roman]rate[/font][font=宋体]必须为[/font][font=Times New Roman]minor_cyle[/font][font=宋体]的整倍数每[/font][/font][font=宋体][/font][/size][size=4][font=宋体] void LED(); //1000ms[font=宋体]执行一次,[/font][font=Times New Roman]max[/font][font=宋体]最大执行时间,不超过上[/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[font=宋体]面定义的[/font][font=Times New Roman]minor_cyle[/font][font=宋体]的值。 跟着指定这个任务的[/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[font=宋体]函数名字[/font][/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][font=宋体][size=4][/size][/font][size=4][font=宋体]void LED() // [font=宋体]定义函数。[/font][/font][font=宋体][/font][/size][size=4][font=宋体]{[/font][font=宋体][/font][/size][size=4][font=宋体] output_toggle(PIN_C0); // output_toggle[font=宋体]()[/font][font=Times New Roman]CCS[/font][font=宋体]的函数,“开关”一个端口,上次[/font][/font][font=宋体][/font][/size][size=4][font=宋体] // [font=宋体]为开,则这次关上,上次为关,则这次打开。即端口输[/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[font=宋体]出高低变化。[/font][/font][font=宋体][/font][/size][size=4][font=宋体]}[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][font=宋体][size=4][/size][/font][size=4][font=宋体]void main(void) //[font=宋体]必备的保留节目[/font][/font][font=宋体][/font][/size][size=4][font=宋体]{[/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体] rtos_run(); // rtos[font=宋体]运行的号角[/font][/font][font=宋体][/font][/size][size=4][font=宋体]}[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][font=宋体][size=4][/size][/font][size=4][font=宋体]编译,运行,怎么样,[font=Times New Roman]LED[/font][font=宋体]也是一闪一闪的了。[/font][/font][font=宋体][/font][/size][font=宋体][/font][font=宋体][img]http://mdooxw.blu.livefilestore.com/y1pBGrz5u1_HIhY4tddTT1ITKQpsoQ19UH28SGxl_rhkqr_-tqmlhTvoU-DFS-k5eNySZh2G1O1obxHR4sWm-C1JF6mtVLNqC34/T21.jpg?psid=1[/img] [/font][font=宋体][font=宋体][font=宋体][size=4]本期先到这,因为动手的内容比较多,有兴趣[font=Times New Roman]DIY[/font][font=宋体]的不要怕麻烦,打完一盘[/font][font=Times New Roman]dota[/font][font=宋体]或者[/font][font=Times New Roman]CF[/font][font=宋体]歇歇的时间就可以用来去下载软件,运行运行例子了。[/font][/size][/font][font=宋体][size=10.5pt][/size][/font][/font][/font][font=宋体][/font]