uc/os-ii启动后,即调用Osstart()后,系统的数据结构怎样
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uc/os-ii启动后,即调用Osstart()后,系统的数据结构怎样相关的知识,希望对你有一定的参考价值。
参考技术A 书上说ucos移植时,调用OSStart()后启动时钟节拍,即在第一个任务中允许时钟节拍中断int
main(void)
BSP_Init();
OSInit();
OSTaskCreate(Task_START,(void
*)0,
&startup_task_stk[STARTUP_TASK_STK_SIZE-1],
STARTUP_TASK_PRIO);
OSStart();//启动各项任务后,任务就由操作系统来管理和调度
return
0;
这是主函数
...
ucos
ii
并不是每个节拍都进行任务切换,只是每个时钟节拍都去判断是否要进行任务切换;\r\n就算有一个优先级很高的任务每个节拍都要切换,那么也不用担心,因为这个任务不可能在整个节拍的时间里都需要运行,那么一个节拍是10ms,它运行5ms,那么剩下的时间进入的是延时函数,延时函数里便能进行任务切换,让优先级低的任务得以运行。所以这个不用担心。
uC/OSII编程中的问题,程序出错,停在OSStart()那了
OS_EVENT
*QSemB;
OS_EVENT
*QSemC;
OS_EVENT
*AppSemSend[MAX_TCP_LINKS];
OS_EVENT
*AppSemCon[MAX_TCP_LINKS];
OS_EVENT
*AppSemDisc[MAX_TCP_LINKS];
void
*QMsgTbB[100];
void
*QMsgTbC[100];
void
*QMsgTbD[100];
void
*QMsgTbE[100];
char
rxmsg;
ARPKT
arpkt;
IPKT
ipkt;
ICMPKT
icmpkt;
UDPKT
udpkt;
int
rfv1,da_d;
OS_STK
Main_Stack[TASK_STACK_SIZE]=
0,
;
void
Main_Task(void
*Id);
#define
Main_PRIO
20
OS_STK
TaskB_Stack[TASK_STACK_SIZE]=
0,
;
void
TaskB_Task(void
*Id);
#define
TaskB_PRIO
12
OS_STK
TaskC_Stack[TASK_STACK_SIZE]=
0,
;
void
TaskC_Task(void
*Id);
#define
TaskC_PRIO
14
void
Main_Task(void
*Id)
GENFRAME
*gft;
WORD
dtype;
ARMTargetStart();
OSTaskCreate(TaskB_Task,
(void
*)0,
(OS_STK
*)&TaskB_Stack[TASK_STACK_SIZE-1],
TaskB_PRIO);
OSTaskCreate(TaskC_Task,
(void
*)0,
(OS_STK
*)&TaskC_Stack[TASK_STACK_SIZE-1],
TaskC_PRIO);
while(1)
OS_ENTER_CRITICAL();
OS_EXIT_CRITICAL();
OSTimeDly(100);
void
TaskB_Task(void
*pdata)
//arp
INT8U
eer;
ARPKT
*arp;
NODE
node;
char
*jrxmsg=0;
int
txlen,ret=0;
while
(1)
Uart_Printf("do_poll1!
");
OSTimeDly(50);
void
TaskC_Task(void
*pdata)
//icmp
INT8U
eer;
IPKT
*ip1;
ICMPKT
*icmp;
int
txlen,len;
NODE
node;
char
*jrxmsg=0;
Delay(100);
while
(1)
Uart_Printf("do_poll2!");
OSTimeDly(50);
void
Main(void)
ChangePllValue(88,10,0);
rBWSCON=0x11111012;
//BANK2
IS
8
BIT
MODE
Port_Init();
Uart_Init(0,115200);
Led_Display1(0xf);
Uart_Select(0);
//Select
UART0//
//
Beep(0x1);
Uart_Printf("\n---------------------------------------------------------------");
Beep(0x00);
Uart_Printf("\nOEM
name
:
LiYuTai
Elec.Co.,Ltd.
");
Uart_Printf("\nWebsite
:
www.hzlitai.com.cn
");
Uart_Printf("\nEmail
:
lyt_tech@yahoo.com.cn
");
Uart_Printf("\nFunction
:
ARMSYS44b0's
Datagram
Test
Program
");
Uart_Printf("\nUART
config:
115.2kbps,8Bit,NP,UART0
");
Uart_Printf("\n---------------------------------------------------------------");
Uart_Printf("\nS3C44B0X
Test
Program
Ver
2.0
rSYSCFG=0x%x
MCLK=%dHz\n",rSYSCFG,MCLK);
Led_Display1(0x0);
Lcd_Init();
ARMTargetInit();//initialize
Target
//
Init
uCOS-II
OSInit();
//Create
the
Main
Task
OSTaskCreate(Main_Task,
(void
*)0,
(OS_STK
*)&Main_Stack[TASK_STACK_SIZE-1],
Main_PRIO);
QSemB=OSQCreate(&QMsgTbB[0],100);
QSemC=OSQCreate(&QMsgTbC[0],100);
/*
Start
uCOS-II
*/
OSStart();
以上为主程序的一部分,编译没有问题,上JTAG测试的时候老师出错,单步运行有时出错在一开始,有时出错在OSStart();那里,请高人指点迷津!不甚感激!!!
在什么系统上调试的
是不是汇编部分没有做好
你是在ARM系统上调试的
在arm上调试ucos的时候,OSStart()一运行,就开始启动定时器,二这个定时器是系统运行必须的
jtag无法调试定时器
就是说在jtag下,你只能让UCOS全速运行,无法单步运行
设置断点运行也可以
UC
OS-II
函数局部变量存在哪里?
内核结构:临界段、任务、任务状态、任务控制块(OS-TCB)、就绪表、任务调度、给调度器上锁和开锁、空闲任务(IDLE
TASK)、统计任务、中断处理、时钟节拍、UCOS2初始化和启动。
void
task1(void)
INT32U
count=0;
start_Tick();
while(1)
printf("count;",count++);
OSTIMEDLY(25);
void
task2(void)
INT32U
count=0;
Ticker_init(OS_TICKS_PER_SEC);
while(1)
printf("count;",count++);
OSTIMEDLY(50);
void
main()
sysinit();
OSInit();
OSTASKCREAT(Task1,(void*)&Task1Data,
(void*)&Task1STK[TASK_STK_SIZE],TASK1prio);
OSTASKCREAT(TASK2)
OSSTART();
例子中的UCOS系统中有3个任务。TASK1和TASK2仅仅是进行延时、研时不同的时间片、代码如图示。另一个是空闲任务,是UCOS启动时自动创建的。
UCOS运行开始于MAIN函数,代码如图。MAIN函数首先调用sysinit(),该函数不是操作系统本身具有的,是一个自行编写的函数,用来做一些针对具体系统的初始化工作,这个函数不是必须的。
Osinit,这个函数是UCOS的系统函数,是UCOS启动时必须调用的。它主要是用来对UCOS内核中的各种数据结构做初始化工作。(同样是INT,在有的CPU体系结构中是16BIT,在有的CPU体系结构中是32BIT)此外它还会建立空闲任务IDLE
TASK,这个任务总是处于就绪态,优先级总是设为最低,这个任务从代码角度讲只是对一个全局变量OSIDLECTR做累加,它的作用是在系统空闲时消耗CPU时间。如果统计任务允许OS-TASK-STAT-EN和任务建立扩展允许都设为1,则OSinit()还得建立统计任务OSTaskstat()并且让其进入就绪态,优先级总是设为OS-LOWEST-PRIO-1。
接下来,2次调用OSTASKCREAT(),创建2个任务:TASK1和TASK2。从代码中我们看到有2个变量:TASK1STK和TASK2STK,分别为2个任务的堆栈,这个在前面提到过,UCOS的堆栈大小是可以根据需要定制的,从代码的角度讲,任务的堆栈是以全局数组的形式来实现的。调用OSTASKCREAT()时还有2个参数:TASK1PRIO和TASK2PRIO,它们表示的是任务的优先级,在例子中TASK2的任务优先级高于TASK1。需要注意,在MAIN函数中至少要建立一个任务,否则UCOS无法正常进行。
最后MAIN()函数调用OSSTART(),这个函数做的工作是从任务就绪表中找到优先级最高的任务的任务控制块,之后,OSSTART()调用高优先级就绪任务启动函数OSSTARTHIGHRDY(),这个函数与选择的微处理器有关,它是在针对具体平台进行移植时自行编写的。OSSTARTHIGHRDY()使已经创建的任务中优先级最高的任务开始运行,之后程序是不会返回OSSTART()的,本例子中TASK2首先开始执行。
再返回到程序清单,可以看到TASK2于TASK1相比唯一的不同就是TASK2执行的第一个语句是调用函数TICKER——INIT(),这是个自行编写的函数,作用是设置定时器,从而为操作系统运行提供时钟节拍。之所以这样是由于UCOS的结构造成的,UCOS要求在OSSTART()运行后才能打开定时器中断。如果不这样做的话,时钟节拍中断有可能在UCOS启动第一个任务之前发生,此时UCOS处于不确定状态之中,程序有可能崩溃。
之后,UCOS就开始了运转,对于例子来说就是TASK1和TASK2以及空闲任务轮番工作。
uC/OS-II邮箱(mbox)块
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
* MESSAGE MAILBOX MANAGEMENT
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* File : OS_MBOX.C
* By : Jean J. Labrosse
*********************************************************************************************************
*/
#ifndef OS_MASTER_FILE
#include "includes.h"
#endif
#if OS_MBOX_EN > 0
/*
*********************************************************************************************************
* ACCEPT MESSAGE FROM MAILBOX
*
* Description: This function checks the mailbox to see if a message is available. Unlike OSMboxPend(),
* OSMboxAccept() does not suspend the calling task if a message is not available.
*
* Arguments : pevent is a pointer to the event control block
*
* Returns : != (void *)0 is the message in the mailbox if one is available. The mailbox is cleared
* so the next time OSMboxAccept() is called, the mailbox will be empty.
* == (void *)0 if the mailbox is empty or,
* if ‘pevent‘ is a NULL pointer or,
* if you didn‘t pass the proper event pointer.
*********************************************************************************************************
*/
#if OS_MBOX_ACCEPT_EN > 0
//checks the mailbox to see if a message is available.
//任务在请求邮箱失败也可以不进行等待二继续运行 则调用此函数
void *OSMboxAccept (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
void *msg;
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate ‘pevent‘ */
return ((void *)0);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
return ((void *)0);
}
#endif
OS_ENTER_CRITICAL();
msg = pevent->OSEventPtr;
pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
OS_EXIT_CRITICAL();
return (msg); /* Return the message received (or NULL) */
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE A MESSAGE MAILBOX
*
* Description: This function creates a message mailbox if free event control blocks are available.
*
* Arguments : msg is a pointer to a message that you wish to deposit in the mailbox. If
* you set this value to the NULL pointer (i.e. (void *)0) then the mailbox
* will be considered empty.
*
* Returns : != (OS_EVENT *)0 is a pointer to the event control clock (OS_EVENT) associated with the
* created mailbox
* == (OS_EVENT *)0 if no event control blocks were available
*********************************************************************************************************
*/
//This function creates a message mailbox if free event control blocks are available.
OS_EVENT *OSMboxCreate (void *msg)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_EVENT *pevent;
if (OSIntNesting > 0) { /* See if called from ISR ... */
return ((OS_EVENT *)0); /* ... can‘t CREATE from an ISR */
}
OS_ENTER_CRITICAL();
//Get next free event control block
pevent = OSEventFreeList; /* Get next free event control block */
if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
OS_EXIT_CRITICAL();
//创建邮箱
if (pevent != (OS_EVENT *)0) {
pevent->OSEventType = OS_EVENT_TYPE_MBOX;
pevent->OSEventCnt = 0;
//msg指向消息邮箱缓冲区
pevent->OSEventPtr = msg; /* Deposit message in event control block */
OS_EventWaitListInit(pevent);
}
return (pevent); /* Return pointer to event control block */
}
/*$PAGE*/
/*
*********************************************************************************************************
* DELETE A MAIBOX
*
* Description: This function deletes a mailbox and readies all tasks pending on the mailbox.
*
* Arguments : pevent is a pointer to the event control block associated with the desired
* mailbox.
*
* opt determines delete options as follows:
* opt == OS_DEL_NO_PEND Delete the mailbox ONLY if no task pending
* opt == OS_DEL_ALWAYS Deletes the mailbox even if tasks are waiting.
* In this case, all the tasks pending will be readied.
*
* err is a pointer to an error code that can contain one of the following values:
* OS_NO_ERR The call was successful and the mailbox was deleted
* OS_ERR_DEL_ISR If you attempted to delete the mailbox from an ISR
* OS_ERR_INVALID_OPT An invalid option was specified
* OS_ERR_TASK_WAITING One or more tasks were waiting on the mailbox
* OS_ERR_EVENT_TYPE If you didn‘t pass a pointer to a mailbox
* OS_ERR_PEVENT_NULL If ‘pevent‘ is a NULL pointer.
*
* Returns : pevent upon error
* (OS_EVENT *)0 if the mailbox was successfully deleted.
*
* Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
* the mailbox MUST check the return code of OSMboxPend().
* 2) OSMboxAccept() callers will not know that the intended mailbox has been deleted!
* 3) This call can potentially disable interrupts for a long time. The interrupt disable
* time is directly proportional to the number of tasks waiting on the mailbox.
* 4) Because ALL tasks pending on the mailbox will be readied, you MUST be careful in
* applications where the mailbox is used for mutual exclusion because the resource(s)
* will no longer be guarded by the mailbox.
*********************************************************************************************************
*/
#if OS_MBOX_DEL_EN > 0
//This function deletes a mailbox and readies all tasks pending on the mailbox.
OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
BOOLEAN tasks_waiting;
//各种判断
if (OSIntNesting > 0) { /* See if called from ISR ... */
*err = OS_ERR_DEL_ISR; /* ... can‘t DELETE from an ISR */
return (pevent);
}
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate ‘pevent‘ */
*err = OS_ERR_PEVENT_NULL;
return (pevent);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
*err = OS_ERR_EVENT_TYPE;
return (pevent);
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on mailbox */
tasks_waiting = TRUE; /* Yes */
} else {
tasks_waiting = FALSE; /* No */
}
switch (opt) {
//Delete mailbox only if no task waiting
case OS_DEL_NO_PEND: /* Delete mailbox only if no task waiting */
if (tasks_waiting == FALSE) {
pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
OSEventFreeList = pevent; /* Get next free event control block */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return ((OS_EVENT *)0); /* Mailbox has been deleted */
} else {
OS_EXIT_CRITICAL();
*err = OS_ERR_TASK_WAITING;
return (pevent);
}
//Always delete the mailbox
case OS_DEL_ALWAYS: /* Always delete the mailbox */
while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for mailbox */
OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX);
}
pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
OSEventFreeList = pevent; /* Get next free event control block */
OS_EXIT_CRITICAL();
//Reschedule only if task(s) were waiting
if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
OS_Sched(); /* Find highest priority task ready to run */
}
*err = OS_NO_ERR;
return ((OS_EVENT *)0); /* Mailbox has been deleted */
default:
OS_EXIT_CRITICAL();
*err = OS_ERR_INVALID_OPT;
return (pevent);
}
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* PEND ON MAILBOX FOR A MESSAGE
*
* Description: This function waits for a message to be sent to a mailbox
*
* Arguments : pevent is a pointer to the event control block associated with the desired mailbox
*
* timeout is an optional timeout period (in clock ticks). If non-zero, your task will
* wait for a message to arrive at the mailbox up to the amount of time
* specified by this argument. If you specify 0, however, your task will wait
* forever at the specified mailbox or, until a message arrives.
*
* err is a pointer to where an error message will be deposited. Possible error
* messages are:
*
* OS_NO_ERR The call was successful and your task received a
* message.
* OS_TIMEOUT A message was not received within the specified timeout
* OS_ERR_EVENT_TYPE Invalid event type
* OS_ERR_PEND_ISR If you called this function from an ISR and the result
* would lead to a suspension.
* OS_ERR_PEVENT_NULL If ‘pevent‘ is a NULL pointer
*
* Returns : != (void *)0 is a pointer to the message received
* == (void *)0 if no message was received or,
* if ‘pevent‘ is a NULL pointer or,
* if you didn‘t pass the proper pointer to the event control block.
*********************************************************************************************************
*/
// This function waits for a message to be sent to a mailbox
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
void *msg;
//各种判断
if (OSIntNesting > 0) { /* See if called from ISR ... */
*err = OS_ERR_PEND_ISR; /* ... can‘t PEND from an ISR */
return ((void *)0);
}
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate ‘pevent‘ */
*err = OS_ERR_PEVENT_NULL;
return ((void *)0);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
*err = OS_ERR_EVENT_TYPE;
return ((void *)0);
}
#endif
OS_ENTER_CRITICAL();
msg = pevent->OSEventPtr;
if (msg != (void *)0) { /* See if there is already a message */
pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return (msg); /* Return the message received (or NULL) */
}
//Message not available, task will pend
OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
//Suspend task until event or timeout occurs
OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
OS_EXIT_CRITICAL();
OS_Sched(); /* Find next highest priority task ready to run */
OS_ENTER_CRITICAL();
msg = OSTCBCur->OSTCBMsg;
if (msg != (void *)0) { /* See if we were given the message */
OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
OSTCBCur->OSTCBStat = OS_STAT_RDY;
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return (msg); /* Return the message received */
}
// Timed out, Make task ready
OS_EventTO(pevent); /* Timed out, Make task ready */
OS_EXIT_CRITICAL();
*err = OS_TIMEOUT; /* Indicate that a timeout occured */
return ((void *)0); /* Return a NULL message */
}
/*$PAGE*/
/*
*********************************************************************************************************
* POST MESSAGE TO A MAILBOX
*
* Description: This function sends a message to a mailbox
*
* Arguments : pevent is a pointer to the event control block associated with the desired mailbox
*
* msg is a pointer to the message to send. You MUST NOT send a NULL pointer.
*
* Returns : OS_NO_ERR The call was successful and the message was sent
* OS_MBOX_FULL If the mailbox already contains a message. You can can only send one
* message at a time and thus, the message MUST be consumed before you
* are allowed to send another one.
* OS_ERR_EVENT_TYPE If you are attempting to post to a non mailbox.
* OS_ERR_PEVENT_NULL If ‘pevent‘ is a NULL pointer
* OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
*********************************************************************************************************
*/
#if OS_MBOX_POST_EN > 0
//This function sends a message to a mailbox
INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate ‘pevent‘ */
return (OS_ERR_PEVENT_NULL);
}
if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
return (OS_ERR_POST_NULL_PTR);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task waiting on event */
OS_EXIT_CRITICAL();
OS_Sched(); /* Find highest priority task ready to run */
return (OS_NO_ERR);
}
if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn‘t already have a msg */
OS_EXIT_CRITICAL();
return (OS_MBOX_FULL);
}
pevent->OSEventPtr = msg; /* Place message in mailbox */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* POST MESSAGE TO A MAILBOX
*
* Description: This function sends a message to a mailbox
*
* Arguments : pevent is a pointer to the event control block associated with the desired mailbox
*
* msg is a pointer to the message to send. You MUST NOT send a NULL pointer.
*
* opt determines the type of POST performed:
* OS_POST_OPT_NONE POST to a single waiting task
* (Identical to OSMboxPost())
* OS_POST_OPT_BROADCAST POST to ALL tasks that are waiting on the mailbox
*
* Returns : OS_NO_ERR The call was successful and the message was sent
* OS_MBOX_FULL If the mailbox already contains a message. You can can only send one
* message at a time and thus, the message MUST be consumed before you
* are allowed to send another one.
* OS_ERR_EVENT_TYPE If you are attempting to post to a non mailbox.
* OS_ERR_PEVENT_NULL If ‘pevent‘ is a NULL pointer
* OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
*
* Warning : Interrupts can be disabled for a long time if you do a ‘broadcast‘. In fact, the
* interrupt disable time is proportional to the number of tasks waiting on the mailbox.
*********************************************************************************************************
*/
#if OS_MBOX_POST_OPT_EN > 0
//This function sends a message to a mailbox 这函数可以以广播的形式发送一个邮箱信息
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
//各种验证判断
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate ‘pevent‘ */
return (OS_ERR_PEVENT_NULL);
}
if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
return (OS_ERR_POST_NULL_PTR);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
// Do we need to post msg to ALL waiting tasks
if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
while (pevent->OSEventGrp != 0x00) { /* Yes, Post to ALL tasks waiting on mailbox */
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);
}
} else {
// Find highest priority task ready to run 否则就发送最高优先级的信息
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* No, Post to HPT waiting on mbox */
}
OS_EXIT_CRITICAL();
OS_Sched(); /* Find highest priority task ready to run */
return (OS_NO_ERR);
}
if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn‘t already have a msg */
OS_EXIT_CRITICAL();
return (OS_MBOX_FULL);
}
pevent->OSEventPtr = msg; /* Place/放置 message in mailbox */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* QUERY A MESSAGE MAILBOX
*
* Description: This function obtains information about a message mailbox.
*
* Arguments : pevent is a pointer to the event control block associated with the desired mailbox
*
* pdata is a pointer to a structure that will contain information about the message
* mailbox.
*
* Returns : OS_NO_ERR The call was successful and the message was sent
* OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non mailbox.
* OS_ERR_PEVENT_NULL If ‘pevent‘ is a NULL pointer
*********************************************************************************************************
*/
#if OS_MBOX_QUERY_EN > 0
//This function obtains information about a message mailbox.
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT8U *psrc;
INT8U *pdest;
#if OS_ARG_CHK_EN > 0
//验证
if (pevent == (OS_EVENT *)0) { /* Validate ‘pevent‘ */
return (OS_ERR_PEVENT_NULL);
}
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
// Copy message mailbox wait list
pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
psrc = &pevent->OSEventTbl[0];
pdest = &pdata->OSEventTbl[0];
#if OS_EVENT_TBL_SIZE > 0
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 1
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 2
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 3
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 4
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 5
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 6
*pdest++ = *psrc++;
#endif
#if OS_EVENT_TBL_SIZE > 7
*pdest = *psrc;
#endif
pdata->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif /* OS_MBOX_QUERY_EN */
#endif /* OS_MBOX_EN */
以上是关于uc/os-ii启动后,即调用Osstart()后,系统的数据结构怎样的主要内容,如果未能解决你的问题,请参考以下文章