基于μC/OS-II的Modbus协议测试系统
3 软件设计
μC/OS-II下应用程序设计主要是根据系统的功能需要划分不同的任务和中断,并为每个 任务分配不同的优先级。一个任务通常是一个无限的循环,看起来像其它C的函数一样,有 函数返回类型,有形式参数变量,但任务是决不会返回的,因此返回参数类型必须定义为 void。为了使μC/OS-II能管理用户任务,用户必须在建立一个任务的时候,将任务的起始地 址与其它参数一起传给OSTaskCreate()或OSTaskCreateExt()。
中断和任务以及任务与任务之间的同步可通过信号量实现。下面以Modbus协议测试程 序中RTU模式下字符时间间隔的测量为例介绍μC/OS-II程序设计中任务和中断的划分。Modbus的RTU模式中规定[3]:RTU模式下必须以连续的字符流发送整个报文帧,同一个 帧中两个字符之间的空闲时间Δt不能大于1.5个字符时间(称为t1.5),否则就认为报文帧不完 整;不同报文帧之间需要时长至少为3.5个字符的空闲时间,这个时间区间被称为t3.5。RTU 模式下的信息帧如图2所示。
图2 RTU模式的信息帧
为了记录RTU 帧中一个字符结束时间和另一个字符的起始时间,系统分别使用串口中 断Uart_ISR 和IO 中断PE24_ISR 分别对这两个时刻进行捕捉。这需要将HMS30C7202 的串 口中断时机设置为接收完一个字符后,将通用I/O 端口线PE24 设为允许中断、下降沿触发。
为了缩短关中断时间和中断处理时间,可将中断的处理放在任务中进行。在主任务中调 用OSTaskCreate函数分别建立串口接收处理任务Uart_Task和IO口处理任务PE24_Task。在 μC/OS-II中,有一个全局的系统时钟,维护着一个全局时间变量。在Uart_Task和PE24_Task这两个任务中分别通过读取当前全局时间变量来实现对字符起始时间和结束时间的连续测 量。系统利用μC/OS-II中信号量机制实现中断与任务之间的同步[3][4],信号量必须在系统启 动的时候初始化,利用信号量实现任务与中断同步的过程如图3所示。
图 3 利用信号量实现任务与中断同步
评论