续<<初写MCU的困惑>>
在硬件规划好后,规划软件的写法,执行任务较多时,首先是考虑运行时间够不够,当然MCU不是奔腾,是要斤斤计较时间问题的,下面是说下自己的软件规划方法.
首先看需要的功能哪个部分需要的循环时间最短,现举个例子: 有按键扫描,红外遥控接收,I2C传输,写LCD显示,RTC等.(有人习惯遥控接收用中断,有人不用中断,为了体现关于时间的划分,下面也不采用中断).下图是硬件简单描述(假设):
需要的最短扫描就是遥控接收了(惯例100US),我要把时间切成每50US一个时间片,每200个时间片一个循环,如下图:
1.遥控接收部分:占用1.3.5.7.9.....199.1 等时间片,此时的扫描周期刚好是100US,一般音频设备使用的是HT6221或PT2221等发射IC,在写判断1或0脉冲时,时间检测不要写的太精密,留+-100US公差.
2.ENCODE检测也不用中断,1MS扫描一次,50US*20=1MS,用2.22.42.......182.2等时间片.
3.按键检测,每10MS扫描一次,用时间片0.
4.LCD驱动刷新,HT1621是3线传输,可是与标准SPI BIT数不一样,咱也只好用一般I/O传输.给它安排时间片4.两次刷新的间隔最短是10MS.
5.I2C传输假设是VOLUME控制IC,虽然16F877带I2C功能,咱也不用,用I/O模拟.安排时间片6.两次刷新的间隔最短是10MS.
6.其他设备用一般I/O控制,安排时间片8.两次刷新的间隔最短是10MS.
7.周器是0.5S,全部的子程序只有这个要求一定要时间准,咱在定时中断里加几句计数,累积到1000返回,1000*50US=0.5S,秒.分.时.天.的处理放在第10时间片.
以上时间片安排,大家留意一下,在每一个时间片里,最多处理一个子程序,而且还可以加很多子程序.没有使用多个中断资源,就用了一个定时器中断.RTC的时间照样很准.其它子程序时间延迟点无所谓,只是别延迟太久了,象LCD和模拟I2C可能时间长点,想办法分到几个时间片里去完成.
子程序之间的通信,建议你单独留出一点RAM,初始化时指定给某些子程序用,或开个时间片处理之间的通信,这点不多讲了,留给有兴趣的人去考虑.这写法是不是也可以叫"多任务"呢?但不是抢断式的,这样设备的程序也不需要抢断.8051 KEIL里有带个RTOS,我只是不太喜欢用它,比较麻烦,用的时候不太灵活,每个任务要求的周期也大.资源也需要的多.
不管用啥方法,只要能满足产品要求就行.以后如果有时间,会写点嵌入式的东西(ARM----LINUX)!我老是在笑自己是不是走的土八路的道路,表达方式欠佳,很可能没人看的懂!如果是,就当你没看到过,但是我不希望你打击我的写博热情!
用户388096 2007-8-9 08:43
安排得不错,不过有一个缺点,必须保证每个子程序执行时间不能超过50US.否则会有跳时间片.
不知所说是否有理,请指教