新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 一个抢先式“裸奔\"系统的设计

一个抢先式“裸奔\"系统的设计

作者:时间:2018-09-07来源:网络收藏

摘要:在一些资源比较紧张的嵌入式中,使用RTOS有时未必能够较好地满足较高的实时性要求。在软件设计时,可以借鉴抢先式RTOS实时调度内核的方法,实现更为高效的任务调度算法,从而实现更高的实时性要求。
关键词:嵌入式系统;抢先式调度;实时操作系统;STC12C5410

引言
这是2007年笔者在基于STC12C5410的工控系统里采用的软件技术。系统中有两个以主从方式通过I2C总线进行数据通信的节点,作为I2C总线的从机节点,因MCU性能限制了数据传输速率,因而每次通过总线传输30个字节的数据需要持续占用几十ms的时间。由于在进行I2C总线通信的这段时间里,系统将不能响应输入和改变输出(类似系统停顿),这么长的时间延迟对于有较高实时要求的工控系统显得难于容忍。
为此,最初考虑解决问题的办法有3个:
①打断和拆分数据包,采用多次传输的办法。这样做不但需要修改从机的软件,多个数据包的连接又让软件变得复杂起来,所以这不是个很好的办法。
②由于I2C总线在进行数据传输中,波特率较低,存在大量短时delay(),可以采用定时中断,在定时中断中只变换一次电平后就返回,从而在后台完成数据发送。但这样就导致中断服务中必须执行一个很庞大的状态机判断,中断服务中大量的判断也非常耗时耗力,且调试也不方便。
③采用RTOS技术,但在80C51系统上使用RTOS,再精练的实时调度,每个tick的时间都很难低于1 ms。经测试,I2C总线传输中途遇到1 ms以上的传输中断,会产生总线超时错误,因而在本系统中即使采用RTOS也未必能很好地解决问题。
通过一段时间对RTOS的分析和研究,最后在80C51的裸奔系统中嵌入特别定制的精练的抢先式调度来完成主要任务和I2C总线任务的并行执行,最终获得了很好的效果。
下面就来详细地讲述这个定制的抢先式调度的编程技巧。

1 I2C总线通信子程序
对I2C总线的时序在此就不作介绍了,下面是部分基于Keil C51模拟主I2C总线的通信子程序代码如下:


上面是基于80C51模拟I2C总线的通信程序,其中的HIGH、LOW是1、0的宏定义,idelay()提供时序要求的一段时间的延时。
不难看出,这和通常的模拟I2C总线的通信子程序完全一样。事实上,我也是直接使用了以前的子程序。


上一页 1 2 3 下一页

关键词: 系统

评论


相关推荐

技术专区

关闭