转载:有趣的uC/OS-View

转载自:http://blog.sina.com.cn/s/blog_a2c5f56e0101als3.html。感谢博主。 

   uC/OS-ViewMicrium开发的一个基于uC/OS-II的中间件监控程序,它同运行在Windows平台上的客户端程序“Viewer”通过串口配合,可以实时显示uC/OS-II及其所有任务的当前状态,例如任务栈起始地址,栈大小,任务名称,任务当前状态,任务被执行次数和CPU占用率等等。用户还可以修改内存指定地址的内容,向特定任务发送简单数据,简单控制uC/OS-II的运行,例如暂时终止时间片中断。在2006Micrium终止了uC/OS-View的开发,版本永远停留在了V1.33。它需要uC/OS-II V2.70以上,但也不能太高,因为自V2.90开始任务名称从RAM被移植到了ROM中,需要对uC/OS-View进行相应的修改,所以对于uC/OS-View V1.33最合适的uC/OS-II版本是V2.86uC/OS-View的继任者是uC/Probe,这是一个功能极其强大的监控、调试程序,它甚至可以脱离uC/OS-II环境。

虽然uC/OS-View已经被Micrium无情抛弃了,但其设计思路还是很值得学习的,对我们今后分析、设计相似系统是很有帮助的。uC/OS-View的用户手册中已经详细讲解了移植过程和“Viewer”的使用方法,这里来讲讲手册中未涉及到的一些内容。

1.通信的帧结构

首先约定,运行在uC/OS-II之上的uC/OS-View称为下位机,运行在PC上的Viewer为上位机。

上、下位机之间的通讯采用“询问-应答”方式,即上位机发起询问,下位机根据收到的指令做出相应的动作,并且决定是否需要回发应答。通讯采用帧形式,上下行通讯帧格式定义如下:

 

帧头1

帧头2

长度

命令/数据

校验和

帧尾

0xED

0x8C

Len

CMD/Data

Sum

0x8D

1 byte

1 byte

1 byte

0-255 bytes

1 byte

1 byte

下行帧(上位机至下位机)

  

帧头1

帧头2

长度

命令/数据

校验和

帧尾

0x8C

0xED

Len

CMD/Data

Sum

0x8D

1 byte

1 byte

1 byte

0-255 bytes

1 byte

1 byte

上行帧(下位机至上位机)

 

起始的2字节为帧头,接下来是1字节的长度段,指示出数据段和校验和的总长度,这里也决定了一次最多允许传送255字节用户数据。随后是校验和和帧尾,各1字节。下行帧校验和是长度段和所有数据的二进制和(8位无符号)的补码,即:

Sum = (unsigned int)((Len+Data[0-Len])&0xFF)

行帧校验和是长度段和所有数据的二进制和(8位无符号),即:

Sum = (unsigned int)((Len+Data[0-Len])&0xFF)

 

2解析命令

下位机接收数据帧时采用“状态机”法,也就是每收到1字节数据后,结合帧结构判断当前数据是否合法,并根据当前状态决定下一状态,直到收到正确帧尾。

当正确收到一帧数据后,就可以分析数据段里面包含的命令了。uC/OS-View预定义了一系列命令,命令字在数据段的第一个字节表示,见下表:

 

命令

下行数据包

字节数

上行数据包

字节数

向下位机发送1字节数据(命令`C`)

0xED

0x8C

0x02

0x43(C)

0xData

0xSum

0x8D

1

1

1

1

1

1

1

 

系统信息 (命令`s`)

0xED

0x8C

0x01

0x73(s)

0x8C

0x8D

1

1

1

1

1

1

0x8C

0xED

0x33

0x73(s)

OSTime

OSTCBCur

OS_Version

1

CPU Name

IntStkBase

IntStkSize

Sum

0x8D

1

1

1

1

4

4

2

1

30

4

4

1

1

任务信息 (命令`t`)

0xED

0x8C

0x05

0x74(t)

Task ID

Sum

0x8D

1

1

1

1

4

1

1

0x8C

0xED

Len

0x74(t)

OSViewCydesCtr

.OSTCBTaskName[]

.OSTCBTaskPrio

.OSTCBStat

.OSTCBEventPtr

.OSTCBDly

.OSTCBCyclesTot

.OSTCBCtxSwCtr

.OSTCBStkBase

.OSTCBStkSize*sizeof(OS_STK)

Sum

0x8D

1

1

1

1

4

OS_TASK_NAME_SIZE-1

1

1

4

4

4

4

4

4

1

1

任务列表 (命令`l`)

0xED

0x8C

0x01

0x6C(l)

0x93

0x8D

1

1

1

1

1

1

0x8C

0xED

Len

0x6C

OSTCBPrioTbl[0]

OSTCBPrioTbl[1]

OSTCBPrioTbl[N]

Sum

0x8D

1

1

1

1

4

4

 

4

1

1

单步 (命令`S`)

0xED

0x8C

0x02

0x53(S)

Data

Sum

0x8D

1

1

1

1

1

1

1

0x8C

0xED

0x01

0x53(S)

0x54

0x8D

1

1

1

1

1

1

跟踪 (命令`T`)

0xED

0x8C

0x01

0x54(T)

0xAB

0x8D

1

1

1

1

1

1

命令未实现

 

8bit数据(命令`b`)

0xED

0x8C

0x06

0x62(b)

Addr

N

Sum

0x8D

1

1

1

1

4

1

1

1

0x8C

0xED

N

0x62(b)

8bit Value@Addr+0

8bit Value@Addr+1

8bit Value@Addr+N-1

Sum

0x8D

1

1

1

1

1

1

 

1

1

1

16bit数据(命令`w`)

0xED

0x8C

0x06

0x77(w)

Addr

N

Sum

0x8D

1

1

1

1

4

1

1

1

0x8C

0xED

N*2

0x77(w)

16bit Value@Addr+0

16bit Value@Addr+1

16bit Value@Addr+N-1

Sum

0x8D

1

1

1

1

2

2

 

2

1

1

32bit数据(命令0x00)

0xED

0x8C

0x06

0x00

Addr

N

Sum

0x8D

1

1

1

1

4

1

1

1

0x8C

0xED

N*4

0x00

32bit Value@Addr+0

32bit Value@Addr+1

32bit Value@Addr+N-1

Sum

0x8D

1

1

1

1

4

4

 

4

1

1

18bit数据 (命令`1`)

0xED

0x8C

0x06

0x31(1)

Addr

Value

Sum

0x8D

1

1

1

1

4

1

1

1

0x8C

0xED

0x01

0x31(1)

0x32

0x8D

1

1

1

1

1

1

116bit数据 (命令`2`)

0xED

0x8C

0x07

0x32(2)

Addr

Value

Sum

0x8D

1

1

1

1

4

2

1

1

0x8C

0xED

0x01

0x32(2)

0x32

0x8D

1

1

1

1

1

1

132bit数据 (命令`4`)

0xED

0x8C

0x09

0x34(4)

Addr

Value

Sum

0x8D

1

1

1

1

4

4

1

1

0x8C

0xED

0x01

0x34(4)

0x32

0x8D

1

1

1

1

1

1

 

3.移植实例

移植的uC/OS-II版本号为2.86uC/OS-View1.33,编译环境为WinAVR-20100110

硬件平台是一个ATmega644最小系统。一个用来显示多任务运行情况的LED接到PB1利用644UART来连接到PC644外部晶振14.7456MHz,系统Timetick设置为10ms

posted @ 2017-03-02 09:44  thinkwhat  阅读(294)  评论(0编辑  收藏  举报