转载自:http://blog.sina.com.cn/s/blog_a2c5f56e0101als3.html。感谢博主。
uC/OS-View是Micrium开发的一个基于uC/OS-II的中间件监控程序,它同运行在Windows平台上的客户端程序“Viewer”通过串口配合,可以实时显示uC/OS-II及其所有任务的当前状态,例如任务栈起始地址,栈大小,任务名称,任务当前状态,任务被执行次数和CPU占用率等等。用户还可以修改内存指定地址的内容,向特定任务发送简单数据,简单控制uC/OS-II的运行,例如暂时终止时间片中断。在2006年Micrium终止了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.86。uC/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 |
写1个8bit数据 (命令`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 |
写1个16bit数据 (命令`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 |
写1个32bit数据 (命令`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.86,uC/OS-View为1.33,编译环境为WinAVR-20100110
硬件平台是一个ATmega644最小系统。一个用来显示多任务运行情况的LED接到PB1,利用644的UART来连接到PC。644外部晶振14.7456MHz,系统Timetick设置为10ms。