📄 os_view.c
字号:
/*
*********************************************************************************************************
* uC/OS-View
*
* (c) Copyright 2005, Micrium, Weston, FL
* All Rights Reserved
*
*
* Filename : OS_VIEW.C
* Version : V1.33
* Programmer : JJL
*********************************************************************************************************
*/
#define OS_VIEW_GLOBALS
#include <includes.h>
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#ifndef OS_VIEW_SUPPORT_MEM
#define OS_VIEW_SUPPORT_MEM 0 /* Current version doesn't support memory Rd/Wr */
#endif
/* Inbound packets (from PC) */
#define OS_VIEW_PROTOCOL_RX_SD0 0xED /* Start delimiters */
#define OS_VIEW_PROTOCOL_RX_SD1 0x8C
#define OS_VIEW_PROTOCOL_RX_ED 0x8D /* End delimiter */
/* Outbound packets (to PC) */
#define OS_VIEW_PROTOCOL_TX_SD0 0x8C /* Start delimiters */
#define OS_VIEW_PROTOCOL_TX_SD1 0xED
#define OS_VIEW_PROTOCOL_TX_ED 0x8D /* End delimiter */
#define OS_VIEW_RX_STATE_SD0 0 /* waiting for start first start delimiter (SD0) */
#define OS_VIEW_RX_STATE_SD1 1 /* waiting for start second start delimiter (SD1) */
#define OS_VIEW_RX_STATE_LEN 2 /* waiting for len byte */
#define OS_VIEW_RX_STATE_DATA 3 /* waiting for data */
#define OS_VIEW_RX_STATE_CHKSUM 4 /* waiting for checksum */
#define OS_VIEW_RX_STATE_ED 5 /* waiting for end delimiter */
#define OS_VIEW_TX_STATE_SD0 0 /* Transmit state machine states */
#define OS_VIEW_TX_STATE_SD1 1
#define OS_VIEW_TX_STATE_DATA_LEN 2
#define OS_VIEW_TX_STATE_DATA 3
#define OS_VIEW_TX_STATE_CHKSUM 4
#define OS_VIEW_TX_STATE_ED 5
#define OS_VIEW_TX_STATE_STR_LEN 6
#define OS_VIEW_TX_STATE_STR_TYPE 7
#define OS_VIEW_TX_STATE_STR_DATA 8
#define OS_VIEW_CMD_STEP_TICK_ON 0 /* Commands for tick stepping */
#define OS_VIEW_CMD_STEP_TICK_OFF 1
#define OS_VIEW_CMD_STEP_TICK_NEXT 2
#define OS_VIEW_CPU_NAME_SIZE 30
/*$PAGE*/
/*
*********************************************************************************************************
* LOCAL VARIABLES
*********************************************************************************************************
*/
#if OS_VIEW_PARSE_TASK > 0
static OS_STK OSView_TaskStk[OS_VIEW_TASK_STK_SIZE];
#if OS_SEM_EN > 0
static OS_EVENT *OSView_Sem;
#endif
#endif
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
#if OS_VIEW_PARSE_TASK > 0
static void OSView_InitOS(void);
static void OSView_Task(void *p_arg);
#endif
static INT8U OSView_CmdParsePkt(void);
static void OSView_CmdSendToApp(void);
static void OSView_CmdGetSysInfo(void);
static void OSView_CmdGetTaskList(void);
static void OSView_CmdGetTaskInfo(void);
static void OSView_CmdGetTaskInfo_InvalidTask(void);
static INT8U OSView_CmdGetTaskInfo_TCBStat(OS_TCB *ptcb);
static void OSView_CmdMemRdINT8U(void);
static void OSView_CmdMemRdINT16U(void);
static void OSView_CmdMemRdINT32U(void);
static void OSView_CmdMemWrINT8U(void);
static void OSView_CmdMemWrINT16U(void);
static void OSView_CmdMemWrINT32U(void);
static void OSView_CmdTickStep(void);
static void OSView_CmdTrace(void);
static void OSView_RxPkt(void);
static void OSView_RxStoINT8U(INT8U rx_data);
static void OSView_RxBufClr(void);
static INT8U OSView_RxGetINT8U(void);
static INT16U OSView_RxGetINT16U(void);
static INT32U OSView_RxGetINT32U(void);
static void OSView_TxStart(void);
static void OSView_TxStoINT8U(INT8U tx_data);
static void OSView_TxStoINT16U(INT16U tx_data);
static void OSView_TxStoINT32U(INT32U tx_data);
static void OSView_TxStoPtr(void *ptr);
static void OSView_TxStoStr(INT8U *s, int max_len);
/*$PAGE*/
/*
*********************************************************************************************************
* INITIALIZE uC/OS-View
*********************************************************************************************************
*/
void OSView_Init (INT32U baud_rate)
{
#if OS_TICK_STEP_EN > 0
OSTickStepState = OS_TICK_STEP_DIS; /* Disable the tick stepping mode */
#endif
OSView_CyclesCtr = 0;
OSView_RxState = OS_VIEW_RX_STATE_SD0; /* Setup Rx and Tx state machines */
OSView_TxState = OS_VIEW_TX_STATE_SD0;
OSView_TxLen = 0;
OSView_TxStrLen = 0;
OSView_TxActiveFlag = OS_FALSE;
OSView_TerminalRxSetCallback((void (*)(INT8U))0); /* Force terminal callback function to 'nothing' */
OSView_TmrCntsPrev = 0;
#if OS_VIEW_PARSE_TASK > 0
OSView_InitOS();
#endif
OSView_InitTarget(baud_rate); /* Initialize target specific code */
}
/*$PAGE*/
/*
*********************************************************************************************************
* INITIALIZE THE uC/OS-View TASK AND OS OBJECTS
*********************************************************************************************************
*/
#if OS_VIEW_PARSE_TASK > 0
static void OSView_InitOS (void)
{
#if OS_TASK_NAME_SIZE > 7 || OS_EVENT_NAME_SIZE > 7
INT8U err;
#endif
#if OS_SEM_EN > 0
OSView_Sem = OSSemCreate(0);
#if OS_EVENT_NAME_SIZE > 17
OSEventNameSet(OSView_Sem, (INT8U *)"uC/OS-View Signal", &err);
#else
#if OS_EVENT_NAME_SIZE > 7
OSEventNameSet(OSView_Sem, (INT8U *)"OS-View", &err);
#endif
#endif
#endif
#if OS_TASK_CREATE_EXT_EN > 0
#if OS_STK_GROWTH == 1
(void)OSTaskCreateExt(OSView_Task,
(void *)0, /* No arguments passed to OSView_Task() */
&OSView_TaskStk[OS_VIEW_TASK_STK_SIZE - 1], /* Set Top-Of-Stack */
OS_VIEW_TASK_PRIO, /* Lowest priority level */
OS_VIEW_TASK_ID,
&OSView_TaskStk[0], /* Set Bottom-Of-Stack */
OS_VIEW_TASK_STK_SIZE,
(void *)0, /* No TCB extension */
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
#else
(void)OSTaskCreateExt(OSView_Task,
(void *)0, /* No arguments passed to OSView_Task() */
&OSView_TaskStk[0], /* Set Top-Of-Stack */
OS_VIEW_TASK_PRIO, /* Lowest priority level */
OS_VIEW_TASK_ID,
&OSView_TaskStk[OS_VIEW_TASK_STK_SIZE - 1], /* Set Bottom-Of-Stack */
OS_VIEW_TASK_STK_SIZE,
(void *)0, /* No TCB extension */
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
#endif
#else
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(OSView_Task,
(void *)0,
&OSView_TaskStk[OS_VIEW_TASK_STK_SIZE - 1],
OS_VIEW_TASK_PRIO);
#else
(void)OSTaskCreate(OSView_Task,
(void *)0,
&OSView_TaskStk[0],
OS_VIEW_TASK_PRIO);
#endif
#endif
#if OS_TASK_NAME_SIZE > 10
OSTaskNameSet(OS_VIEW_TASK_PRIO, (INT8U *)"uC/OS-View", &err);
#else
#if OS_TASK_NAME_SIZE > 7
OSTaskNameSet(OS_VIEW_TASK_PRIO, (INT8U *)"OS-View", &err);
#endif
#endif
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* uC/OS-View TASK
*********************************************************************************************************
*/
#if OS_VIEW_PARSE_TASK > 0
static void OSView_Task (void *p_arg)
{
INT16U len;
INT8U err;
#if OS_SEM_EN == 0 && OS_MBOX_EN > 0
void *msg;
#endif
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
(void)p_arg;
while (1) {
#if OS_SEM_EN > 0
(void)OSSemPend(OSView_Sem, 0, &err); /* Wait for a packet to be received */
#else
#if OS_MBOX_EN > 0
(void)OSMboxPend(OSView_Mbox, 0, &err); /* Wait for a packet to be received */
#endif
#endif
len = OSView_CmdParsePkt(); /* Parse packet and formulate a response */
if (len > 0) { /* If we have a response */
OS_ENTER_CRITICAL(); /* Setup transmission of the response */
OSView_TxLen = len;
OS_EXIT_CRITICAL();
OSView_TxStart();
}
}
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* uC/OS-View TASK CREATE HOOK
*
* Description: This function MUST be called by uC/OS-II's Task Create Hook function: OSTaskCreateHook().
*********************************************************************************************************
*/
void OSView_TaskCreateHook (OS_TCB *ptcb)
{
ptcb->OSTCBCyclesStart = OSView_TimeGetCycles(); /* Get the current start time for this task. */
ptcb->OSTCBCyclesTot = 0; /* Update the task's total execution time */
}
/*$PAGE*/
/*
*********************************************************************************************************
* uC/OS-View TASK SWITCH HOOK
*
* Description: This function MUST be called by uC/OS-II's Task Switch Hook function: OSTaskSwHook().
*********************************************************************************************************
*/
void OSView_TaskSwHook (void)
{
INT32U cycles;
cycles = OSView_TimeGetCycles(); /* This task is done */
OSTCBCur->OSTCBCyclesTot += cycles - OSTCBCur->OSTCBCyclesStart;
OSTCBHighRdy->OSTCBCyclesStart = cycles; /* Save absolute #cycles at task activation */
}
/*
*********************************************************************************************************
* Update 32-bits cycles counter
*
* Description: This function must be called by uC/OS-II's OSTimeTickHook() and is used to maintain a
* 32-bit counter of clock or other cycles.
*
* Returns : None
*
* Note(s) : Changes the global variable OSView_CyclesCtr
*********************************************************************************************************
*/
void OSView_TickHook (void)
{
(void)OSView_TimeGetCycles();
}
/*$PAGE*/
/*
*********************************************************************************************************
* Get time [cycles]
*
* Description: This routine is required for task execution time measurement. This function needs to
* return time as accurately as possible and in a 32-bit variable.
*
* Returns : A 32-bit representation of time.
*********************************************************************************************************
*/
INT32U OSView_TimeGetCycles (void)
{
INT32U cycles;
#if OS_VIEW_TMR_32_BITS > 0
INT32U cnts32;
INT32U cnts32_delta;
#else
INT16U cnts16;
INT16U cnts16_delta;
#endif
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
#if OS_VIEW_TMR_32_BITS > 0
cnts32 = OSView_TmrRd(); /* Read current counts of the free running counter */
cnts32_delta = cnts32 - OSView_TmrCntsPrev;
OSView_TmrCntsPrev = cnts32; /* Save current counts for next time */
OSView_CyclesCtr += cnts32_delta;
#else
cnts16 = (INT16U)OSView_TmrRd(); /* Read current counts of the free running counter */
cnts16_delta = cnts16 - OSView_TmrCntsPrev;
OSView_TmrCntsPrev = cnts16; /* Save current counts for next time */
OSView_CyclesCtr += (INT32U)cnts16_delta;
#endif
cycles = OSView_CyclesCtr;
OS_EXIT_CRITICAL();
return (cycles);
}
/*$PAGE*/
/*
*********************************************************************************************************
* uC/OS-View COMMAND HANDLER
* (Parse Packet)
*********************************************************************************************************
*/
static INT8U OSView_CmdParsePkt (void)
{
INT8U cmd0;
cmd0 = OSView_RxGetINT8U(); /* First byte contains command */
if (cmd0 == 'C') {
OSView_CmdSendToApp();
OSView_TxBufCnt = 0;
return (0);
}
if (OSView_TxBufCnt > 0) { /* Do cmds only if Tx of the last one is done */
return (0);
}
switch (cmd0) {
case 's':
OSView_TxStoINT8U(cmd0);
OSView_CmdGetSysInfo();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -