mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
message追加。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@151 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
4f7ade393f
commit
9d03ef2964
@ -38,9 +38,10 @@ SRCS = \
|
|||||||
os_exception.c \
|
os_exception.c \
|
||||||
os_thread.c \
|
os_thread.c \
|
||||||
os_context.c \
|
os_context.c \
|
||||||
|
os_mutex.c \
|
||||||
|
os_message.c \
|
||||||
os_cache.c \
|
os_cache.c \
|
||||||
os_printf.c \
|
os_printf.c \
|
||||||
os_mutex.c \
|
|
||||||
|
|
||||||
TARGET_LIB = libos$(BROM_LIBSUFFIX).a
|
TARGET_LIB = libos$(BROM_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
@ -40,8 +40,9 @@ SRCS = \
|
|||||||
os_interrupt.c \
|
os_interrupt.c \
|
||||||
os_exception.c \
|
os_exception.c \
|
||||||
os_thread.c \
|
os_thread.c \
|
||||||
os_mutex.c \
|
|
||||||
os_context.c \
|
os_context.c \
|
||||||
|
os_mutex.c \
|
||||||
|
os_message.c \
|
||||||
os_cache.c \
|
os_cache.c \
|
||||||
os_printf.c \
|
os_printf.c \
|
||||||
|
|
||||||
|
|||||||
221
trunk/bootrom/build/libraries/os/common/os_message.c
Normal file
221
trunk/bootrom/build/libraries/os/common/os_message.c
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlSDK - OS
|
||||||
|
File: os_message.c
|
||||||
|
|
||||||
|
Copyright 2003-2008 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <brom/os.h>
|
||||||
|
#include <brom/os/common/message.h>
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInitMessageQueue
|
||||||
|
|
||||||
|
Description: initialize message queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msgArray buffer for message queue
|
||||||
|
msgCount max massage size for buffer
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount)
|
||||||
|
{
|
||||||
|
osInitThreadQueue(&mq->queueSend);
|
||||||
|
osInitThreadQueue(&mq->queueReceive);
|
||||||
|
mq->msgArray = msgArray;
|
||||||
|
mq->msgCount = msgCount;
|
||||||
|
mq->firstIndex = 0;
|
||||||
|
mq->usedCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osSendMessage
|
||||||
|
|
||||||
|
Description: send message to message queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is sent
|
||||||
|
flags whether wait or not when queue is full
|
||||||
|
|
||||||
|
Returns: TRUE if send
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osSendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags)
|
||||||
|
{
|
||||||
|
OSIntrMode enabled;
|
||||||
|
s32 lastIndex;
|
||||||
|
|
||||||
|
enabled = osDisableInterrupts();
|
||||||
|
|
||||||
|
while (mq->msgCount <= mq->usedCount) // check for full queue
|
||||||
|
{
|
||||||
|
if (!(flags & OS_MESSAGE_BLOCK))
|
||||||
|
{
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Yield
|
||||||
|
osSleepThread(&mq->queueSend);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store message
|
||||||
|
lastIndex = (mq->firstIndex + mq->usedCount) % mq->msgCount;
|
||||||
|
mq->msgArray[lastIndex] = msg;
|
||||||
|
mq->usedCount++;
|
||||||
|
|
||||||
|
// Wakeup receiving threads if any
|
||||||
|
osWakeupThread(&mq->queueReceive);
|
||||||
|
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osReceiveMessage
|
||||||
|
|
||||||
|
Description: receive message from message queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is received
|
||||||
|
flags whether wait or not when queue is empty
|
||||||
|
|
||||||
|
Returns: TRUE if reveice
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags)
|
||||||
|
{
|
||||||
|
OSIntrMode enabled;
|
||||||
|
|
||||||
|
enabled = osDisableInterrupts();
|
||||||
|
|
||||||
|
while (mq->usedCount == 0) // check for empty queue
|
||||||
|
{
|
||||||
|
if (!(flags & OS_MESSAGE_BLOCK))
|
||||||
|
{
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Yield
|
||||||
|
osSleepThread(&mq->queueReceive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy-out message
|
||||||
|
if (msg != NULL)
|
||||||
|
{
|
||||||
|
*msg = mq->msgArray[mq->firstIndex];
|
||||||
|
}
|
||||||
|
mq->firstIndex = (mq->firstIndex + 1) % mq->msgCount;
|
||||||
|
mq->usedCount--;
|
||||||
|
|
||||||
|
// Wakeup sending threads if any
|
||||||
|
osWakeupThread(&mq->queueSend);
|
||||||
|
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osJamMessage
|
||||||
|
|
||||||
|
Description: send message to message queue, cutting in the top of the queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is sent
|
||||||
|
flags whether wait or not when queue is full
|
||||||
|
|
||||||
|
Returns: TRUE if send
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osJamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags)
|
||||||
|
{
|
||||||
|
OSIntrMode enabled;
|
||||||
|
|
||||||
|
enabled = osDisableInterrupts();
|
||||||
|
|
||||||
|
while (mq->msgCount <= mq->usedCount) // check for full queue
|
||||||
|
{
|
||||||
|
if (!(flags & OS_MESSAGE_BLOCK))
|
||||||
|
{
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Yield
|
||||||
|
osSleepThread(&mq->queueSend);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store message at the front
|
||||||
|
mq->firstIndex = (mq->firstIndex + mq->msgCount - 1) % mq->msgCount;
|
||||||
|
mq->msgArray[mq->firstIndex] = msg;
|
||||||
|
mq->usedCount++;
|
||||||
|
|
||||||
|
// Wakeup receiving threads if any
|
||||||
|
osWakeupThread(&mq->queueReceive);
|
||||||
|
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osReadMessage
|
||||||
|
|
||||||
|
Description: read message at message queue. no change in queue
|
||||||
|
not occur to switch threads.
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is received
|
||||||
|
flags whether wait or not when queue is empty
|
||||||
|
|
||||||
|
Returns: TRUE if read
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags)
|
||||||
|
{
|
||||||
|
OSIntrMode enabled;
|
||||||
|
|
||||||
|
enabled = osDisableInterrupts();
|
||||||
|
|
||||||
|
while (mq->usedCount == 0) // check for empty queue
|
||||||
|
{
|
||||||
|
if (!(flags & OS_MESSAGE_BLOCK))
|
||||||
|
{
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Yield
|
||||||
|
osSleepThread(&mq->queueReceive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy-out message
|
||||||
|
if (msg != NULL)
|
||||||
|
{
|
||||||
|
*msg = mq->msgArray[mq->firstIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)osRestoreInterrupts(enabled);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
@ -34,6 +34,7 @@ extern "C" {
|
|||||||
#include <brom/os/common/tick.h>
|
#include <brom/os/common/tick.h>
|
||||||
#include <brom/os/common/alarm.h>
|
#include <brom/os/common/alarm.h>
|
||||||
#include <brom/os/common/mutex.h>
|
#include <brom/os/common/mutex.h>
|
||||||
|
#include <brom/os/common/message.h>
|
||||||
#include <brom/os/common/thread.h>
|
#include <brom/os/common/thread.h>
|
||||||
#include <brom/os/common/timer.h>
|
#include <brom/os/common/timer.h>
|
||||||
#include <brom/os/common/interrupt.h>
|
#include <brom/os/common/interrupt.h>
|
||||||
|
|||||||
165
trunk/bootrom/include/brom/os/common/message.h
Normal file
165
trunk/bootrom/include/brom/os/common/message.h
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS - include
|
||||||
|
File: message.h
|
||||||
|
|
||||||
|
Copyright 2009 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef BROM_OS_MESSAGE_H_
|
||||||
|
#define BROM_OS_MESSAGE_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <brom/os/common/thread.h>
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
//---- type definition about message
|
||||||
|
typedef struct OSMessageQueue OSMessageQueue;
|
||||||
|
typedef void *OSMessage;
|
||||||
|
|
||||||
|
//---- structure of message queue
|
||||||
|
//#pragma warn_padding off
|
||||||
|
struct OSMessageQueue
|
||||||
|
{
|
||||||
|
OSThreadQueue queueSend;
|
||||||
|
OSThreadQueue queueReceive;
|
||||||
|
OSMessage *msgArray;
|
||||||
|
s32 msgCount;
|
||||||
|
s32 firstIndex;
|
||||||
|
s32 usedCount;
|
||||||
|
};
|
||||||
|
//#pragma warn_padding reset
|
||||||
|
|
||||||
|
//---- Flags to turn blocking on/off when sending/receiving message
|
||||||
|
#define OS_MESSAGE_NOBLOCK 0
|
||||||
|
#define OS_MESSAGE_BLOCK 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInitMessageQueue
|
||||||
|
|
||||||
|
Description: initialize message queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msgArray buffer for message queue
|
||||||
|
msgCount max massage size for buffer
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osSendMessage
|
||||||
|
|
||||||
|
Description: send message to message queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is sent
|
||||||
|
flags whether wait or not when queue is full
|
||||||
|
|
||||||
|
Returns: TRUE if send
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osSendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osReceiveMessage
|
||||||
|
|
||||||
|
Description: receive message from message queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is received
|
||||||
|
flags whether wait or not when queue is empty
|
||||||
|
|
||||||
|
Returns: TRUE if reveice
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osJamMessage
|
||||||
|
|
||||||
|
Description: send message to message queue, cutting in the top of the queue
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is sent
|
||||||
|
flags whether wait or not when queue is empty
|
||||||
|
|
||||||
|
Returns: TRUE if send
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osJamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osReadMessageMessage
|
||||||
|
|
||||||
|
Description: read message at message queue. no change to queue
|
||||||
|
not occur to switch threads.
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
msg massage which is received
|
||||||
|
flags whether wait or not when queue is empty
|
||||||
|
|
||||||
|
Returns: TRUE if read
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetMessageCount
|
||||||
|
|
||||||
|
Description: get message count of message queue.
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
|
||||||
|
Returns: message count
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static inline s32 osGetMessageCount(OSMessageQueue *mq)
|
||||||
|
{
|
||||||
|
SDK_ASSERT(mq);
|
||||||
|
return mq->msgCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osIsMessageQueueFull
|
||||||
|
|
||||||
|
Description: get whether message queue is full or not
|
||||||
|
|
||||||
|
Arguments: mq message queue
|
||||||
|
|
||||||
|
Returns: TRUE if full
|
||||||
|
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static inline BOOL osIsMessageQueueFull(OSMessageQueue *mq)
|
||||||
|
{
|
||||||
|
SDK_ASSERT(mq);
|
||||||
|
return (mq->usedCount >= mq->msgCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* BROM_OS_MESSAGE_H_ */
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue
Block a user