• 转载:有趣的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

  • 相关阅读:
    Tarjan求LCA
    过滤器、监听器、拦截器的区别
    java操作Redis缓存设置过期时间
    Redis和Memcached区别,Redis的过期策略
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    Memcached和Redis在Linux下的安装
    jmeter学习
    用FastDFS一步步搭建文件管理系统
    version control
    关于Linux的防火墙命令和端口占用查询
  • 原文地址:https://www.cnblogs.com/longbiao831/p/6488992.html
Copyright © 2020-2023  润新知