Merge pull request #2098 from opentx/bsongis/move_to_STM32F4
Bsongis/move to stm32 f4
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#define PCBTARANIS
|
||||
#define CPUARM
|
||||
#define CPUSTM32
|
||||
#define STM32F40_41xxx
|
||||
#define GUI
|
||||
#define HELI
|
||||
#define SPLASH
|
||||
|
||||
@@ -1,16 +1,39 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsConfig.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief This file use by user to configuration CooCox CoOS.
|
||||
* @note Ensure you have knew every item before modify this file.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
@@ -37,7 +60,11 @@ Max number of tasks that can be running.
|
||||
/*!<
|
||||
Idle task stack size(word).
|
||||
*/
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
#define CFG_IDLE_STACK_SIZE (58)
|
||||
#else
|
||||
#define CFG_IDLE_STACK_SIZE (25)
|
||||
#endif
|
||||
|
||||
/*!<
|
||||
System frequency (Hz).
|
||||
+245
-222
@@ -1,222 +1,245 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file CoOS.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief API header file of CooCox CoOS.
|
||||
* @details This file including all API functions's declare of CooCox CoOS.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _CCRTOS_H
|
||||
#define _CCRTOS_H
|
||||
#include "OsConfig.h"
|
||||
/*---------------------------- Type Define ----------------------------------*/
|
||||
typedef signed char S8;
|
||||
typedef unsigned char U8;
|
||||
typedef short S16;
|
||||
typedef unsigned short U16;
|
||||
typedef int S32;
|
||||
typedef unsigned int U32;
|
||||
typedef long long S64;
|
||||
typedef unsigned long long U64;
|
||||
typedef unsigned char BIT;
|
||||
typedef unsigned char BOOL;
|
||||
typedef unsigned int OS_STK;
|
||||
typedef U8 OS_TID;
|
||||
typedef U8 OS_TCID;
|
||||
typedef U8 OS_MutexID;
|
||||
typedef U8 OS_EventID;
|
||||
typedef U8 OS_FlagID;
|
||||
typedef U8 OS_MMID;
|
||||
typedef U8 StatusType;
|
||||
typedef U16 OS_VER;
|
||||
typedef void (*FUNCPtr)(void*);
|
||||
typedef void (*vFUNCPtr)(void);
|
||||
|
||||
|
||||
/*---------------------------- Constant Define -------------------------------*/
|
||||
#ifndef Co_NULL
|
||||
#define Co_NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
#ifndef Co_FALSE
|
||||
#define Co_FALSE (0)
|
||||
#endif
|
||||
|
||||
#ifndef Co_TRUE
|
||||
#define Co_TRUE (1)
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------- Error Codes ---------------------------------*/
|
||||
#define E_CREATE_FAIL (StatusType)-1
|
||||
#define E_OK (StatusType)0
|
||||
#define E_INVALID_ID (StatusType)1
|
||||
#define E_INVALID_PARAMETER (StatusType)2
|
||||
#define E_CALL (StatusType)3
|
||||
#define E_TASK_WAITING (StatusType)4
|
||||
#define E_TIMEOUT (StatusType)5
|
||||
#define E_SEM_FULL (StatusType)6
|
||||
#define E_MBOX_FULL (StatusType)7
|
||||
#define E_QUEUE_FULL (StatusType)8
|
||||
#define E_SEM_EMPTY (StatusType)9
|
||||
#define E_MBOX_EMPTY (StatusType)10
|
||||
#define E_QUEUE_EMPTY (StatusType)11
|
||||
#define E_FLAG_NOT_READY (StatusType)12
|
||||
#define E_ALREADY_IN_WAITING (StatusType)13
|
||||
#define E_TASK_NOT_WAITING (StatusType)14
|
||||
#define E_TASK_WAIT_OTHER (StatusType)15
|
||||
#define E_EXCEED_MAX_NUM (StatusType)16
|
||||
#define E_NOT_IN_DELAY_LIST (StatusType)17
|
||||
#define E_SEV_REQ_FULL (StatusType)18
|
||||
#define E_NOT_FREE_ALL (StatusType)19
|
||||
#define E_PROTECTED_TASK (StatusType)20
|
||||
#define E_OS_IN_LOCK (StatusType)21
|
||||
|
||||
|
||||
/*---------------------------- Wait Opreation type --------------------------*/
|
||||
#define OPT_WAIT_ALL 0 /*!< Wait for all flags. */
|
||||
#define OPT_WAIT_ANY 1 /*!< Wait for any one of flags. */
|
||||
#define OPT_WAIT_ONE 2 /*!< Waot for one flag. */
|
||||
|
||||
|
||||
/*---------------------------- Delete Opreation type ------------------------*/
|
||||
#define OPT_DEL_NO_PEND 0 /*!< Delete when no task waitting for */
|
||||
#define OPT_DEL_ANYWAY 1 /*!< Delete always. */
|
||||
|
||||
|
||||
/*---------------------------- Timer Types ----------------------------------*/
|
||||
#if CFG_TMR_EN >0
|
||||
#define TMR_TYPE_ONE_SHOT 0 /*!< Timer counter type: One-shot */
|
||||
#define TMR_TYPE_PERIODIC 1 /*!< Timer counter type: Periodic */
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------- Event Control ---------------------------------*/
|
||||
#if CFG_EVENT_EN >0
|
||||
#define EVENT_SORT_TYPE_FIFO (U8)0x01 /*!< Insert a event by FIFO */
|
||||
#define EVENT_SORT_TYPE_PRIO (U8)0x02 /*!< Insert a event by prio */
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------- Function declare-------------------------------*/
|
||||
|
||||
/* Implement in file "core.c" */
|
||||
extern void CoInitOS(void); /*!< Initialize OS */
|
||||
extern void CoStartOS(void); /*!< Start multitask */
|
||||
extern void CoEnterISR(void); /*!< Enter a ISR */
|
||||
extern void CoExitISR(void); /*!< Exit a ISR */
|
||||
extern void CoSchedLock(void);
|
||||
extern void CoSchedUnlock(void);
|
||||
extern OS_VER CoGetOSVersion(void); /*!< Get OS version value */
|
||||
|
||||
|
||||
/* Implement in file "task.c" */
|
||||
#define CoCreateTask(task,argv,prio,stk,stkSz) \
|
||||
CreateTask(task,argv,(prio)|(((stkSz)<<8) &0x000FFF00 ),stk)
|
||||
|
||||
|
||||
#define CoCreateTaskEx(task,argv,prio,stk,stkSz,timeSlice,isWaitting) \
|
||||
CreateTask(task,argv,(prio)|(((stkSz)<<8)&0x000FFF00)|(((timeSlice)<<20)&0x7FF00000)|((isWaitting<<31)&0x80000000),stk)
|
||||
|
||||
extern void CoExitTask(void);
|
||||
extern OS_TID CoGetCurTaskID(void);
|
||||
extern StatusType CoDelTask(OS_TID taskID);
|
||||
extern StatusType CoActivateTask(OS_TID taskID,void *argv);
|
||||
extern StatusType CoAwakeTask(OS_TID taskID);
|
||||
extern StatusType CoSuspendTask(OS_TID taskID);
|
||||
extern StatusType CoSetPriority(OS_TID taskID,U8 priority);
|
||||
extern OS_TID CreateTask(FUNCPtr task,void *argv,U32 parameter,OS_STK *stk);
|
||||
|
||||
/* Implement in file "time.c" */
|
||||
extern U64 CoGetOSTime(void);
|
||||
extern StatusType CoTickDelay(U32 ticks);
|
||||
extern StatusType CoResetTaskDelayTick(OS_TID taskID,U32 ticks);
|
||||
extern StatusType CoTimeDelay(U8 hour,U8 minute,U8 sec,U16 millsec);
|
||||
|
||||
|
||||
/* Implement in file "timer.c" */
|
||||
extern StatusType CoDelTmr(OS_TCID tmrID);
|
||||
extern StatusType CoStopTmr(OS_TCID tmrID);
|
||||
extern StatusType CoStartTmr(OS_TCID tmrID);
|
||||
extern U32 CoGetCurTmrCnt(OS_TCID tmrID,StatusType* perr);
|
||||
extern StatusType CoSetTmrCnt(OS_TCID tmrID,U32 tmrCnt,U32 tmrReload);
|
||||
extern OS_TCID CoCreateTmr(U8 tmrType, U32 tmrCnt, U32 tmrReload, vFUNCPtr func);
|
||||
|
||||
|
||||
/* Implement in file "kernelHeap.c"*/
|
||||
extern void* CoKmalloc(U32 size);
|
||||
extern void CoKfree(void* memBuf);
|
||||
|
||||
|
||||
/* Implement in file "mm.c" */
|
||||
extern void* CoGetMemoryBuffer(OS_MMID mmID);
|
||||
extern StatusType CoDelMemoryPartition(OS_MMID mmID);
|
||||
extern StatusType CoFreeMemoryBuffer(OS_MMID mmID,void* buf);
|
||||
extern U32 CoGetFreeBlockNum(OS_MMID mmID,StatusType* perr);
|
||||
extern OS_MMID CoCreateMemPartition(U8* memBuf,U32 blockSize,U32 blockNum);
|
||||
|
||||
/* Implement in file "mutex.c" */
|
||||
extern OS_MutexID CoCreateMutex(void);
|
||||
extern StatusType CoEnterMutexSection(OS_MutexID mutexID);
|
||||
extern StatusType CoLeaveMutexSection(OS_MutexID mutexID);
|
||||
|
||||
|
||||
/* Implement in file "sem.c" */
|
||||
extern StatusType CoPostSem(OS_EventID id);
|
||||
extern StatusType CoAcceptSem(OS_EventID id);
|
||||
extern StatusType isr_PostSem(OS_EventID id);
|
||||
extern StatusType CoDelSem(OS_EventID id,U8 opt);
|
||||
extern StatusType CoPendSem(OS_EventID id,U32 timeout);
|
||||
extern OS_EventID CoCreateSem(U16 initCnt,U16 maxCnt,U8 sortType);
|
||||
|
||||
|
||||
/* Implement in file "mbox.c" */
|
||||
extern OS_EventID CoCreateMbox(U8 sortType);
|
||||
extern StatusType CoDelMbox(OS_EventID id,U8 opt);
|
||||
extern StatusType CoPostMail(OS_EventID id,void* pmail);
|
||||
extern StatusType isr_PostMail(OS_EventID id,void* pmail);
|
||||
extern void* CoAcceptMail(OS_EventID id,StatusType* perr);
|
||||
extern void* CoPendMail(OS_EventID id,U32 timeout,StatusType* perr);
|
||||
|
||||
|
||||
/* Implement in file "queue.c" */
|
||||
extern StatusType CoDelQueue(OS_EventID id,U8 opt);
|
||||
extern StatusType CoPostQueueMail(OS_EventID id,void* pmail);
|
||||
extern StatusType isr_PostQueueMail(OS_EventID id,void* pmail);
|
||||
extern void* CoAcceptQueueMail(OS_EventID id,StatusType* perr);
|
||||
extern OS_EventID CoCreateQueue(void **qStart, U16 size ,U8 sortType);
|
||||
extern void* CoPendQueueMail(OS_EventID id,U32 timeout,StatusType* perr);
|
||||
|
||||
|
||||
|
||||
/* Implement in file "flag.c" */
|
||||
extern StatusType CoSetFlag (OS_FlagID id);
|
||||
extern StatusType CoClearFlag (OS_FlagID id);
|
||||
extern StatusType isr_SetFlag (OS_FlagID id);
|
||||
extern StatusType CoDelFlag (OS_FlagID id,U8 opt);
|
||||
extern StatusType CoAcceptSingleFlag (OS_FlagID id);
|
||||
extern StatusType CoWaitForSingleFlag (OS_FlagID id,U32 timeout);
|
||||
extern OS_FlagID CoCreateFlag (BOOL bAutoReset,BOOL bInitialState);
|
||||
extern U32 CoAcceptMultipleFlags (U32 flags,U8 waitType,StatusType *perr);
|
||||
extern U32 CoWaitForMultipleFlags (U32 flags,U8 waitType,U32 timeout,StatusType *perr);
|
||||
|
||||
|
||||
/* Implement in file "utility.c" */
|
||||
extern StatusType CoTimeToTick(U8 hour,U8 minute,U8 sec,U16 millsec,U32* ticks);
|
||||
extern void CoTickToTime(U32 ticks,U8* hour,U8* minute,U8* sec,U16* millsec);
|
||||
|
||||
|
||||
/* Implement in file "hook.c" */
|
||||
extern void CoIdleTask(void* pdata);
|
||||
extern void CoStkOverflowHook(OS_TID taskID);
|
||||
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file CoOS.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief API header file of CooCox CoOS.
|
||||
* @details This file including all API functions's declare of CooCox CoOS.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _CCRTOS_H
|
||||
#define _CCRTOS_H
|
||||
#include "../OsConfig.h"
|
||||
/*---------------------------- Type Define ----------------------------------*/
|
||||
typedef signed char S8;
|
||||
typedef unsigned char U8;
|
||||
typedef short S16;
|
||||
typedef unsigned short U16;
|
||||
typedef int S32;
|
||||
typedef unsigned int U32;
|
||||
typedef long long S64;
|
||||
typedef unsigned long long U64;
|
||||
typedef unsigned char BIT;
|
||||
typedef unsigned char BOOL;
|
||||
typedef unsigned int OS_STK;
|
||||
typedef U8 OS_TID;
|
||||
typedef U8 OS_TCID;
|
||||
typedef U8 OS_MutexID;
|
||||
typedef U8 OS_EventID;
|
||||
typedef U8 OS_FlagID;
|
||||
typedef U8 OS_MMID;
|
||||
typedef U8 StatusType;
|
||||
typedef U16 OS_VER;
|
||||
typedef void (*FUNCPtr)(void*);
|
||||
typedef void (*vFUNCPtr)(void);
|
||||
|
||||
|
||||
/*---------------------------- Constant Define -------------------------------*/
|
||||
#ifndef Co_NULL
|
||||
#define Co_NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
#ifndef Co_FALSE
|
||||
#define Co_FALSE (0)
|
||||
#endif
|
||||
|
||||
#ifndef Co_TRUE
|
||||
#define Co_TRUE (1)
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------- Error Codes ---------------------------------*/
|
||||
#define E_CREATE_FAIL (StatusType)-1
|
||||
#define E_OK (StatusType)0
|
||||
#define E_INVALID_ID (StatusType)1
|
||||
#define E_INVALID_PARAMETER (StatusType)2
|
||||
#define E_CALL (StatusType)3
|
||||
#define E_TASK_WAITING (StatusType)4
|
||||
#define E_TIMEOUT (StatusType)5
|
||||
#define E_SEM_FULL (StatusType)6
|
||||
#define E_MBOX_FULL (StatusType)7
|
||||
#define E_QUEUE_FULL (StatusType)8
|
||||
#define E_SEM_EMPTY (StatusType)9
|
||||
#define E_MBOX_EMPTY (StatusType)10
|
||||
#define E_QUEUE_EMPTY (StatusType)11
|
||||
#define E_FLAG_NOT_READY (StatusType)12
|
||||
#define E_ALREADY_IN_WAITING (StatusType)13
|
||||
#define E_TASK_NOT_WAITING (StatusType)14
|
||||
#define E_TASK_WAIT_OTHER (StatusType)15
|
||||
#define E_EXCEED_MAX_NUM (StatusType)16
|
||||
#define E_NOT_IN_DELAY_LIST (StatusType)17
|
||||
#define E_SEV_REQ_FULL (StatusType)18
|
||||
#define E_NOT_FREE_ALL (StatusType)19
|
||||
#define E_PROTECTED_TASK (StatusType)20
|
||||
#define E_OS_IN_LOCK (StatusType)21
|
||||
|
||||
|
||||
/*---------------------------- Wait Opreation type --------------------------*/
|
||||
#define OPT_WAIT_ALL 0 /*!< Wait for all flags. */
|
||||
#define OPT_WAIT_ANY 1 /*!< Wait for any one of flags. */
|
||||
#define OPT_WAIT_ONE 2 /*!< Waot for one flag. */
|
||||
|
||||
|
||||
/*---------------------------- Delete Opreation type ------------------------*/
|
||||
#define OPT_DEL_NO_PEND 0 /*!< Delete when no task waitting for */
|
||||
#define OPT_DEL_ANYWAY 1 /*!< Delete always. */
|
||||
|
||||
|
||||
/*---------------------------- Timer Types ----------------------------------*/
|
||||
#if CFG_TMR_EN >0
|
||||
#define TMR_TYPE_ONE_SHOT 0 /*!< Timer counter type: One-shot */
|
||||
#define TMR_TYPE_PERIODIC 1 /*!< Timer counter type: Periodic */
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------- Event Control ---------------------------------*/
|
||||
#if CFG_EVENT_EN >0
|
||||
#define EVENT_SORT_TYPE_FIFO (U8)0x01 /*!< Insert a event by FIFO */
|
||||
#define EVENT_SORT_TYPE_PRIO (U8)0x02 /*!< Insert a event by prio */
|
||||
#endif
|
||||
|
||||
|
||||
/*---------------------------- Function declare-------------------------------*/
|
||||
|
||||
/* Implement in file "core.c" */
|
||||
extern void CoInitOS(void); /*!< Initialize OS */
|
||||
extern void CoStartOS(void); /*!< Start multitask */
|
||||
extern void CoEnterISR(void); /*!< Enter a ISR */
|
||||
extern void CoExitISR(void); /*!< Exit a ISR */
|
||||
extern void CoSchedLock(void);
|
||||
extern void CoSchedUnlock(void);
|
||||
extern OS_VER CoGetOSVersion(void); /*!< Get OS version value */
|
||||
|
||||
|
||||
/* Implement in file "task.c" */
|
||||
#define CoCreateTask(task,argv,prio,stk,stkSz) \
|
||||
CreateTask(task,argv,(prio)|(((stkSz)<<8) &0x000FFF00 ),stk)
|
||||
|
||||
|
||||
#define CoCreateTaskEx(task,argv,prio,stk,stkSz,timeSlice,isWaitting) \
|
||||
CreateTask(task,argv,(prio)|(((stkSz)<<8)&0x000FFF00)|(((timeSlice)<<20)&0x7FF00000)|((isWaitting<<31)&0x80000000),stk)
|
||||
|
||||
extern void CoExitTask(void);
|
||||
extern OS_TID CoGetCurTaskID(void);
|
||||
extern StatusType CoDelTask(OS_TID taskID);
|
||||
extern StatusType CoActivateTask(OS_TID taskID,void *argv);
|
||||
extern StatusType CoAwakeTask(OS_TID taskID);
|
||||
extern StatusType CoSuspendTask(OS_TID taskID);
|
||||
extern StatusType CoSetPriority(OS_TID taskID,U8 priority);
|
||||
extern OS_TID CreateTask(FUNCPtr task,void *argv,U32 parameter,OS_STK *stk);
|
||||
|
||||
/* Implement in file "time.c" */
|
||||
extern U64 CoGetOSTime(void);
|
||||
extern StatusType CoTickDelay(U32 ticks);
|
||||
extern StatusType CoResetTaskDelayTick(OS_TID taskID,U32 ticks);
|
||||
extern StatusType CoTimeDelay(U8 hour,U8 minute,U8 sec,U16 millsec);
|
||||
|
||||
|
||||
/* Implement in file "timer.c" */
|
||||
extern StatusType CoDelTmr(OS_TCID tmrID);
|
||||
extern StatusType CoStopTmr(OS_TCID tmrID);
|
||||
extern StatusType CoStartTmr(OS_TCID tmrID);
|
||||
extern U32 CoGetCurTmrCnt(OS_TCID tmrID,StatusType* perr);
|
||||
extern StatusType CoSetTmrCnt(OS_TCID tmrID,U32 tmrCnt,U32 tmrReload);
|
||||
extern OS_TCID CoCreateTmr(U8 tmrType, U32 tmrCnt, U32 tmrReload, vFUNCPtr func);
|
||||
|
||||
|
||||
/* Implement in file "kernelHeap.c"*/
|
||||
extern void* CoKmalloc(U32 size);
|
||||
extern void CoKfree(void* memBuf);
|
||||
|
||||
|
||||
/* Implement in file "mm.c" */
|
||||
extern void* CoGetMemoryBuffer(OS_MMID mmID);
|
||||
extern StatusType CoDelMemoryPartition(OS_MMID mmID);
|
||||
extern StatusType CoFreeMemoryBuffer(OS_MMID mmID,void* buf);
|
||||
extern U32 CoGetFreeBlockNum(OS_MMID mmID,StatusType* perr);
|
||||
extern OS_MMID CoCreateMemPartition(U8* memBuf,U32 blockSize,U32 blockNum);
|
||||
|
||||
/* Implement in file "mutex.c" */
|
||||
extern OS_MutexID CoCreateMutex(void);
|
||||
extern StatusType CoEnterMutexSection(OS_MutexID mutexID);
|
||||
extern StatusType CoLeaveMutexSection(OS_MutexID mutexID);
|
||||
|
||||
|
||||
/* Implement in file "sem.c" */
|
||||
extern StatusType CoPostSem(OS_EventID id);
|
||||
extern StatusType CoAcceptSem(OS_EventID id);
|
||||
extern StatusType isr_PostSem(OS_EventID id);
|
||||
extern StatusType CoDelSem(OS_EventID id,U8 opt);
|
||||
extern StatusType CoPendSem(OS_EventID id,U32 timeout);
|
||||
extern OS_EventID CoCreateSem(U16 initCnt,U16 maxCnt,U8 sortType);
|
||||
|
||||
|
||||
/* Implement in file "mbox.c" */
|
||||
extern OS_EventID CoCreateMbox(U8 sortType);
|
||||
extern StatusType CoDelMbox(OS_EventID id,U8 opt);
|
||||
extern StatusType CoPostMail(OS_EventID id,void* pmail);
|
||||
extern StatusType isr_PostMail(OS_EventID id,void* pmail);
|
||||
extern void* CoAcceptMail(OS_EventID id,StatusType* perr);
|
||||
extern void* CoPendMail(OS_EventID id,U32 timeout,StatusType* perr);
|
||||
|
||||
|
||||
/* Implement in file "queue.c" */
|
||||
extern StatusType CoDelQueue(OS_EventID id,U8 opt);
|
||||
extern StatusType CoPostQueueMail(OS_EventID id,void* pmail);
|
||||
extern StatusType isr_PostQueueMail(OS_EventID id,void* pmail);
|
||||
extern void* CoAcceptQueueMail(OS_EventID id,StatusType* perr);
|
||||
extern OS_EventID CoCreateQueue(void **qStart, U16 size ,U8 sortType);
|
||||
extern void* CoPendQueueMail(OS_EventID id,U32 timeout,StatusType* perr);
|
||||
|
||||
|
||||
|
||||
/* Implement in file "flag.c" */
|
||||
extern StatusType CoSetFlag (OS_FlagID id);
|
||||
extern StatusType CoClearFlag (OS_FlagID id);
|
||||
extern StatusType isr_SetFlag (OS_FlagID id);
|
||||
extern StatusType CoDelFlag (OS_FlagID id,U8 opt);
|
||||
extern StatusType CoAcceptSingleFlag (OS_FlagID id);
|
||||
extern StatusType CoWaitForSingleFlag (OS_FlagID id,U32 timeout);
|
||||
extern OS_FlagID CoCreateFlag (BOOL bAutoReset,BOOL bInitialState);
|
||||
extern U32 CoAcceptMultipleFlags (U32 flags,U8 waitType,StatusType *perr);
|
||||
extern U32 CoWaitForMultipleFlags (U32 flags,U8 waitType,U32 timeout,StatusType *perr);
|
||||
|
||||
|
||||
/* Implement in file "utility.c" */
|
||||
extern StatusType CoTimeToTick(U8 hour,U8 minute,U8 sec,U16 millsec,U32* ticks);
|
||||
extern void CoTickToTime(U32 ticks,U8* hour,U8* minute,U8* sec,U16* millsec);
|
||||
|
||||
|
||||
/* Implement in file "hook.c" */
|
||||
extern void CoIdleTask(void* pdata);
|
||||
extern void CoStkOverflowHook(OS_TID taskID);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,27 +1,50 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsCore.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Header file related to kernel
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CORE_H
|
||||
#define _CORE_H
|
||||
|
||||
#include <CoOS.h>
|
||||
|
||||
|
||||
#define OsSchedLock() { OSSchedLock++; asm volatile ("" : : : "memory"); } /*!< Lock schedule */
|
||||
extern void OsSchedUnlock(void);
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsCore.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Header file related to kernel
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CORE_H
|
||||
#define _CORE_H
|
||||
|
||||
#include <CoOS.h>
|
||||
|
||||
|
||||
#define OsSchedLock() { OSSchedLock++; asm volatile ("" : : : "memory"); } /*!< Lock schedule */
|
||||
extern void OsSchedUnlock(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+107
-84
@@ -1,84 +1,107 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsError.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief rror dispose header file
|
||||
* @details This file use to dispose error which from error configure for OS.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ERROR_H
|
||||
#define _ERROR_H
|
||||
|
||||
#if (CFG_SYSTICK_FREQ > 1000) ||(CFG_SYSTICK_FREQ < 1)
|
||||
#error " OsConfig.h System Tick time must between 1ms and 1s!"
|
||||
#endif
|
||||
|
||||
#if CFG_MAX_USER_TASKS > 253
|
||||
#error " OsConfig.h, CFG_MAX_USER_TASKS must be <= 253! "
|
||||
#endif
|
||||
|
||||
#if CFG_LOWEST_PRIO > 254
|
||||
#error " OsConfig.h, CFG_LOWEST_PRIO must be <= 254! "
|
||||
#endif
|
||||
|
||||
#if CFG_IDLE_STACK_SIZE <25
|
||||
#error " OsConfig.h, CFG_IDLE_STACK_SIZE must be >= 25! "
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_ROBIN_EN > 0
|
||||
#if CFG_TIME_SLICE > 4095
|
||||
#error " OsConfig.h, CFG_TIME_SLICE must be <= 4095! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
#if CFG_MAX_TMR > 32
|
||||
#error " OsConfig.h, CFG_MAX_TMR must be <= 32! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_MM_EN > 0
|
||||
#if CFG_MAX_MM > 32
|
||||
#error " config.h, CFG_MAX_MM must be <= 32! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_KHEAP_EN > 0
|
||||
#if KHEAP_SIZE < 0x20
|
||||
#error " config.h, CFG_MAX_MM must be >= 0x20! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
#if CFG_MAX_MUTEX > 254
|
||||
#error " config.h, CFG_MAX_MUTEX must be <= 254! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
#if (CFG_MAX_EVENT > 254 || CFG_MAX_EVENT <= 0)
|
||||
#error " config.h, CFG_MAX_EVENT must be <= 254 && > 0! "
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_QUEUE_EN > 0
|
||||
#if CFG_MAX_QUEUE > CFG_MAX_EVENT
|
||||
#error " config.h, CFG_MAX_QUEUE must be <= CFG_MAX_EVENT! "
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CFG_EVENT_EN */
|
||||
|
||||
#endif /* _ERROR_H */
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsError.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief rror dispose header file
|
||||
* @details This file use to dispose error which from error configure for OS.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ERROR_H
|
||||
#define _ERROR_H
|
||||
|
||||
#if (CFG_SYSTICK_FREQ > 1000) ||(CFG_SYSTICK_FREQ < 1)
|
||||
#error " OsConfig.h System Tick time must between 1ms and 1s!"
|
||||
#endif
|
||||
|
||||
#if CFG_MAX_USER_TASKS > 253
|
||||
#error " OsConfig.h, CFG_MAX_USER_TASKS must be <= 253! "
|
||||
#endif
|
||||
|
||||
#if CFG_LOWEST_PRIO > 254
|
||||
#error " OsConfig.h, CFG_LOWEST_PRIO must be <= 254! "
|
||||
#endif
|
||||
|
||||
#if CFG_IDLE_STACK_SIZE <25
|
||||
#error " OsConfig.h, CFG_IDLE_STACK_SIZE must be >= 25! "
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_ROBIN_EN > 0
|
||||
#if CFG_TIME_SLICE > 4095
|
||||
#error " OsConfig.h, CFG_TIME_SLICE must be <= 4095! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
#if CFG_MAX_TMR > 32
|
||||
#error " OsConfig.h, CFG_MAX_TMR must be <= 32! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_MM_EN > 0
|
||||
#if CFG_MAX_MM > 32
|
||||
#error " config.h, CFG_MAX_MM must be <= 32! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_KHEAP_EN > 0
|
||||
#if KHEAP_SIZE < 0x20
|
||||
#error " config.h, CFG_MAX_MM must be >= 0x20! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
#if CFG_MAX_MUTEX > 254
|
||||
#error " config.h, CFG_MAX_MUTEX must be <= 254! "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
#if (CFG_MAX_EVENT > 254 || CFG_MAX_EVENT <= 0)
|
||||
#error " config.h, CFG_MAX_EVENT must be <= 254 && > 0! "
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_QUEUE_EN > 0
|
||||
#if CFG_MAX_QUEUE > CFG_MAX_EVENT
|
||||
#error " config.h, CFG_MAX_QUEUE must be <= CFG_MAX_EVENT! "
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CFG_EVENT_EN */
|
||||
|
||||
#endif /* _ERROR_H */
|
||||
|
||||
@@ -1,58 +1,81 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsEvent.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Event management header file
|
||||
* @details This file including some defines and declares related to event
|
||||
* (semaphore,mailbox,queque) management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _EVENT_H
|
||||
#define _EVENT_H
|
||||
|
||||
#define EVENT_TYPE_SEM (U8)0x01 /*!< Event type:Semaphore. */
|
||||
#define EVENT_TYPE_MBOX (U8)0x02 /*!< Event type:Mailbox. */
|
||||
#define EVENT_TYPE_QUEUE (U8)0x03 /*!< Event type:Queue. */
|
||||
#define EVENT_TYPE_INVALID (U8)0x04 /*!< Invalid event type. */
|
||||
|
||||
|
||||
/**
|
||||
* @struct EventCtrBlk event.h
|
||||
* @brief Event control block
|
||||
* @details This struct is use to manage event,
|
||||
* e.g. semaphore,mailbox,queue.
|
||||
*/
|
||||
typedef struct EventCtrBlk
|
||||
{
|
||||
void* eventPtr; /*!< Point to mailbox or queue struct */
|
||||
U8 id; /*!< ECB id */
|
||||
U8 eventType:4; /*!< Type of event */
|
||||
U8 eventSortType:4; /*!< 0:FIFO 1: Preemptive by prio */
|
||||
U16 eventCounter; /*!< Counter of semaphore. */
|
||||
U16 initialEventCounter; /*!< Initial counter of semaphore. */
|
||||
P_OSTCB eventTCBList; /*!< Task waitting list. */
|
||||
}ECB,*P_ECB;
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern ECB EventTbl[CFG_MAX_EVENT]; /*!< Table use to save TCB. */
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
/*!< Create a event */
|
||||
extern P_ECB CreatEvent(U8 eventType,U8 eventSortType,void* eventPtr);
|
||||
|
||||
/*!< Remove a task from wait list */
|
||||
extern void EventTaskToWait(P_ECB pecb,P_OSTCB ptcb);
|
||||
extern StatusType DeleteEvent(P_ECB pecb,U8 opt); /*!< Delete a event. */
|
||||
extern void EventTaskToRdy(P_ECB pecb); /*!< Insert a task to ready list*/
|
||||
extern void CreateEventList(void); /*!< Create a event list. */
|
||||
extern void RemoveEventWaittingList(P_OSTCB ptcb);
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsEvent.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Event management header file
|
||||
* @details This file including some defines and declares related to event
|
||||
* (semaphore,mailbox,queque) management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _EVENT_H
|
||||
#define _EVENT_H
|
||||
|
||||
#define EVENT_TYPE_SEM (U8)0x01 /*!< Event type:Semaphore. */
|
||||
#define EVENT_TYPE_MBOX (U8)0x02 /*!< Event type:Mailbox. */
|
||||
#define EVENT_TYPE_QUEUE (U8)0x03 /*!< Event type:Queue. */
|
||||
#define EVENT_TYPE_INVALID (U8)0x04 /*!< Invalid event type. */
|
||||
|
||||
|
||||
/**
|
||||
* @struct EventCtrBlk event.h
|
||||
* @brief Event control block
|
||||
* @details This struct is use to manage event,
|
||||
* e.g. semaphore,mailbox,queue.
|
||||
*/
|
||||
typedef struct EventCtrBlk
|
||||
{
|
||||
void* eventPtr; /*!< Point to mailbox or queue struct */
|
||||
U8 id; /*!< ECB id */
|
||||
U8 eventType:4; /*!< Type of event */
|
||||
U8 eventSortType:4; /*!< 0:FIFO 1: Preemptive by prio */
|
||||
U16 eventCounter; /*!< Counter of semaphore. */
|
||||
U16 initialEventCounter; /*!< Initial counter of semaphore. */
|
||||
P_OSTCB eventTCBList; /*!< Task waitting list. */
|
||||
}ECB,*P_ECB;
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern ECB EventTbl[CFG_MAX_EVENT]; /*!< Table use to save TCB. */
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
/*!< Create a event */
|
||||
extern P_ECB CreatEvent(U8 eventType,U8 eventSortType,void* eventPtr);
|
||||
|
||||
/*!< Remove a task from wait list */
|
||||
extern void EventTaskToWait(P_ECB pecb,P_OSTCB ptcb);
|
||||
extern StatusType DeleteEvent(P_ECB pecb,U8 opt); /*!< Delete a event. */
|
||||
extern void EventTaskToRdy(P_ECB pecb); /*!< Insert a task to ready list*/
|
||||
extern void CreateEventList(void); /*!< Create a event list. */
|
||||
extern void RemoveEventWaittingList(P_OSTCB ptcb);
|
||||
#endif
|
||||
|
||||
@@ -1,57 +1,80 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsFlag.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Evnet flag management header file
|
||||
* @details This file including some defines and declares about flag management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _FLAG_H
|
||||
#define _FLAG_H
|
||||
|
||||
/**
|
||||
* @struct FlagNode flag.h
|
||||
* @brief Flag node struct
|
||||
* @details
|
||||
*/
|
||||
typedef struct FlagNode
|
||||
{
|
||||
struct FlagNode* nextNode; /*!< A pointer to next flag node */
|
||||
struct FlagNode* prevNode; /*!< A pointer to prev flag node */
|
||||
U32 waitFlags; /*!< Flag value */
|
||||
P_OSTCB waitTask; /*!< A pointer to task waitting flag */
|
||||
U8 waitType; /*!< Wait type */
|
||||
}FLAG_NODE,*P_FLAG_NODE;
|
||||
|
||||
|
||||
/**
|
||||
* @struct Flag flag.h
|
||||
* @brief Flag control block
|
||||
* @details This struct use to mange event flag.
|
||||
*/
|
||||
typedef struct Flag
|
||||
{
|
||||
U32 flagRdy; /*!< Ready flag */
|
||||
U32 resetOpt; /*!< Reset option */
|
||||
U32 flagActive; /*!< Active flag */
|
||||
P_FLAG_NODE headNode; /*!< Head node */
|
||||
P_FLAG_NODE tailNode; /*!< Tail node */
|
||||
}FCB,*P_FCB;
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern FCB FlagCrl;
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void RemoveLinkNode(P_FLAG_NODE pnode);
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsFlag.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Evnet flag management header file
|
||||
* @details This file including some defines and declares about flag management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _FLAG_H
|
||||
#define _FLAG_H
|
||||
|
||||
/**
|
||||
* @struct FlagNode flag.h
|
||||
* @brief Flag node struct
|
||||
* @details
|
||||
*/
|
||||
typedef struct FlagNode
|
||||
{
|
||||
struct FlagNode* nextNode; /*!< A pointer to next flag node */
|
||||
struct FlagNode* prevNode; /*!< A pointer to prev flag node */
|
||||
U32 waitFlags; /*!< Flag value */
|
||||
P_OSTCB waitTask; /*!< A pointer to task waitting flag */
|
||||
U8 waitType; /*!< Wait type */
|
||||
}FLAG_NODE,*P_FLAG_NODE;
|
||||
|
||||
|
||||
/**
|
||||
* @struct Flag flag.h
|
||||
* @brief Flag control block
|
||||
* @details This struct use to mange event flag.
|
||||
*/
|
||||
typedef struct Flag
|
||||
{
|
||||
U32 flagRdy; /*!< Ready flag */
|
||||
U32 resetOpt; /*!< Reset option */
|
||||
U32 flagActive; /*!< Active flag */
|
||||
P_FLAG_NODE headNode; /*!< Head node */
|
||||
P_FLAG_NODE tailNode; /*!< Tail node */
|
||||
}FCB,*P_FCB;
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern FCB FlagCrl;
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void RemoveLinkNode(P_FLAG_NODE pnode);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,48 +1,71 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsKernelHeap.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Header file related to memory management
|
||||
* @details This file including some defines and function declare related to
|
||||
* kernel heap management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _KERNELHEAP_H
|
||||
#define _KERNELHEAP_H
|
||||
|
||||
|
||||
typedef struct KennelHeap
|
||||
{
|
||||
U32 startAddr;
|
||||
U32 endAddr;
|
||||
}KHeap,*P_KHeap;
|
||||
|
||||
|
||||
typedef struct UsedMemBlk
|
||||
{
|
||||
void* nextMB;
|
||||
void* preMB;
|
||||
}UMB,*P_UMB;
|
||||
|
||||
|
||||
typedef struct FreeMemBlk
|
||||
{
|
||||
struct FreeMemBlk* nextFMB;
|
||||
struct UsedMemBlk* nextUMB;
|
||||
struct UsedMemBlk* preUMB;
|
||||
}FMB,*P_FMB;
|
||||
|
||||
/*---------------------------- Function Declare ------------------------------*/
|
||||
extern void CoCreateKheap(void);
|
||||
|
||||
#endif /* _KERNELHEAP_H */
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsKernelHeap.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Header file related to memory management
|
||||
* @details This file including some defines and function declare related to
|
||||
* kernel heap management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _KERNELHEAP_H
|
||||
#define _KERNELHEAP_H
|
||||
|
||||
|
||||
typedef struct KennelHeap
|
||||
{
|
||||
U32 startAddr;
|
||||
U32 endAddr;
|
||||
}KHeap,*P_KHeap;
|
||||
|
||||
|
||||
typedef struct UsedMemBlk
|
||||
{
|
||||
void* nextMB;
|
||||
void* preMB;
|
||||
}UMB,*P_UMB;
|
||||
|
||||
|
||||
typedef struct FreeMemBlk
|
||||
{
|
||||
struct FreeMemBlk* nextFMB;
|
||||
struct UsedMemBlk* nextUMB;
|
||||
struct UsedMemBlk* preUMB;
|
||||
}FMB,*P_FMB;
|
||||
|
||||
/*---------------------------- Function Declare ------------------------------*/
|
||||
extern void CoCreateKheap(void);
|
||||
|
||||
#endif /* _KERNELHEAP_H */
|
||||
|
||||
|
||||
@@ -1,41 +1,64 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsMm.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Header file related to memory management
|
||||
* @details This file including some defines and function declare related to
|
||||
* memory management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _MM_H
|
||||
#define _MM_H
|
||||
|
||||
|
||||
typedef struct Memory
|
||||
{
|
||||
U8* memAddr;
|
||||
U8* freeBlock;
|
||||
U32 blockSize;
|
||||
U32 blockNum;
|
||||
}MM,*P_MM;
|
||||
|
||||
|
||||
typedef struct MemoryBlock
|
||||
{
|
||||
struct MemoryBlock* nextBlock;
|
||||
}MemBlk,*P_MemBlk;
|
||||
|
||||
|
||||
extern U32 MemoryIDVessel;
|
||||
|
||||
#endif /* _MM_H */
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsMm.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Header file related to memory management
|
||||
* @details This file including some defines and function declare related to
|
||||
* memory management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _MM_H
|
||||
#define _MM_H
|
||||
|
||||
|
||||
typedef struct Memory
|
||||
{
|
||||
U8* memAddr;
|
||||
U8* freeBlock;
|
||||
U32 blockSize;
|
||||
U32 blockNum;
|
||||
}MM,*P_MM;
|
||||
|
||||
|
||||
typedef struct MemoryBlock
|
||||
{
|
||||
struct MemoryBlock* nextBlock;
|
||||
}MemBlk,*P_MemBlk;
|
||||
|
||||
|
||||
extern U32 MemoryIDVessel;
|
||||
|
||||
#endif /* _MM_H */
|
||||
|
||||
|
||||
@@ -1,57 +1,80 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsMutex.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Mutex management header file
|
||||
* @details This file including some defines and declare related to mutex
|
||||
* management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _MUTEX_H
|
||||
#define _MUTEX_H
|
||||
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
|
||||
/*---------------------------- Resource status -------------------------------*/
|
||||
#define MUTEX_FREE 0 /*!< Mutex is free */
|
||||
#define MUTEX_OCCUPY 1 /*!< Mutex is occupy */
|
||||
#define WAITING_MUTEX 0x80
|
||||
|
||||
/**
|
||||
* @struct Mutex mutex.h
|
||||
* @brief Mutex control block
|
||||
* @details This struct is use to mutex management.
|
||||
*/
|
||||
typedef struct Mutex
|
||||
{
|
||||
U8 originalPrio; /*!< Mutex priority. */
|
||||
U8 mutexFlag; /*!< Mutex flag. */
|
||||
OS_TID taskID; /*!< Task ID. */
|
||||
OS_TID hipriTaskID; /*!< Mutex ID. */
|
||||
P_OSTCB waittingList; /*!< waitting the Mutex. */
|
||||
}MUTEX,*P_MUTEX;
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
/*!< Table use to save mutex control block. */
|
||||
extern MUTEX MutexTbl[CFG_MAX_MUTEX];
|
||||
extern OS_MutexID MutexFreeID; /*!< A pointer to next vliad resource ID. */
|
||||
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void RemoveMutexList(P_OSTCB ptcb);
|
||||
|
||||
#endif /* CFG_MUTEX_EN */
|
||||
|
||||
#endif /* _MUTEX_H */
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsMutex.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Mutex management header file
|
||||
* @details This file including some defines and declare related to mutex
|
||||
* management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _MUTEX_H
|
||||
#define _MUTEX_H
|
||||
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
|
||||
/*---------------------------- Resource status -------------------------------*/
|
||||
#define MUTEX_FREE 0 /*!< Mutex is free */
|
||||
#define MUTEX_OCCUPY 1 /*!< Mutex is occupy */
|
||||
#define WAITING_MUTEX 0x80
|
||||
|
||||
/**
|
||||
* @struct Mutex mutex.h
|
||||
* @brief Mutex control block
|
||||
* @details This struct is use to mutex management.
|
||||
*/
|
||||
typedef struct Mutex
|
||||
{
|
||||
U8 originalPrio; /*!< Mutex priority. */
|
||||
U8 mutexFlag; /*!< Mutex flag. */
|
||||
OS_TID taskID; /*!< Task ID. */
|
||||
OS_TID hipriTaskID; /*!< Mutex ID. */
|
||||
P_OSTCB waittingList; /*!< waitting the Mutex. */
|
||||
}MUTEX,*P_MUTEX;
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
/*!< Table use to save mutex control block. */
|
||||
extern MUTEX MutexTbl[CFG_MAX_MUTEX];
|
||||
extern OS_MutexID MutexFreeID; /*!< A pointer to next vliad resource ID. */
|
||||
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void RemoveMutexList(P_OSTCB ptcb);
|
||||
|
||||
#endif /* CFG_MUTEX_EN */
|
||||
|
||||
#endif /* _MUTEX_H */
|
||||
|
||||
@@ -1,39 +1,62 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsQueue.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Queue management header file
|
||||
* @details This file including some defines and declares about queue management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _QUEUE_H
|
||||
#define _QUEUE_H
|
||||
|
||||
|
||||
/**
|
||||
* @struct Queue queue.h
|
||||
* @brief Queue struct
|
||||
* @details This struct use to manage queue.
|
||||
*
|
||||
*/
|
||||
typedef struct Queue
|
||||
{
|
||||
void **qStart; /*!< */
|
||||
U8 id; /*!< */
|
||||
U16 head; /*!< The header of queue */
|
||||
U16 tail; /*!< The end of queue */
|
||||
U16 qMaxSize; /*!< The max size of queue */
|
||||
U16 qSize; /*!< Current size of queue */
|
||||
}QCB,*P_QCB;
|
||||
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsQueue.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Queue management header file
|
||||
* @details This file including some defines and declares about queue management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _QUEUE_H
|
||||
#define _QUEUE_H
|
||||
|
||||
|
||||
/**
|
||||
* @struct Queue queue.h
|
||||
* @brief Queue struct
|
||||
* @details This struct use to manage queue.
|
||||
*
|
||||
*/
|
||||
typedef struct Queue
|
||||
{
|
||||
void **qStart; /*!< */
|
||||
U8 id; /*!< */
|
||||
U16 head; /*!< The header of queue */
|
||||
U16 tail; /*!< The end of queue */
|
||||
U16 qMaxSize; /*!< The max size of queue */
|
||||
U16 qSize; /*!< Current size of queue */
|
||||
}QCB,*P_QCB;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,53 +1,76 @@
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsServiceReq.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Header file related to service request
|
||||
* @details This file including some defines and function declare related to
|
||||
* service request.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _SERVICEREQ_H
|
||||
#define _SERVICEREQ_H
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
#define SEM_REQ (U8)0x1
|
||||
#define MBOX_REQ (U8)0x2
|
||||
#define FLAG_REQ (U8)0x3
|
||||
#define QUEUE_REQ (U8)0x4
|
||||
|
||||
|
||||
typedef struct ServiceReqCell
|
||||
{
|
||||
U8 type;
|
||||
U8 id;
|
||||
void* arg;
|
||||
}SQC,*P_SQC;
|
||||
|
||||
typedef struct ServiceReqQueue
|
||||
{
|
||||
U8 cnt;
|
||||
U8 head;
|
||||
SQC cell[CFG_MAX_SERVICE_REQUEST];
|
||||
}SRQ,*P_SRQ;
|
||||
|
||||
|
||||
extern SRQ ServiceReq;
|
||||
extern BOOL InsertInSRQ(U8 type,U8 id,void* arg);
|
||||
#endif
|
||||
|
||||
extern void RespondSRQ(void);
|
||||
extern BOOL TimeReq;
|
||||
extern BOOL TimerReq;
|
||||
extern BOOL IsrReq;
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsServiceReq.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Header file related to service request
|
||||
* @details This file including some defines and function declare related to
|
||||
* service request.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _SERVICEREQ_H
|
||||
#define _SERVICEREQ_H
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
#define SEM_REQ (U8)0x1
|
||||
#define MBOX_REQ (U8)0x2
|
||||
#define FLAG_REQ (U8)0x3
|
||||
#define QUEUE_REQ (U8)0x4
|
||||
|
||||
|
||||
typedef struct ServiceReqCell
|
||||
{
|
||||
U8 type;
|
||||
U8 id;
|
||||
void* arg;
|
||||
}SQC,*P_SQC;
|
||||
|
||||
typedef struct ServiceReqQueue
|
||||
{
|
||||
U8 cnt;
|
||||
U8 head;
|
||||
SQC cell[CFG_MAX_SERVICE_REQUEST];
|
||||
}SRQ,*P_SRQ;
|
||||
|
||||
|
||||
extern SRQ ServiceReq;
|
||||
extern BOOL InsertInSRQ(U8 type,U8 id,void* arg);
|
||||
#endif
|
||||
|
||||
extern void RespondSRQ(void);
|
||||
extern BOOL TimeReq;
|
||||
extern BOOL TimerReq;
|
||||
extern BOOL IsrReq;
|
||||
#endif
|
||||
|
||||
+135
-112
@@ -1,112 +1,135 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsTask.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Header file related to task.
|
||||
* @details This file including some defines and function declare related to task.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TASK_H
|
||||
#define _TASK_H
|
||||
|
||||
#define SYS_TASK_NUM (1) /*!< System task number. */
|
||||
|
||||
/*---------------------------- Task Status -----------------------------------*/
|
||||
#define TASK_READY 0 /*!< Ready status of task. */
|
||||
#define TASK_RUNNING 1 /*!< Running status of task. */
|
||||
#define TASK_WAITING 2 /*!< Waitting status of task. */
|
||||
#define TASK_DORMANT 3 /*!< Dormant status of task. */
|
||||
|
||||
|
||||
#define INVALID_ID (U8)0xff
|
||||
#define INVALID_VALUE (U32)0xffffffff
|
||||
#define MAGIC_WORD (U32)0x5a5aa5a5
|
||||
|
||||
|
||||
/**
|
||||
* @struct TCB task.h
|
||||
* @brief Task control blcok.
|
||||
* @details This struct use to manage task.
|
||||
*/
|
||||
typedef struct TCB
|
||||
{
|
||||
OS_STK *stkPtr; /*!< The current point of task. */
|
||||
U8 prio; /*!< Task priority. */
|
||||
U8 state; /*!< TaSk status. */
|
||||
OS_TID taskID; /*!< Task ID. */
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
OS_MutexID mutexID; /*!< Mutex ID. */
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
OS_EventID eventID; /*!< Event ID. */
|
||||
#endif
|
||||
|
||||
#if CFG_ROBIN_EN >0
|
||||
U16 timeSlice; /*!< Task time slice */
|
||||
#endif
|
||||
|
||||
#if CFG_STK_CHECKOUT_EN >0
|
||||
OS_STK *stack; /*!< The top point of task. */
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
void* pmail; /*!< Mail to task. */
|
||||
struct TCB *waitNext; /*!< Point to next TCB in the Event waitting list.*/
|
||||
struct TCB *waitPrev; /*!< Point to prev TCB in the Event waitting list.*/
|
||||
#endif
|
||||
|
||||
#if CFG_TASK_SCHEDULE_EN == 0
|
||||
FUNCPtr taskFuc;
|
||||
OS_STK *taskStk;
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_FLAG_EN > 0
|
||||
void* pnode; /*!< Pointer to node of event flag. */
|
||||
#endif
|
||||
|
||||
#if CFG_TASK_WAITTING_EN >0
|
||||
U32 delayTick; /*!< The number of ticks which delay. */
|
||||
#endif
|
||||
struct TCB *TCBnext; /*!< The pointer to next TCB. */
|
||||
struct TCB *TCBprev; /*!< The pointer to prev TCB. */
|
||||
|
||||
}OSTCB,*P_OSTCB;
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
// save tcb ptr that created
|
||||
extern P_OSTCB FreeTCB; /*!< A pointer to free TCB. */
|
||||
extern OSTCB TCBTbl[CFG_MAX_USER_TASKS+SYS_TASK_NUM];
|
||||
extern P_OSTCB TCBRdy; /*!< A pointer to TCB that is ready status */
|
||||
extern P_OSTCB TCBNext; /*!< A pointer to TCB next be scheduled. */
|
||||
extern P_OSTCB TCBRunning; /*!< A pointer to TCB that is running. */
|
||||
|
||||
extern U64 OSCheckTime;
|
||||
extern volatile U8 OSIntNesting; /*!< Use to indicate interrupt nesting level.*/
|
||||
extern volatile U8 OSSchedLock; /*!< Schedule is lock(LOCK) or unlock(UN_LOCK).*/
|
||||
extern volatile BOOL TaskSchedReq;
|
||||
extern OS_STK idle_stk[CFG_IDLE_STACK_SIZE];
|
||||
|
||||
|
||||
void Schedule(void); /*!< Schedule function */
|
||||
void IdleTask(void* pdata); /*!< IDLE task code */
|
||||
void InsertToTCBRdyList (P_OSTCB tcbInser);
|
||||
void RemoveFromTCBRdyList(P_OSTCB ptcb);
|
||||
void CreateTCBList(void);
|
||||
#if CFG_ORDER_LIST_SCHEDULE_EN ==0
|
||||
void ActiveTaskPri(U8 pri);
|
||||
void DeleteTaskPri(U8 pri);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsTask.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Header file related to task.
|
||||
* @details This file including some defines and function declare related to task.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TASK_H
|
||||
#define _TASK_H
|
||||
|
||||
#define SYS_TASK_NUM (1) /*!< System task number. */
|
||||
|
||||
/*---------------------------- Task Status -----------------------------------*/
|
||||
#define TASK_READY 0 /*!< Ready status of task. */
|
||||
#define TASK_RUNNING 1 /*!< Running status of task. */
|
||||
#define TASK_WAITING 2 /*!< Waitting status of task. */
|
||||
#define TASK_DORMANT 3 /*!< Dormant status of task. */
|
||||
|
||||
|
||||
#define INVALID_ID (U8)0xff
|
||||
#define INVALID_VALUE (U32)0xffffffff
|
||||
#define MAGIC_WORD (U32)0x5a5aa5a5
|
||||
|
||||
|
||||
/**
|
||||
* @struct TCB task.h
|
||||
* @brief Task control blcok.
|
||||
* @details This struct use to manage task.
|
||||
*/
|
||||
typedef struct TCB
|
||||
{
|
||||
OS_STK *stkPtr; /*!< The current point of task. */
|
||||
U8 prio; /*!< Task priority. */
|
||||
U8 state; /*!< TaSk status. */
|
||||
OS_TID taskID; /*!< Task ID. */
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
OS_MutexID mutexID; /*!< Mutex ID. */
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
OS_EventID eventID; /*!< Event ID. */
|
||||
#endif
|
||||
|
||||
#if CFG_ROBIN_EN >0
|
||||
U16 timeSlice; /*!< Task time slice */
|
||||
#endif
|
||||
|
||||
#if CFG_STK_CHECKOUT_EN >0
|
||||
OS_STK *stack; /*!< The top point of task. */
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
void* pmail; /*!< Mail to task. */
|
||||
struct TCB *waitNext; /*!< Point to next TCB in the Event waitting list.*/
|
||||
struct TCB *waitPrev; /*!< Point to prev TCB in the Event waitting list.*/
|
||||
#endif
|
||||
|
||||
#if CFG_TASK_SCHEDULE_EN == 0
|
||||
FUNCPtr taskFuc;
|
||||
OS_STK *taskStk;
|
||||
#endif
|
||||
|
||||
|
||||
#if CFG_FLAG_EN > 0
|
||||
void* pnode; /*!< Pointer to node of event flag. */
|
||||
#endif
|
||||
|
||||
#if CFG_TASK_WAITTING_EN >0
|
||||
U32 delayTick; /*!< The number of ticks which delay. */
|
||||
#endif
|
||||
struct TCB *TCBnext; /*!< The pointer to next TCB. */
|
||||
struct TCB *TCBprev; /*!< The pointer to prev TCB. */
|
||||
|
||||
}OSTCB,*P_OSTCB;
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
// save tcb ptr that created
|
||||
extern P_OSTCB FreeTCB; /*!< A pointer to free TCB. */
|
||||
extern OSTCB TCBTbl[CFG_MAX_USER_TASKS+SYS_TASK_NUM];
|
||||
extern P_OSTCB TCBRdy; /*!< A pointer to TCB that is ready status */
|
||||
extern P_OSTCB TCBNext; /*!< A pointer to TCB next be scheduled. */
|
||||
extern P_OSTCB TCBRunning; /*!< A pointer to TCB that is running. */
|
||||
|
||||
extern U64 OSCheckTime;
|
||||
extern volatile U8 OSIntNesting; /*!< Use to indicate interrupt nesting level.*/
|
||||
extern volatile U8 OSSchedLock; /*!< Schedule is lock(LOCK) or unlock(UN_LOCK).*/
|
||||
extern volatile BOOL TaskSchedReq;
|
||||
extern OS_STK idle_stk[CFG_IDLE_STACK_SIZE];
|
||||
|
||||
|
||||
void Schedule(void); /*!< Schedule function */
|
||||
void IdleTask(void* pdata); /*!< IDLE task code */
|
||||
void InsertToTCBRdyList (P_OSTCB tcbInser);
|
||||
void RemoveFromTCBRdyList(P_OSTCB ptcb);
|
||||
void CreateTCBList(void);
|
||||
#if CFG_ORDER_LIST_SCHEDULE_EN ==0
|
||||
void ActiveTaskPri(U8 pri);
|
||||
void DeleteTaskPri(U8 pri);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,28 +1,51 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsTime.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Header file related to time management
|
||||
* @details Thie file including some data declare related to time managment.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TIME_H
|
||||
#define _TIME_H
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern P_OSTCB DlyList; /*!< A pointer to ther delay list. */
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void TimeDispose(void); /*!< Time dispose function. */
|
||||
extern void isr_TimeDispose(void);
|
||||
extern void RemoveDelayList(P_OSTCB ptcb);
|
||||
extern void InsertDelayList(P_OSTCB ptcb,U32 ticks);
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsTime.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Header file related to time management
|
||||
* @details Thie file including some data declare related to time managment.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TIME_H
|
||||
#define _TIME_H
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern P_OSTCB DlyList; /*!< A pointer to ther delay list. */
|
||||
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void TimeDispose(void); /*!< Time dispose function. */
|
||||
extern void isr_TimeDispose(void);
|
||||
extern void RemoveDelayList(P_OSTCB ptcb);
|
||||
extern void InsertDelayList(P_OSTCB ptcb,U32 ticks);
|
||||
#endif
|
||||
|
||||
@@ -1,49 +1,72 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsTimer.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Timer manage header file
|
||||
* @details This file including some declares and defines related to timer
|
||||
* management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TIMER_H
|
||||
#define _TIMER_H
|
||||
|
||||
#define TMR_STATE_RUNNING 0 /*!< Timer State: Running */
|
||||
#define TMR_STATE_STOPPED 1 /*!< Timer State: Stopped */
|
||||
|
||||
/**
|
||||
* @struct tmrCtrl timer.h
|
||||
* @brief Timer control block
|
||||
* @details This struct is use to manage user timer.
|
||||
*
|
||||
*/
|
||||
typedef struct tmrCtrl /* Timer Control Block Define. */
|
||||
{
|
||||
OS_TCID tmrID; /*!< Timer ID. */
|
||||
U8 tmrType; /*!< Timer Type. */
|
||||
U8 tmrState; /*!< Timer State. */
|
||||
U32 tmrCnt; /*!< Timer Counter. */
|
||||
U32 tmrReload; /*!< Timer Reload Counter Value. */
|
||||
vFUNCPtr tmrCallBack; /*!< Call-back Function When Timer overrun. */
|
||||
struct tmrCtrl* tmrNext; /*!< Point to Next Timer Control Block. */
|
||||
struct tmrCtrl* tmrPrev; /*!< Point to Previous Timer Control Block*/
|
||||
|
||||
}TmrCtrl,*P_TmrCtrl;
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern P_TmrCtrl TmrList; /*!< A pointer to the timer list. */
|
||||
extern U32 TmrIDVessel;
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void TmrDispose(void); /*!< Timer counter function. */
|
||||
extern void isr_TmrDispose(void);
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsTimer.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Timer manage header file
|
||||
* @details This file including some declares and defines related to timer
|
||||
* management.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TIMER_H
|
||||
#define _TIMER_H
|
||||
|
||||
#define TMR_STATE_RUNNING 0 /*!< Timer State: Running */
|
||||
#define TMR_STATE_STOPPED 1 /*!< Timer State: Stopped */
|
||||
|
||||
/**
|
||||
* @struct tmrCtrl timer.h
|
||||
* @brief Timer control block
|
||||
* @details This struct is use to manage user timer.
|
||||
*
|
||||
*/
|
||||
typedef struct tmrCtrl /* Timer Control Block Define. */
|
||||
{
|
||||
OS_TCID tmrID; /*!< Timer ID. */
|
||||
U8 tmrType; /*!< Timer Type. */
|
||||
U8 tmrState; /*!< Timer State. */
|
||||
U32 tmrCnt; /*!< Timer Counter. */
|
||||
U32 tmrReload; /*!< Timer Reload Counter Value. */
|
||||
vFUNCPtr tmrCallBack; /*!< Call-back Function When Timer overrun. */
|
||||
struct tmrCtrl* tmrNext; /*!< Point to Next Timer Control Block. */
|
||||
struct tmrCtrl* tmrPrev; /*!< Point to Previous Timer Control Block*/
|
||||
|
||||
}TmrCtrl,*P_TmrCtrl;
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern P_TmrCtrl TmrList; /*!< A pointer to the timer list. */
|
||||
extern U32 TmrIDVessel;
|
||||
/*---------------------------- Function declare ------------------------------*/
|
||||
extern void TmrDispose(void); /*!< Timer counter function. */
|
||||
extern void isr_TmrDispose(void);
|
||||
#endif
|
||||
|
||||
@@ -1,60 +1,83 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file coocox.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Gather for all header file of CooCox CoOS.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _COOCOX_H
|
||||
#define _COOCOX_H
|
||||
|
||||
#define OS_VERSION (U16)0x0113 /*!< OS version.(format: Vx.xx),
|
||||
e.g. value 0x0113 is version V1.13*/
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include "CoOS.h"
|
||||
#include "OsArch.h"
|
||||
#include "OsCore.h"
|
||||
#include "OsTask.h"
|
||||
#include "OsServiceReq.h"
|
||||
#include "OsError.h"
|
||||
#include "OsTime.h"
|
||||
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
#include "OsTimer.h"
|
||||
#endif
|
||||
|
||||
#if CFG_KHEAP_EN > 0
|
||||
#include "OsKernelHeap.h"
|
||||
#endif
|
||||
|
||||
#if CFG_MM_EN >0
|
||||
#include "OsMM.h"
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
#include "OsEvent.h"
|
||||
#endif
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
#include "OsMutex.h"
|
||||
#endif
|
||||
|
||||
#if CFG_QUEUE_EN > 0
|
||||
#include "OsQueue.h"
|
||||
#endif
|
||||
|
||||
#if CFG_FLAG_EN > 0
|
||||
#include "OsFlag.h"
|
||||
#endif
|
||||
|
||||
#endif /* _COOCOX_H */
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file coocox.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Gather for all header file of CooCox CoOS.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _COOCOX_H
|
||||
#define _COOCOX_H
|
||||
|
||||
#define OS_VERSION (U16)0x0116 /*!< OS version.(format: Vx.xx),
|
||||
e.g. value 0x0114 is version V1.14*/
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include "CoOS.h"
|
||||
#include "OsArch.h"
|
||||
#include "OsCore.h"
|
||||
#include "OsTask.h"
|
||||
#include "OsServiceReq.h"
|
||||
#include "OsError.h"
|
||||
#include "OsTime.h"
|
||||
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
#include "OsTimer.h"
|
||||
#endif
|
||||
|
||||
#if CFG_KHEAP_EN > 0
|
||||
#include "OsKernelHeap.h"
|
||||
#endif
|
||||
|
||||
#if CFG_MM_EN >0
|
||||
#include "OsMM.h"
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
#include "OsEvent.h"
|
||||
#endif
|
||||
|
||||
#if CFG_MUTEX_EN > 0
|
||||
#include "OsMutex.h"
|
||||
#endif
|
||||
|
||||
#if CFG_QUEUE_EN > 0
|
||||
#include "OsQueue.h"
|
||||
#endif
|
||||
|
||||
#if CFG_FLAG_EN > 0
|
||||
#include "OsFlag.h"
|
||||
#endif
|
||||
|
||||
#endif /* _COOCOX_H */
|
||||
|
||||
+261
-238
@@ -1,238 +1,261 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file core.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Core implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
volatile U8 OSIntNesting = 0; /*!< Use to indicate interrupt nesting level*/
|
||||
volatile U8 OSSchedLock = 0; /*!< Task Switch lock. */
|
||||
volatile BOOL TaskSchedReq = Co_FALSE;
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Enter a ISR.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to notify OS when enter to an ISR.
|
||||
*
|
||||
* @note When you call API in ISR,you must call CoEnterISR() before your
|
||||
* interrupt handler code,and call CoExitISR() after your handler
|
||||
* code and before exiting from ISR.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoEnterISR(void)
|
||||
{
|
||||
Inc8(&OSIntNesting); /* OSIntNesting increment */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Exit a ISR.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called when exit from a ISR.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoExitISR(void)
|
||||
{
|
||||
Dec8(&OSIntNesting); /* OSIntNesting decrease */
|
||||
if( OSIntNesting == 0) /* Is OSIntNesting == 0? */
|
||||
{
|
||||
if(TaskSchedReq == Co_TRUE)
|
||||
{
|
||||
OSSchedLock++;
|
||||
Schedule(); /* Call task schedule */
|
||||
OSSchedLock--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Unlock schedule
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to unlock schedule(i.e.enable schedule again)
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void OsSchedUnlock(void)
|
||||
{
|
||||
if(OSSchedLock == 1) /* Is OSSchedLock == 0? */
|
||||
{
|
||||
#if CFG_TASK_WAITTING_EN > 0
|
||||
if(IsrReq == Co_TRUE)
|
||||
{
|
||||
RespondSRQ(); /* Respond service request */
|
||||
}
|
||||
#endif
|
||||
/* Judge task state change or higher PRI task coming in */
|
||||
if(TaskSchedReq == Co_TRUE)
|
||||
{
|
||||
Schedule(); /* Call task schedule */
|
||||
}
|
||||
OSSchedLock = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
OSSchedLock--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Lock schedule
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in application code to lock schedule.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoSchedLock(void)
|
||||
{
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Unlock schedule
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in APP to unlock schedule.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoSchedUnlock(void)
|
||||
{
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Initialize OS
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to initialize OS.
|
||||
*
|
||||
* @note You must call this function first,before any other OS API function
|
||||
*
|
||||
* @code There is a example for useage of this function,as follows:
|
||||
* e.g.
|
||||
* ... // Your target initial code.
|
||||
*
|
||||
* OsInit(); // Initial OS.
|
||||
* CreateTask(...); // Create tasks.
|
||||
* ...
|
||||
* OsStart(); // Start multitask.
|
||||
* @endcode
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoInitOS(void)
|
||||
{
|
||||
InitSysTick(); /* Initialize system tick. */
|
||||
InitInt(); /* Initialize PendSV,SVC,SysTick interrupt */
|
||||
CreateTCBList(); /* Create TCB list. */
|
||||
#if CFG_EVENT_EN > 0
|
||||
CreateEventList(); /* Create event control list. */
|
||||
#endif
|
||||
#if CFG_KHEAP_EN > 0
|
||||
CoCreateKheap(); /* Create kernel heap within user define */
|
||||
#endif
|
||||
OsSchedLock(); /* Lock Schedule */
|
||||
/* Create first task -- IDLE task. */
|
||||
CoCreateTask( CoIdleTask,
|
||||
Co_NULL,
|
||||
CFG_LOWEST_PRIO,
|
||||
&idle_stk[CFG_IDLE_STACK_SIZE-1],
|
||||
CFG_IDLE_STACK_SIZE
|
||||
);
|
||||
/* Set PSP for CoIdleTask coming in */
|
||||
SetEnvironment(&idle_stk[CFG_IDLE_STACK_SIZE-1]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Start multitask
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to start multitask.After it is called,
|
||||
* OS start schedule task by priority or/and time slice.
|
||||
* @note This function must be called to start OS when you use CoOS,and must
|
||||
* call after CoOsInit().
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoStartOS(void)
|
||||
{
|
||||
TCBRunning = &TCBTbl[0]; /* Get running task */
|
||||
TCBNext = TCBRunning; /* Set next scheduled task as running task */
|
||||
TCBRunning->state = TASK_RUNNING; /* Set running task status to RUNNING */
|
||||
RemoveFromTCBRdyList(TCBRunning); /* Remove running task from READY list */
|
||||
OsSchedUnlock(); /* Enable Schedule,call task schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get OS version
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval The value is version of OS mutipled by 100.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is used to return the version number of CooCox OS.
|
||||
* the return value corresponds to CooCox's version number multiplied
|
||||
* by 100. In other words, version 1.02 would be returned as 102.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_VER CoGetOSVersion(void)
|
||||
{
|
||||
return OS_VERSION; /* Get CooCox CoOS version */
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file core.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Core implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
volatile U8 OSIntNesting = 0; /*!< Use to indicate interrupt nesting level*/
|
||||
volatile U8 OSSchedLock = 0; /*!< Task Switch lock. */
|
||||
volatile BOOL TaskSchedReq = Co_FALSE;
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Enter a ISR.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to notify OS when enter to an ISR.
|
||||
*
|
||||
* @note When you call API in ISR,you must call CoEnterISR() before your
|
||||
* interrupt handler code,and call CoExitISR() after your handler
|
||||
* code and before exiting from ISR.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoEnterISR(void)
|
||||
{
|
||||
Inc8(&OSIntNesting); /* OSIntNesting increment */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Exit a ISR.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called when exit from a ISR.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoExitISR(void)
|
||||
{
|
||||
Dec8(&OSIntNesting); /* OSIntNesting decrease */
|
||||
if( OSIntNesting == 0) /* Is OSIntNesting == 0? */
|
||||
{
|
||||
if(TaskSchedReq == Co_TRUE)
|
||||
{
|
||||
OSSchedLock++;
|
||||
Schedule(); /* Call task schedule */
|
||||
OSSchedLock--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Unlock schedule
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to unlock schedule(i.e.enable schedule again)
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void OsSchedUnlock(void)
|
||||
{
|
||||
if(OSSchedLock == 1) /* Is OSSchedLock == 0? */
|
||||
{
|
||||
#if CFG_TASK_WAITTING_EN > 0
|
||||
if(IsrReq == Co_TRUE)
|
||||
{
|
||||
RespondSRQ(); /* Respond service request */
|
||||
}
|
||||
#endif
|
||||
/* Judge task state change or higher PRI task coming in */
|
||||
if(TaskSchedReq == Co_TRUE)
|
||||
{
|
||||
Schedule(); /* Call task schedule */
|
||||
}
|
||||
OSSchedLock = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
OSSchedLock--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Lock schedule
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in application code to lock schedule.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoSchedLock(void)
|
||||
{
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Unlock schedule
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in APP to unlock schedule.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoSchedUnlock(void)
|
||||
{
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Initialize OS
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to initialize OS.
|
||||
*
|
||||
* @note You must call this function first,before any other OS API function
|
||||
*
|
||||
* @code There is a example for useage of this function,as follows:
|
||||
* e.g.
|
||||
* ... // Your target initial code.
|
||||
*
|
||||
* OsInit(); // Initial OS.
|
||||
* CreateTask(...); // Create tasks.
|
||||
* ...
|
||||
* OsStart(); // Start multitask.
|
||||
* @endcode
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoInitOS(void)
|
||||
{
|
||||
InitSysTick(); /* Initialize system tick. */
|
||||
InitInt(); /* Initialize PendSV,SVC,SysTick interrupt */
|
||||
CreateTCBList(); /* Create TCB list. */
|
||||
#if CFG_EVENT_EN > 0
|
||||
CreateEventList(); /* Create event control list. */
|
||||
#endif
|
||||
#if CFG_KHEAP_EN > 0
|
||||
CoCreateKheap(); /* Create kernel heap within user define */
|
||||
#endif
|
||||
OsSchedLock(); /* Lock Schedule */
|
||||
/* Create first task -- IDLE task. */
|
||||
CoCreateTask( CoIdleTask,
|
||||
Co_NULL,
|
||||
CFG_LOWEST_PRIO,
|
||||
&idle_stk[CFG_IDLE_STACK_SIZE-1],
|
||||
CFG_IDLE_STACK_SIZE
|
||||
);
|
||||
/* Set PSP for CoIdleTask coming in */
|
||||
SetEnvironment(&idle_stk[CFG_IDLE_STACK_SIZE-1]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Start multitask
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to start multitask.After it is called,
|
||||
* OS start schedule task by priority or/and time slice.
|
||||
* @note This function must be called to start OS when you use CoOS,and must
|
||||
* call after CoOsInit().
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoStartOS(void)
|
||||
{
|
||||
TCBRunning = &TCBTbl[0]; /* Get running task */
|
||||
TCBNext = TCBRunning; /* Set next scheduled task as running task */
|
||||
TCBRunning->state = TASK_RUNNING; /* Set running task status to RUNNING */
|
||||
RemoveFromTCBRdyList(TCBRunning); /* Remove running task from READY list */
|
||||
OsSchedUnlock(); /* Enable Schedule,call task schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get OS version
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval The value is version of OS mutipled by 100.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is used to return the version number of CooCox OS.
|
||||
* the return value corresponds to CooCox's version number multiplied
|
||||
* by 100. In other words, version 1.02 would be returned as 102.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_VER CoGetOSVersion(void)
|
||||
{
|
||||
return OS_VERSION; /* Get CooCox CoOS version */
|
||||
}
|
||||
|
||||
|
||||
+435
-410
@@ -1,410 +1,435 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file event.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief event management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
#if CFG_EVENT_EN > 0
|
||||
|
||||
ECB EventTbl[CFG_MAX_EVENT]= {{0}};/*!< Table which save event control block.*/
|
||||
P_ECB FreeEventList = Co_NULL; /*!< Pointer to free event control block. */
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a empty list of event control block
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called by OSInit() API to create a ECB list,supply
|
||||
* a pointer to next event control block that not used.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CreateEventList(void)
|
||||
{
|
||||
U8 i;
|
||||
P_ECB pecb1;
|
||||
#if CFG_MAX_EVENT > 1
|
||||
P_ECB pecb2;
|
||||
#endif
|
||||
i=0;
|
||||
pecb1 = &EventTbl[0]; /* Get first item */
|
||||
#if CFG_MAX_EVENT == 1 /* Build event list for only one item */
|
||||
pecb1->eventPtr = Co_NULL;
|
||||
pecb1->id = i; /* Assign ID. */
|
||||
pecb1->eventType = EVENT_TYPE_INVALID; /* Sign that not to use. */
|
||||
#endif
|
||||
|
||||
#if CFG_MAX_EVENT > 1 /* Build event list for more than one item */
|
||||
pecb2 = &EventTbl[1];
|
||||
for(;i< (CFG_MAX_EVENT-1);i++ )
|
||||
{
|
||||
pecb1->eventPtr = (void*)pecb2; /* Set link for list */
|
||||
pecb1->id = i; /* Assign ID. */
|
||||
pecb1->eventType = EVENT_TYPE_INVALID;/* Sign that not to use. */
|
||||
pecb1++; /* Get next item */
|
||||
pecb2++;
|
||||
}
|
||||
pecb1->eventType = EVENT_TYPE_INVALID; /* Sign that not to use. */
|
||||
pecb1->eventPtr = Co_NULL; /* Set link for last item */
|
||||
pecb1->id = i;
|
||||
#endif
|
||||
|
||||
FreeEventList = &EventTbl[0]; /* Set free event item */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Release a ECB
|
||||
* @param[in] pecb A pointer to event control block which be released.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to release a event control block when a
|
||||
* event be deleted.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static void ReleaseECB(P_ECB pecb)
|
||||
{
|
||||
pecb->eventType = EVENT_TYPE_INVALID; /* Sign that not to use. */
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
pecb->eventPtr = FreeEventList; /* Release ECB that event hold */
|
||||
FreeEventList = pecb; /* Reset free event item */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a event
|
||||
* @param[in] eventType The type of event which being created.
|
||||
* @param[in] eventSortType Event sort type.
|
||||
* @param[in] eventCounter Event counter,ONLY for EVENT_TYPE_SEM.
|
||||
* @param[in] eventPtr Event struct pointer,ONLY for Queue.Co_NULL for other
|
||||
* event type.
|
||||
* @param[out] None
|
||||
* @retval Co_NULL Invalid pointer,create event fail.
|
||||
* @retval others Pointer to event control block which had assigned right now.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called by CreateSem(),...
|
||||
* to get a event control block and initial the event content.
|
||||
*
|
||||
* @note This is a internal function of CooCox CoOS,User can't call.
|
||||
*******************************************************************************
|
||||
*/
|
||||
P_ECB CreatEvent(U8 eventType,U8 eventSortType,void* eventPtr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
if(FreeEventList == Co_NULL) /* Is there no free evnet item */
|
||||
{
|
||||
OsSchedUnlock(); /* Yes,unlock schedule */
|
||||
return Co_NULL; /* Return error */
|
||||
}
|
||||
pecb = FreeEventList;/* Assign the free event item to this event */
|
||||
FreeEventList = FreeEventList->eventPtr; /* Reset free event item */
|
||||
OsSchedUnlock(); /* Unlock schedul */
|
||||
|
||||
pecb->eventType = eventType; /* Initialize event item as user set */
|
||||
pecb->eventSortType = eventSortType;
|
||||
pecb->eventPtr = eventPtr;
|
||||
pecb->eventTCBList = Co_NULL;
|
||||
return pecb; /* Return event item pointer */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a event
|
||||
* @param[in] pecb Pointer to event control block which will be deleted.
|
||||
* @param[in] opt Delete option.
|
||||
* @arg == OPT_DEL_ANYWAY Delete event always
|
||||
* @arg == OPT_DEL_NO_PEND Delete event only when no task pending on.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_PARAMETER Parameter passed is invalid,deleted fail.
|
||||
* @retval E_TASK_WAITTING These are one more tasks waitting event.
|
||||
* @retval E_OK Delete event control block successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a event from the event wait list
|
||||
* use specify option.
|
||||
*
|
||||
* @note This is a internal function of Coocox CoOS,user can't call.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType DeleteEvent(P_ECB pecb,U8 opt)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
if(opt == OPT_DEL_NO_PEND) /* Do delete event when no task pend? */
|
||||
{
|
||||
if(pecb->eventTCBList != Co_NULL) /* Yes,is there task pend this event? */
|
||||
{
|
||||
return E_TASK_WAITING; /* Yes,error return */
|
||||
}
|
||||
else
|
||||
{
|
||||
ReleaseECB(pecb); /* No,release resource that event hold*/
|
||||
}
|
||||
}
|
||||
else if(opt == OPT_DEL_ANYWAY) /* Do delete event anyway? */
|
||||
{
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
while(pecb->eventTCBList != Co_NULL) /* Is there task pend this event? */
|
||||
{ /* Yes,remove it */
|
||||
ptcb = pecb->eventTCBList;/* Get first task in event waiting list */
|
||||
if(ptcb->delayTick != INVALID_VALUE) /* Is task in delay list? */
|
||||
{
|
||||
RemoveDelayList(ptcb); /* Yes,remove task from delay list */
|
||||
}
|
||||
|
||||
/* Set next item as event waiting list head */
|
||||
pecb->eventTCBList = ptcb->waitNext;
|
||||
ptcb->waitNext = Co_NULL; /* Clear link for event waiting list */
|
||||
ptcb->eventID = INVALID_ID; /* Sign that not to use. */
|
||||
|
||||
InsertToTCBRdyList(ptcb); /* Insert task into ready list */
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
ReleaseECB(pecb); /* Release resource that event hold */
|
||||
}
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert a task to event wait list
|
||||
* @param[in] pecb Pointer to event control block corresponding to the event.
|
||||
* @param[in] ptcb Pointer to task that will be insert to event wait list.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to insert a task by fllowing manner:
|
||||
* opt == EVENT_SORT_TYPE_FIFO By FIFO.
|
||||
* opt == EVENT_SORT_TYPE_PRIO By priority order,hghest priority
|
||||
* as head,lowest priority as end.
|
||||
* (Highest-->...-->Lowest-->Co_NULL)
|
||||
*******************************************************************************
|
||||
*/
|
||||
void EventTaskToWait(P_ECB pecb,P_OSTCB ptcb)
|
||||
{
|
||||
P_OSTCB ptcb1;
|
||||
#if (CFG_EVENT_SORT == 2) || (CFG_EVENT_SORT == 3)
|
||||
P_OSTCB ptcb2;
|
||||
#endif
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
ptcb1 = pecb->eventTCBList; /* Get first task in event waiting list */
|
||||
ptcb->eventID = pecb->id; /* Set event ID for task */
|
||||
|
||||
#if CFG_EVENT_SORT == 3 /* Does event waiting list sort as FIFO? */
|
||||
|
||||
if(pecb->eventSortType == EVENT_SORT_TYPE_FIFO)
|
||||
#endif
|
||||
|
||||
#if (CFG_EVENT_SORT == 1) || (CFG_EVENT_SORT == 3)
|
||||
{
|
||||
if(ptcb1 == Co_NULL) /* Is no item in event waiting list?*/
|
||||
{
|
||||
pecb->eventTCBList = ptcb; /* Yes,set task as first item */
|
||||
}
|
||||
else
|
||||
{
|
||||
while(ptcb1->waitNext != Co_NULL)/* No,insert task in last */
|
||||
{
|
||||
ptcb1 = ptcb1->waitNext;
|
||||
}
|
||||
ptcb1->waitNext = ptcb; /* Set link for list */
|
||||
ptcb->waitPrev = ptcb1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_SORT ==3 /* Does event waiting list sort as preemptive priority?*/
|
||||
else if(pecb->eventSortType == EVENT_SORT_TYPE_PRIO)
|
||||
#endif
|
||||
#if (CFG_EVENT_SORT == 2) || (CFG_EVENT_SORT == 3)
|
||||
{
|
||||
if(ptcb1 == Co_NULL) /* Is no item in event waiting list? */
|
||||
{
|
||||
pecb->eventTCBList = ptcb; /* Yes,set task as first item */
|
||||
}
|
||||
/* Is PRI of task higher than list first item? */
|
||||
else if(ptcb1->prio > ptcb->prio)
|
||||
{
|
||||
pecb->eventTCBList = ptcb; /* Reset task as first item */
|
||||
ptcb->waitNext = ptcb1; /* Set link for list */
|
||||
ptcb1->waitPrev = ptcb;
|
||||
}
|
||||
else /* No,find correct place to insert */
|
||||
{
|
||||
ptcb2 = ptcb1->waitNext;
|
||||
while(ptcb2 != Co_NULL) /* Is last item? */
|
||||
{
|
||||
if(ptcb2->prio > ptcb->prio) /* No,is correct place? */
|
||||
{
|
||||
break; /* Yes,break Circulation */
|
||||
}
|
||||
ptcb1 = ptcb2; /* Save current item */
|
||||
ptcb2 = ptcb2->waitNext; /* Get next item */
|
||||
}
|
||||
ptcb1->waitNext = ptcb; /* Set link for list */
|
||||
ptcb->waitPrev = ptcb1;
|
||||
ptcb->waitNext = ptcb2;
|
||||
if(ptcb2 != Co_NULL)
|
||||
{
|
||||
ptcb2->waitPrev = ptcb;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ptcb->state = TASK_WAITING; /* Set task status to TASK_WAITING state */
|
||||
TaskSchedReq = Co_TRUE;
|
||||
OsSchedUnlock(); /* Unlock schedule,and call task schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Move a task from event WAITING list to the DELAY list
|
||||
* @param[in] pecb Pointer to event control block corresponding to the event.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove a task from event wait list,and
|
||||
* then insert it into the READY list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void EventTaskToRdy(P_ECB pecb)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
#if CFG_QUEUE_EN >0
|
||||
P_QCB pqcb;
|
||||
#endif
|
||||
ptcb = pecb->eventTCBList;
|
||||
if(ptcb == Co_NULL)
|
||||
return;
|
||||
|
||||
pecb->eventTCBList = ptcb->waitNext;/* Get first task in event waiting list*/
|
||||
if(pecb->eventTCBList != Co_NULL) /* Is no item in event waiting list? */
|
||||
{
|
||||
pecb->eventTCBList->waitPrev = Co_NULL; /* No,clear link for first item */
|
||||
}
|
||||
|
||||
ptcb->waitNext = Co_NULL; /* Clear event waiting link for task*/
|
||||
ptcb->eventID = INVALID_ID; /* Sign that not to use. */
|
||||
|
||||
if(ptcb->delayTick != INVALID_VALUE) /* Is task in delay list? */
|
||||
{
|
||||
RemoveDelayList(ptcb); /* Yes,remove task from DELAY list */
|
||||
}
|
||||
if(pecb->eventType == EVENT_TYPE_MBOX)/* Is it a mailbox event? */
|
||||
{
|
||||
ptcb->pmail = pecb->eventPtr; /* Yes,send mail to task */
|
||||
pecb->eventPtr = Co_NULL; /* Clear event sign */
|
||||
pecb->eventCounter--;
|
||||
}
|
||||
#if CFG_QUEUE_EN >0
|
||||
else if(pecb->eventType == EVENT_TYPE_QUEUE) /* Is it a queue event? */
|
||||
{
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Yes,get queue pointer */
|
||||
ptcb->pmail = *(pqcb->qStart + pqcb->head); /* Send mail to task */
|
||||
pqcb->head++; /* Clear event sign */
|
||||
pqcb->qSize--;
|
||||
if(pqcb->head == pqcb->qMaxSize)
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_MAILBOX_EN >0
|
||||
else if(pecb->eventType == EVENT_TYPE_SEM)/* Is it a semaphore event? */
|
||||
{
|
||||
pecb->eventCounter--; /* Yes,clear event sign */
|
||||
ptcb->pmail = (void*)0xffffffff; /* Indicate task woke by event */
|
||||
}
|
||||
#endif
|
||||
if(ptcb == TCBRunning)
|
||||
{
|
||||
ptcb->state = TASK_RUNNING;
|
||||
}
|
||||
else
|
||||
{
|
||||
InsertToTCBRdyList(ptcb); /* Insert task into ready list */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Move a task from event wait list to the ready list
|
||||
* @param[in] pecb Pointer to event control block corresponding to the event.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove a task from event wait list,and
|
||||
* then insert it to the ready list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RemoveEventWaittingList(P_OSTCB ptcb)
|
||||
{
|
||||
P_ECB pecb;
|
||||
pecb = &EventTbl[ptcb->eventID]; /* Get event control block */
|
||||
|
||||
/* Is there only one item in event waiting list? */
|
||||
if((ptcb->waitNext == Co_NULL) && (ptcb->waitPrev == Co_NULL))
|
||||
{
|
||||
pecb->eventTCBList = Co_NULL; /* Yes,set event waiting list as Co_NULL */
|
||||
}
|
||||
else if(ptcb->waitPrev == Co_NULL)/* Is the first item in event waiting list?*/
|
||||
{
|
||||
/* Yes,remove task from list,and reset event waiting list */
|
||||
ptcb->waitNext->waitPrev = Co_NULL;
|
||||
pecb->eventTCBList = ptcb->waitNext;
|
||||
ptcb->waitNext = Co_NULL;
|
||||
}
|
||||
else if(ptcb->waitNext == Co_NULL)/* Is the last item in event waiting list? */
|
||||
{
|
||||
ptcb->waitPrev->waitNext = Co_NULL; /* Yes,remove task form list */
|
||||
ptcb->waitPrev = Co_NULL;
|
||||
}
|
||||
else /* No, remove task from list */
|
||||
{
|
||||
ptcb->waitPrev->waitNext = ptcb->waitNext;
|
||||
ptcb->waitNext->waitPrev = ptcb->waitPrev;
|
||||
ptcb->waitPrev = Co_NULL;
|
||||
ptcb->waitNext = Co_NULL;
|
||||
}
|
||||
ptcb->eventID = INVALID_ID; /* Sign that not to use. */
|
||||
}
|
||||
|
||||
#endif //CFG_EVENT_EN
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file event.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief event management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
#if CFG_EVENT_EN > 0
|
||||
|
||||
ECB EventTbl[CFG_MAX_EVENT]= {{0}};/*!< Table which save event control block.*/
|
||||
P_ECB FreeEventList = Co_NULL; /*!< Pointer to free event control block. */
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a empty list of event control block
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called by OSInit() API to create a ECB list,supply
|
||||
* a pointer to next event control block that not used.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CreateEventList(void)
|
||||
{
|
||||
U8 i;
|
||||
P_ECB pecb1;
|
||||
#if CFG_MAX_EVENT > 1
|
||||
P_ECB pecb2;
|
||||
#endif
|
||||
i=0;
|
||||
pecb1 = &EventTbl[0]; /* Get first item */
|
||||
#if CFG_MAX_EVENT == 1 /* Build event list for only one item */
|
||||
pecb1->eventPtr = Co_NULL;
|
||||
pecb1->id = i; /* Assign ID. */
|
||||
pecb1->eventType = EVENT_TYPE_INVALID; /* Sign that not to use. */
|
||||
#endif
|
||||
|
||||
#if CFG_MAX_EVENT > 1 /* Build event list for more than one item */
|
||||
pecb2 = &EventTbl[1];
|
||||
for(;i< (CFG_MAX_EVENT-1);i++ )
|
||||
{
|
||||
pecb1->eventPtr = (void*)pecb2; /* Set link for list */
|
||||
pecb1->id = i; /* Assign ID. */
|
||||
pecb1->eventType = EVENT_TYPE_INVALID;/* Sign that not to use. */
|
||||
pecb1++; /* Get next item */
|
||||
pecb2++;
|
||||
}
|
||||
pecb1->eventType = EVENT_TYPE_INVALID; /* Sign that not to use. */
|
||||
pecb1->eventPtr = Co_NULL; /* Set link for last item */
|
||||
pecb1->id = i;
|
||||
#endif
|
||||
|
||||
FreeEventList = &EventTbl[0]; /* Set free event item */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Release a ECB
|
||||
* @param[in] pecb A pointer to event control block which be released.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to release a event control block when a
|
||||
* event be deleted.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static void ReleaseECB(P_ECB pecb)
|
||||
{
|
||||
pecb->eventType = EVENT_TYPE_INVALID; /* Sign that not to use. */
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
pecb->eventPtr = FreeEventList; /* Release ECB that event hold */
|
||||
FreeEventList = pecb; /* Reset free event item */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a event
|
||||
* @param[in] eventType The type of event which being created.
|
||||
* @param[in] eventSortType Event sort type.
|
||||
* @param[in] eventCounter Event counter,ONLY for EVENT_TYPE_SEM.
|
||||
* @param[in] eventPtr Event struct pointer,ONLY for Queue.Co_NULL for other
|
||||
* event type.
|
||||
* @param[out] None
|
||||
* @retval Co_NULL Invalid pointer,create event fail.
|
||||
* @retval others Pointer to event control block which had assigned right now.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called by CreateSem(),...
|
||||
* to get a event control block and initial the event content.
|
||||
*
|
||||
* @note This is a internal function of CooCox CoOS,User can't call.
|
||||
*******************************************************************************
|
||||
*/
|
||||
P_ECB CreatEvent(U8 eventType,U8 eventSortType,void* eventPtr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
if(FreeEventList == Co_NULL) /* Is there no free evnet item */
|
||||
{
|
||||
OsSchedUnlock(); /* Yes,unlock schedule */
|
||||
return Co_NULL; /* Return error */
|
||||
}
|
||||
pecb = FreeEventList;/* Assign the free event item to this event */
|
||||
FreeEventList = FreeEventList->eventPtr; /* Reset free event item */
|
||||
OsSchedUnlock(); /* Unlock schedul */
|
||||
|
||||
pecb->eventType = eventType; /* Initialize event item as user set */
|
||||
pecb->eventSortType = eventSortType;
|
||||
pecb->eventPtr = eventPtr;
|
||||
pecb->eventTCBList = Co_NULL;
|
||||
return pecb; /* Return event item pointer */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a event
|
||||
* @param[in] pecb Pointer to event control block which will be deleted.
|
||||
* @param[in] opt Delete option.
|
||||
* @arg == OPT_DEL_ANYWAY Delete event always
|
||||
* @arg == OPT_DEL_NO_PEND Delete event only when no task pending on.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_PARAMETER Parameter passed is invalid,deleted fail.
|
||||
* @retval E_TASK_WAITTING These are one more tasks waitting event.
|
||||
* @retval E_OK Delete event control block successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a event from the event wait list
|
||||
* use specify option.
|
||||
*
|
||||
* @note This is a internal function of Coocox CoOS,user can't call.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType DeleteEvent(P_ECB pecb,U8 opt)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
if(opt == OPT_DEL_NO_PEND) /* Do delete event when no task pend? */
|
||||
{
|
||||
if(pecb->eventTCBList != Co_NULL) /* Yes,is there task pend this event? */
|
||||
{
|
||||
return E_TASK_WAITING; /* Yes,error return */
|
||||
}
|
||||
else
|
||||
{
|
||||
ReleaseECB(pecb); /* No,release resource that event hold*/
|
||||
}
|
||||
}
|
||||
else if(opt == OPT_DEL_ANYWAY) /* Do delete event anyway? */
|
||||
{
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
while(pecb->eventTCBList != Co_NULL) /* Is there task pend this event? */
|
||||
{ /* Yes,remove it */
|
||||
ptcb = pecb->eventTCBList;/* Get first task in event waiting list */
|
||||
if(ptcb->delayTick != INVALID_VALUE) /* Is task in delay list? */
|
||||
{
|
||||
RemoveDelayList(ptcb); /* Yes,remove task from delay list */
|
||||
}
|
||||
|
||||
/* Set next item as event waiting list head */
|
||||
pecb->eventTCBList = ptcb->waitNext;
|
||||
ptcb->waitNext = Co_NULL; /* Clear link for event waiting list */
|
||||
ptcb->eventID = INVALID_ID; /* Sign that not to use. */
|
||||
|
||||
InsertToTCBRdyList(ptcb); /* Insert task into ready list */
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
ReleaseECB(pecb); /* Release resource that event hold */
|
||||
}
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert a task to event wait list
|
||||
* @param[in] pecb Pointer to event control block corresponding to the event.
|
||||
* @param[in] ptcb Pointer to task that will be insert to event wait list.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to insert a task by fllowing manner:
|
||||
* opt == EVENT_SORT_TYPE_FIFO By FIFO.
|
||||
* opt == EVENT_SORT_TYPE_PRIO By priority order,hghest priority
|
||||
* as head,lowest priority as end.
|
||||
* (Highest-->...-->Lowest-->Co_NULL)
|
||||
*******************************************************************************
|
||||
*/
|
||||
void EventTaskToWait(P_ECB pecb,P_OSTCB ptcb)
|
||||
{
|
||||
P_OSTCB ptcb1;
|
||||
#if (CFG_EVENT_SORT == 2) || (CFG_EVENT_SORT == 3)
|
||||
P_OSTCB ptcb2;
|
||||
#endif
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
ptcb1 = pecb->eventTCBList; /* Get first task in event waiting list */
|
||||
ptcb->eventID = pecb->id; /* Set event ID for task */
|
||||
|
||||
#if CFG_EVENT_SORT == 3 /* Does event waiting list sort as FIFO? */
|
||||
|
||||
if(pecb->eventSortType == EVENT_SORT_TYPE_FIFO)
|
||||
#endif
|
||||
|
||||
#if (CFG_EVENT_SORT == 1) || (CFG_EVENT_SORT == 3)
|
||||
{
|
||||
if(ptcb1 == Co_NULL) /* Is no item in event waiting list?*/
|
||||
{
|
||||
pecb->eventTCBList = ptcb; /* Yes,set task as first item */
|
||||
}
|
||||
else
|
||||
{
|
||||
while(ptcb1->waitNext != Co_NULL)/* No,insert task in last */
|
||||
{
|
||||
ptcb1 = ptcb1->waitNext;
|
||||
}
|
||||
ptcb1->waitNext = ptcb; /* Set link for list */
|
||||
ptcb->waitPrev = ptcb1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_EVENT_SORT ==3 /* Does event waiting list sort as preemptive priority?*/
|
||||
else if(pecb->eventSortType == EVENT_SORT_TYPE_PRIO)
|
||||
#endif
|
||||
#if (CFG_EVENT_SORT == 2) || (CFG_EVENT_SORT == 3)
|
||||
{
|
||||
if(ptcb1 == Co_NULL) /* Is no item in event waiting list? */
|
||||
{
|
||||
pecb->eventTCBList = ptcb; /* Yes,set task as first item */
|
||||
}
|
||||
/* Is PRI of task higher than list first item? */
|
||||
else if(ptcb1->prio > ptcb->prio)
|
||||
{
|
||||
pecb->eventTCBList = ptcb; /* Reset task as first item */
|
||||
ptcb->waitNext = ptcb1; /* Set link for list */
|
||||
ptcb1->waitPrev = ptcb;
|
||||
}
|
||||
else /* No,find correct place to insert */
|
||||
{
|
||||
ptcb2 = ptcb1->waitNext;
|
||||
while(ptcb2 != Co_NULL) /* Is last item? */
|
||||
{
|
||||
if(ptcb2->prio > ptcb->prio) /* No,is correct place? */
|
||||
{
|
||||
break; /* Yes,break Circulation */
|
||||
}
|
||||
ptcb1 = ptcb2; /* Save current item */
|
||||
ptcb2 = ptcb2->waitNext; /* Get next item */
|
||||
}
|
||||
ptcb1->waitNext = ptcb; /* Set link for list */
|
||||
ptcb->waitPrev = ptcb1;
|
||||
ptcb->waitNext = ptcb2;
|
||||
if(ptcb2 != Co_NULL)
|
||||
{
|
||||
ptcb2->waitPrev = ptcb;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ptcb->state = TASK_WAITING; /* Set task status to TASK_WAITING state */
|
||||
TaskSchedReq = Co_TRUE;
|
||||
OsSchedUnlock(); /* Unlock schedule,and call task schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Move a task from event WAITING list to the DELAY list
|
||||
* @param[in] pecb Pointer to event control block corresponding to the event.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove a task from event wait list,and
|
||||
* then insert it into the READY list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void EventTaskToRdy(P_ECB pecb)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
#if CFG_QUEUE_EN >0
|
||||
P_QCB pqcb;
|
||||
#endif
|
||||
ptcb = pecb->eventTCBList;
|
||||
if(ptcb == Co_NULL)
|
||||
return;
|
||||
|
||||
pecb->eventTCBList = ptcb->waitNext;/* Get first task in event waiting list*/
|
||||
if(pecb->eventTCBList != Co_NULL) /* Is no item in event waiting list? */
|
||||
{
|
||||
pecb->eventTCBList->waitPrev = Co_NULL; /* No,clear link for first item */
|
||||
}
|
||||
|
||||
ptcb->waitNext = Co_NULL; /* Clear event waiting link for task*/
|
||||
ptcb->eventID = INVALID_ID; /* Sign that not to use. */
|
||||
|
||||
if(ptcb->delayTick != INVALID_VALUE) /* Is task in delay list? */
|
||||
{
|
||||
RemoveDelayList(ptcb); /* Yes,remove task from DELAY list */
|
||||
}
|
||||
#if CFG_MAILBOX_EN >0
|
||||
if(pecb->eventType == EVENT_TYPE_MBOX)/* Is it a mailbox event? */
|
||||
{
|
||||
ptcb->pmail = pecb->eventPtr; /* Yes,send mail to task */
|
||||
pecb->eventPtr = Co_NULL; /* Clear event sign */
|
||||
//pecb->eventCounter--;
|
||||
}
|
||||
#endif
|
||||
#if CFG_QUEUE_EN >0
|
||||
else if(pecb->eventType == EVENT_TYPE_QUEUE) /* Is it a queue event? */
|
||||
{
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Yes,get queue pointer */
|
||||
ptcb->pmail = *(pqcb->qStart + pqcb->head); /* Send mail to task */
|
||||
//pqcb->head++; /* Clear event sign */
|
||||
//pqcb->qSize--;
|
||||
//if(pqcb->head == pqcb->qMaxSize)
|
||||
//{
|
||||
// pqcb->head = 0;
|
||||
//}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_SEM_EN >0
|
||||
else if(pecb->eventType == EVENT_TYPE_SEM)/* Is it a semaphore event? */
|
||||
{
|
||||
//pecb->eventCounter--; /* Yes,clear event sign */
|
||||
ptcb->pmail = (void*)0xffffffff; /* Indicate task woke by event */
|
||||
}
|
||||
#endif
|
||||
if(ptcb == TCBRunning)
|
||||
{
|
||||
ptcb->state = TASK_RUNNING;
|
||||
}
|
||||
else
|
||||
{
|
||||
InsertToTCBRdyList(ptcb); /* Insert task into ready list */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Move a task from event wait list to the ready list
|
||||
* @param[in] pecb Pointer to event control block corresponding to the event.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove a task from event wait list,and
|
||||
* then insert it to the ready list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RemoveEventWaittingList(P_OSTCB ptcb)
|
||||
{
|
||||
P_ECB pecb;
|
||||
pecb = &EventTbl[ptcb->eventID]; /* Get event control block */
|
||||
|
||||
/* Is there only one item in event waiting list? */
|
||||
if((ptcb->waitNext == Co_NULL) && (ptcb->waitPrev == Co_NULL))
|
||||
{
|
||||
pecb->eventTCBList = Co_NULL; /* Yes,set event waiting list as Co_NULL */
|
||||
}
|
||||
else if(ptcb->waitPrev == Co_NULL)/* Is the first item in event waiting list?*/
|
||||
{
|
||||
/* Yes,remove task from list,and reset event waiting list */
|
||||
ptcb->waitNext->waitPrev = Co_NULL;
|
||||
pecb->eventTCBList = ptcb->waitNext;
|
||||
ptcb->waitNext = Co_NULL;
|
||||
}
|
||||
else if(ptcb->waitNext == Co_NULL)/* Is the last item in event waiting list? */
|
||||
{
|
||||
ptcb->waitPrev->waitNext = Co_NULL; /* Yes,remove task form list */
|
||||
ptcb->waitPrev = Co_NULL;
|
||||
}
|
||||
else /* No, remove task from list */
|
||||
{
|
||||
ptcb->waitPrev->waitNext = ptcb->waitNext;
|
||||
ptcb->waitNext->waitPrev = ptcb->waitPrev;
|
||||
ptcb->waitPrev = Co_NULL;
|
||||
ptcb->waitNext = Co_NULL;
|
||||
}
|
||||
ptcb->eventID = INVALID_ID; /* Sign that not to use. */
|
||||
}
|
||||
|
||||
#endif //CFG_EVENT_EN
|
||||
|
||||
|
||||
+735
-712
File diff suppressed because it is too large
Load Diff
@@ -1,65 +1,88 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file hook.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief hook management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Inlcude --------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief IDLE task of OS
|
||||
* @param[in] pdata The parameter passed to IDLE task.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is system IDLE task code.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoIdleTask(void* pdata)
|
||||
{
|
||||
/* Add your codes here */
|
||||
for(; ;)
|
||||
{
|
||||
/* Add your codes here */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Hook for stack overflow
|
||||
* @param[in] taskID Piont to the task which lead to stack overflow.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is a hook for stack overflow.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoStkOverflowHook(OS_TID taskID)
|
||||
{
|
||||
/* Process stack overflow here */
|
||||
for(; ;)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file hook.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief hook management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Inlcude --------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief IDLE task of OS
|
||||
* @param[in] pdata The parameter passed to IDLE task.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is system IDLE task code.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoIdleTask(void* pdata)
|
||||
{
|
||||
/* Add your codes here */
|
||||
for(; ;)
|
||||
{
|
||||
/* Add your codes here */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Hook for stack overflow
|
||||
* @param[in] taskID Piont to the task which lead to stack overflow.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is a hook for stack overflow.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoStkOverflowHook(OS_TID taskID)
|
||||
{
|
||||
/* Process stack overflow here */
|
||||
for(; ;)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+432
-409
@@ -1,409 +1,432 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file kernelHeap.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief kernel heap management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_KHEAP_EN >0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
U32 KernelHeap[KHEAP_SIZE] = {0}; /*!< Kernel heap */
|
||||
P_FMB FMBlist = Co_NULL; /*!< Free memory block list */
|
||||
KHeap Kheap = {0}; /*!< Kernel heap control */
|
||||
|
||||
|
||||
/*---------------------------- Function Declare ------------------------------*/
|
||||
static P_FMB GetPreFMB(P_UMB usedMB);
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create kernel heap
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create kernel heap.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoCreateKheap(void)
|
||||
{
|
||||
Kheap.startAddr = (U32)(KernelHeap); /* Initialize kernel heap control */
|
||||
Kheap.endAddr = (U32)(KernelHeap) + KHEAP_SIZE*4;
|
||||
FMBlist = (P_FMB)KernelHeap; /* Initialize free memory block list*/
|
||||
FMBlist->nextFMB = Co_NULL;
|
||||
FMBlist->nextUMB = Co_NULL;
|
||||
FMBlist->preUMB = Co_NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Allocation size bytes of memory block from kernel heap.
|
||||
* @param[in] size Length of menory block.
|
||||
* @param[out] None
|
||||
* @retval Co_NULL Allocate fail.
|
||||
* @retval others Pointer to memory block.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to allocation size bytes of memory block.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoKmalloc(U32 size)
|
||||
{
|
||||
P_FMB freeMB,newFMB,preFMB;
|
||||
P_UMB usedMB,tmpUMB;
|
||||
U8* memAddr;
|
||||
U32 freeSize;
|
||||
U32 kheapAddr;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if( size == 0 )
|
||||
{
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Word alignment,and add used memory head size */
|
||||
size = (((size+3)>>2)<<2) + 8;
|
||||
kheapAddr = Kheap.endAddr; /* Get the end address of kernel heap */
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
freeMB = FMBlist; /* Get first item of free memory list */
|
||||
preFMB = Co_NULL;
|
||||
while(freeMB != Co_NULL ) /* Is out of free memory list? */
|
||||
{ /* No */
|
||||
if(freeMB->nextUMB == Co_NULL) /* Is last item of free memory list? */
|
||||
{ /* Yes,get size for this free item */
|
||||
freeSize = kheapAddr - (U32)(freeMB);
|
||||
}
|
||||
else /* No,get size for this free item */
|
||||
{
|
||||
freeSize = (U32)(freeMB->nextUMB) -1 - (U32)(freeMB);
|
||||
}
|
||||
if(freeSize >= size) /* If the size equal or greater than need */
|
||||
{ /* Yes,assign in this free memory */
|
||||
usedMB=(P_UMB)freeMB;/* Get the address for used memory block head*/
|
||||
|
||||
/* Get the address for used memory block */
|
||||
memAddr = (U8*)((U32)(usedMB) + 8);
|
||||
|
||||
/* Is left size of free memory smaller than 12? */
|
||||
if((freeSize-size) < 12)
|
||||
{
|
||||
/* Yes,malloc together(12 is the size of the header information
|
||||
of free memory block ). */
|
||||
if(preFMB != Co_NULL)/* Is first item of free memory block list? */
|
||||
{ /* No,set the link for list */
|
||||
preFMB->nextFMB = freeMB->nextFMB;
|
||||
}
|
||||
else /* Yes,reset the first item */
|
||||
{
|
||||
FMBlist = freeMB->nextFMB;
|
||||
}
|
||||
|
||||
if(freeMB->nextUMB != Co_NULL) /* Is last item? */
|
||||
{ /* No,set the link for list */
|
||||
tmpUMB = (P_UMB)((U32)(freeMB->nextUMB)-1);
|
||||
tmpUMB->preMB = (void*)((U32)usedMB|0x1);
|
||||
}
|
||||
|
||||
usedMB->nextMB = freeMB->nextUMB;/* Set used memory block link*/
|
||||
usedMB->preMB = freeMB->preUMB;
|
||||
}
|
||||
else /* No,the left size more than 12 */
|
||||
{
|
||||
/* Get new free memory block address */
|
||||
newFMB = (P_FMB)((U32)(freeMB) + size);
|
||||
|
||||
if(preFMB != Co_NULL)/* Is first item of free memory block list? */
|
||||
{
|
||||
preFMB->nextFMB = newFMB; /* No,set the link for list */
|
||||
}
|
||||
else
|
||||
{
|
||||
FMBlist = newFMB; /* Yes,reset the first item */
|
||||
}
|
||||
|
||||
/* Set link for new free memory block */
|
||||
newFMB->preUMB = (P_UMB)((U32)usedMB|0x1);
|
||||
newFMB->nextUMB = freeMB->nextUMB;
|
||||
newFMB->nextFMB = freeMB->nextFMB;
|
||||
|
||||
if(freeMB->nextUMB != Co_NULL) /* Is last item? */
|
||||
{ /* No,set the link for list */
|
||||
tmpUMB = (P_UMB)((U32)(freeMB->nextUMB)-1);
|
||||
tmpUMB->preMB = newFMB;
|
||||
}
|
||||
|
||||
usedMB->nextMB = newFMB; /* Set used memory block link */
|
||||
usedMB->preMB = freeMB->preUMB;
|
||||
}
|
||||
|
||||
if(freeMB->preUMB != Co_NULL) /* Is first item? */
|
||||
{ /* No,set the link for list */
|
||||
tmpUMB = (P_UMB)((U32)(freeMB->preUMB)-1);
|
||||
tmpUMB->nextMB = (void*)((U32)usedMB|0x1);
|
||||
}
|
||||
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return memAddr; /* Return used memory block address */
|
||||
}
|
||||
preFMB = freeMB; /* Save current free memory block as previous */
|
||||
freeMB = freeMB->nextFMB; /* Get the next item as current item*/
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return Co_NULL; /* Error return */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Release memory block to kernel heap.
|
||||
* @param[in] memBuf Pointer to memory block.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to release memory block.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoKfree(void* memBuf)
|
||||
{
|
||||
P_FMB curFMB,nextFMB,preFMB;
|
||||
P_UMB usedMB,nextUMB,preUMB;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(memBuf == Co_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
usedMB = (P_UMB)((U32)(memBuf)-8);
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if((U32)(memBuf) < Kheap.startAddr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if((U32)(memBuf) > Kheap.endAddr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check UMB in list */
|
||||
if((U32)(usedMB) < (U32)(FMBlist))
|
||||
{
|
||||
preUMB = (P_UMB)((U32)(FMBlist->preUMB)-1);
|
||||
while(preUMB != usedMB)
|
||||
{
|
||||
if(preUMB == Co_NULL)
|
||||
{
|
||||
OsSchedUnlock();
|
||||
return;
|
||||
}
|
||||
preUMB = (P_UMB)((U32)(preUMB->preMB)-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FMBlist == Co_NULL)
|
||||
{
|
||||
nextUMB = (P_UMB)(Kheap.startAddr);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FMBlist->nextUMB != Co_NULL)
|
||||
{
|
||||
nextUMB = (P_UMB)((U32)(FMBlist->nextUMB)-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
nextUMB = Co_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
while(nextUMB != usedMB)
|
||||
{
|
||||
if(nextUMB == Co_NULL)
|
||||
{
|
||||
OsSchedUnlock();
|
||||
return;
|
||||
}
|
||||
if(((U32)(nextUMB->nextMB)&0x1) == 0)
|
||||
{
|
||||
nextFMB = (P_FMB)(nextUMB->nextMB);
|
||||
nextUMB = (P_UMB)((U32)(nextFMB->nextUMB)-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
nextUMB = (P_UMB)((U32)(nextUMB->nextMB)-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Is between two free memory block? */
|
||||
if( (((U32)(usedMB->nextMB)&0x1) == 0) && (((U32)(usedMB->preMB)&0x1)==0) )
|
||||
{ /* Yes,is the only one item in kernel heap? */
|
||||
if((usedMB->nextMB == Co_NULL) && (usedMB->preMB == Co_NULL))
|
||||
{
|
||||
curFMB = (P_FMB)usedMB; /* Yes,release this item */
|
||||
curFMB->nextFMB = Co_NULL;
|
||||
curFMB->nextUMB = Co_NULL;
|
||||
curFMB->preUMB = Co_NULL;
|
||||
FMBlist = curFMB;
|
||||
}
|
||||
else if(usedMB->preMB == Co_NULL) /* Is the first item in kernel heap */
|
||||
{
|
||||
/* Yes,release this item,and set link for list */
|
||||
curFMB = (P_FMB)usedMB;
|
||||
nextFMB = (P_FMB)usedMB->nextMB;
|
||||
|
||||
curFMB->nextFMB = nextFMB->nextFMB;
|
||||
curFMB->nextUMB = nextFMB->nextUMB;
|
||||
curFMB->preUMB = Co_NULL;
|
||||
FMBlist = curFMB;
|
||||
}
|
||||
else if(usedMB->nextMB == Co_NULL) /* Is the last item in kernel heap */
|
||||
{ /* Yes,release this item,and set link for list */
|
||||
curFMB = (P_FMB)(usedMB->preMB);
|
||||
curFMB->nextFMB = Co_NULL;
|
||||
curFMB->nextUMB = Co_NULL;
|
||||
}
|
||||
else /* All no,show this item between two normal FMB */
|
||||
{
|
||||
/* release this item,and set link for list */
|
||||
nextFMB = (P_FMB)usedMB->nextMB;
|
||||
curFMB = (P_FMB)(usedMB->preMB);
|
||||
|
||||
curFMB->nextFMB = nextFMB->nextFMB;
|
||||
curFMB->nextUMB = nextFMB->nextUMB;
|
||||
}
|
||||
}
|
||||
else if(((U32)(usedMB->preMB)&0x1) == 0) /* Is between FMB and UMB? */
|
||||
{
|
||||
if(usedMB->preMB == Co_NULL) /* Yes,is the first item in kernel heap? */
|
||||
{
|
||||
/* Yes,release this item,and set link for list */
|
||||
curFMB = (P_FMB)usedMB;
|
||||
nextUMB = (P_UMB)usedMB->nextMB;
|
||||
curFMB->nextUMB = nextUMB;
|
||||
curFMB->preUMB = Co_NULL;
|
||||
curFMB->nextFMB = FMBlist;
|
||||
FMBlist = curFMB;
|
||||
}
|
||||
else /* No,release this item,and set link for list */
|
||||
{
|
||||
curFMB = (P_FMB)usedMB->preMB;
|
||||
nextUMB = (P_UMB)usedMB->nextMB;
|
||||
curFMB->nextUMB = nextUMB;
|
||||
}
|
||||
|
||||
}
|
||||
else if(((U32)(usedMB->nextMB)&0x1) == 0) /* Is between UMB and FMB? */
|
||||
{ /* Yes */
|
||||
preUMB = (P_UMB)(usedMB->preMB); /* Get previous UMB */
|
||||
curFMB = (P_FMB)(usedMB); /* new FMB */
|
||||
preFMB = GetPreFMB(usedMB); /* Get previous FMB */
|
||||
if(preFMB == Co_NULL) /* Is previous FMB==Co_NULL? */
|
||||
{
|
||||
nextFMB = FMBlist; /* Yes,get next FMB */
|
||||
FMBlist = curFMB; /* Reset new FMB as the first item of FMB list*/
|
||||
}
|
||||
else
|
||||
{
|
||||
nextFMB = preFMB->nextFMB; /* No,get next FMB */
|
||||
preFMB->nextFMB = curFMB; /* Set link for FMB list */
|
||||
}
|
||||
|
||||
if(nextFMB == Co_NULL) /* Is new FMB as last item of FMB list? */
|
||||
{
|
||||
curFMB->preUMB = preUMB; /* Yes,set link for list */
|
||||
curFMB->nextUMB = Co_NULL;
|
||||
curFMB->nextFMB = Co_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
curFMB->preUMB = preUMB; /* No,set link for list */
|
||||
curFMB->nextUMB = nextFMB->nextUMB;
|
||||
curFMB->nextFMB = nextFMB->nextFMB;
|
||||
}
|
||||
}
|
||||
else /* All no,show UMB between two UMB*/
|
||||
{
|
||||
curFMB = (P_FMB)(usedMB); /* new FMB */
|
||||
preFMB = GetPreFMB(usedMB); /* Get previous FMB */
|
||||
preUMB = (P_UMB)(usedMB->preMB); /* Get previous UMB */
|
||||
nextUMB = (P_UMB)(usedMB->nextMB); /* Get next UMB */
|
||||
|
||||
if(preFMB == Co_NULL ) /* Is previous FMB==Co_NULL? */
|
||||
{
|
||||
nextFMB = FMBlist; /* Yes,get next FMB */
|
||||
FMBlist = curFMB; /* Reset new FMB as the first item of FMB list */
|
||||
}
|
||||
else
|
||||
{
|
||||
nextFMB = preFMB->nextFMB; /* No,get next FMB */
|
||||
preFMB->nextFMB = curFMB; /* Set link for FMB list */
|
||||
}
|
||||
|
||||
curFMB->preUMB = preUMB; /* Set current FMB link for list */
|
||||
curFMB->nextUMB = nextUMB;
|
||||
curFMB->nextFMB = nextFMB;
|
||||
}
|
||||
|
||||
if(curFMB->preUMB != Co_NULL)/* Is current FMB as first item in kernel heap? */
|
||||
{ /* No,set link for list */
|
||||
preUMB = (P_UMB)((U32)(curFMB->preUMB)-1);
|
||||
preUMB->nextMB = (void*)curFMB;
|
||||
}
|
||||
if(curFMB->nextUMB != Co_NULL)/* Is current FMB as last item in kernel heap? */
|
||||
{ /* No,set link for list */
|
||||
nextUMB = (P_UMB)((U32)(curFMB->nextUMB)-1);
|
||||
nextUMB->preMB = (void*)curFMB;
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get previous free memory block pointer.
|
||||
* @param[in] usedMB Current used memory block.
|
||||
* @param[out] None
|
||||
* @retval Previous free memory block pointer.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to get previous free memory block pointer.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static P_FMB GetPreFMB(P_UMB usedMB)
|
||||
{
|
||||
P_UMB preUMB;
|
||||
preUMB = usedMB;
|
||||
while(((U32)(preUMB->preMB)&0x1)) /* Is previous MB as FMB? */
|
||||
{ /* No,get previous MB */
|
||||
preUMB = (P_UMB)((U32)(preUMB->preMB)-1);
|
||||
}
|
||||
return (P_FMB)(preUMB->preMB); /* Yes,return previous MB */
|
||||
}
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file kernelHeap.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief kernel heap management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_KHEAP_EN >0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
U32 KernelHeap[KHEAP_SIZE] = {0}; /*!< Kernel heap */
|
||||
P_FMB FMBlist = Co_NULL; /*!< Free memory block list */
|
||||
KHeap Kheap = {0}; /*!< Kernel heap control */
|
||||
|
||||
|
||||
/*---------------------------- Function Declare ------------------------------*/
|
||||
static P_FMB GetPreFMB(P_UMB usedMB);
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create kernel heap
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create kernel heap.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoCreateKheap(void)
|
||||
{
|
||||
Kheap.startAddr = (U32)(KernelHeap); /* Initialize kernel heap control */
|
||||
Kheap.endAddr = (U32)(KernelHeap) + KHEAP_SIZE*4;
|
||||
FMBlist = (P_FMB)KernelHeap; /* Initialize free memory block list*/
|
||||
FMBlist->nextFMB = Co_NULL;
|
||||
FMBlist->nextUMB = Co_NULL;
|
||||
FMBlist->preUMB = Co_NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Allocation size bytes of memory block from kernel heap.
|
||||
* @param[in] size Length of menory block.
|
||||
* @param[out] None
|
||||
* @retval Co_NULL Allocate fail.
|
||||
* @retval others Pointer to memory block.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to allocation size bytes of memory block.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoKmalloc(U32 size)
|
||||
{
|
||||
P_FMB freeMB,newFMB,preFMB;
|
||||
P_UMB usedMB,tmpUMB;
|
||||
U8* memAddr;
|
||||
U32 freeSize;
|
||||
U32 kheapAddr;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if( size == 0 )
|
||||
{
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Word alignment,and add used memory head size */
|
||||
size = (((size+3)>>2)<<2) + 8;
|
||||
kheapAddr = Kheap.endAddr; /* Get the end address of kernel heap */
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
freeMB = FMBlist; /* Get first item of free memory list */
|
||||
preFMB = Co_NULL;
|
||||
while(freeMB != Co_NULL ) /* Is out of free memory list? */
|
||||
{ /* No */
|
||||
if(freeMB->nextUMB == Co_NULL) /* Is last item of free memory list? */
|
||||
{ /* Yes,get size for this free item */
|
||||
freeSize = kheapAddr - (U32)(freeMB);
|
||||
}
|
||||
else /* No,get size for this free item */
|
||||
{
|
||||
freeSize = (U32)(freeMB->nextUMB) -1 - (U32)(freeMB);
|
||||
}
|
||||
if(freeSize >= size) /* If the size equal or greater than need */
|
||||
{ /* Yes,assign in this free memory */
|
||||
usedMB=(P_UMB)freeMB;/* Get the address for used memory block head*/
|
||||
|
||||
/* Get the address for used memory block */
|
||||
memAddr = (U8*)((U32)(usedMB) + 8);
|
||||
|
||||
/* Is left size of free memory smaller than 12? */
|
||||
if((freeSize-size) < 12)
|
||||
{
|
||||
/* Yes,malloc together(12 is the size of the header information
|
||||
of free memory block ). */
|
||||
if(preFMB != Co_NULL)/* Is first item of free memory block list? */
|
||||
{ /* No,set the link for list */
|
||||
preFMB->nextFMB = freeMB->nextFMB;
|
||||
}
|
||||
else /* Yes,reset the first item */
|
||||
{
|
||||
FMBlist = freeMB->nextFMB;
|
||||
}
|
||||
|
||||
if(freeMB->nextUMB != Co_NULL) /* Is last item? */
|
||||
{ /* No,set the link for list */
|
||||
tmpUMB = (P_UMB)((U32)(freeMB->nextUMB)-1);
|
||||
tmpUMB->preMB = (void*)((U32)usedMB|0x1);
|
||||
}
|
||||
|
||||
usedMB->nextMB = freeMB->nextUMB;/* Set used memory block link*/
|
||||
usedMB->preMB = freeMB->preUMB;
|
||||
}
|
||||
else /* No,the left size more than 12 */
|
||||
{
|
||||
/* Get new free memory block address */
|
||||
newFMB = (P_FMB)((U32)(freeMB) + size);
|
||||
|
||||
if(preFMB != Co_NULL)/* Is first item of free memory block list? */
|
||||
{
|
||||
preFMB->nextFMB = newFMB; /* No,set the link for list */
|
||||
}
|
||||
else
|
||||
{
|
||||
FMBlist = newFMB; /* Yes,reset the first item */
|
||||
}
|
||||
|
||||
/* Set link for new free memory block */
|
||||
newFMB->preUMB = (P_UMB)((U32)usedMB|0x1);
|
||||
newFMB->nextUMB = freeMB->nextUMB;
|
||||
newFMB->nextFMB = freeMB->nextFMB;
|
||||
|
||||
if(freeMB->nextUMB != Co_NULL) /* Is last item? */
|
||||
{ /* No,set the link for list */
|
||||
tmpUMB = (P_UMB)((U32)(freeMB->nextUMB)-1);
|
||||
tmpUMB->preMB = newFMB;
|
||||
}
|
||||
|
||||
usedMB->nextMB = newFMB; /* Set used memory block link */
|
||||
usedMB->preMB = freeMB->preUMB;
|
||||
}
|
||||
|
||||
if(freeMB->preUMB != Co_NULL) /* Is first item? */
|
||||
{ /* No,set the link for list */
|
||||
tmpUMB = (P_UMB)((U32)(freeMB->preUMB)-1);
|
||||
tmpUMB->nextMB = (void*)((U32)usedMB|0x1);
|
||||
}
|
||||
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return memAddr; /* Return used memory block address */
|
||||
}
|
||||
preFMB = freeMB; /* Save current free memory block as previous */
|
||||
freeMB = freeMB->nextFMB; /* Get the next item as current item*/
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return Co_NULL; /* Error return */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Release memory block to kernel heap.
|
||||
* @param[in] memBuf Pointer to memory block.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to release memory block.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void CoKfree(void* memBuf)
|
||||
{
|
||||
P_FMB curFMB,nextFMB,preFMB;
|
||||
P_UMB usedMB,nextUMB,preUMB;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(memBuf == Co_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
usedMB = (P_UMB)((U32)(memBuf)-8);
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if((U32)(memBuf) < Kheap.startAddr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if((U32)(memBuf) > Kheap.endAddr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check UMB in list */
|
||||
if((U32)(usedMB) < (U32)(FMBlist))
|
||||
{
|
||||
preUMB = (P_UMB)((U32)(FMBlist->preUMB)-1);
|
||||
while(preUMB != usedMB)
|
||||
{
|
||||
if(preUMB == Co_NULL)
|
||||
{
|
||||
OsSchedUnlock();
|
||||
return;
|
||||
}
|
||||
preUMB = (P_UMB)((U32)(preUMB->preMB)-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FMBlist == Co_NULL)
|
||||
{
|
||||
nextUMB = (P_UMB)(Kheap.startAddr);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FMBlist->nextUMB != Co_NULL)
|
||||
{
|
||||
nextUMB = (P_UMB)((U32)(FMBlist->nextUMB)-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
nextUMB = Co_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
while(nextUMB != usedMB)
|
||||
{
|
||||
if(nextUMB == Co_NULL)
|
||||
{
|
||||
OsSchedUnlock();
|
||||
return;
|
||||
}
|
||||
if(((U32)(nextUMB->nextMB)&0x1) == 0)
|
||||
{
|
||||
nextFMB = (P_FMB)(nextUMB->nextMB);
|
||||
nextUMB = (P_UMB)((U32)(nextFMB->nextUMB)-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
nextUMB = (P_UMB)((U32)(nextUMB->nextMB)-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Is between two free memory block? */
|
||||
if( (((U32)(usedMB->nextMB)&0x1) == 0) && (((U32)(usedMB->preMB)&0x1)==0) )
|
||||
{ /* Yes,is the only one item in kernel heap? */
|
||||
if((usedMB->nextMB == Co_NULL) && (usedMB->preMB == Co_NULL))
|
||||
{
|
||||
curFMB = (P_FMB)usedMB; /* Yes,release this item */
|
||||
curFMB->nextFMB = Co_NULL;
|
||||
curFMB->nextUMB = Co_NULL;
|
||||
curFMB->preUMB = Co_NULL;
|
||||
FMBlist = curFMB;
|
||||
}
|
||||
else if(usedMB->preMB == Co_NULL) /* Is the first item in kernel heap */
|
||||
{
|
||||
/* Yes,release this item,and set link for list */
|
||||
curFMB = (P_FMB)usedMB;
|
||||
nextFMB = (P_FMB)usedMB->nextMB;
|
||||
|
||||
curFMB->nextFMB = nextFMB->nextFMB;
|
||||
curFMB->nextUMB = nextFMB->nextUMB;
|
||||
curFMB->preUMB = Co_NULL;
|
||||
FMBlist = curFMB;
|
||||
}
|
||||
else if(usedMB->nextMB == Co_NULL) /* Is the last item in kernel heap */
|
||||
{ /* Yes,release this item,and set link for list */
|
||||
curFMB = (P_FMB)(usedMB->preMB);
|
||||
curFMB->nextFMB = Co_NULL;
|
||||
curFMB->nextUMB = Co_NULL;
|
||||
}
|
||||
else /* All no,show this item between two normal FMB */
|
||||
{
|
||||
/* release this item,and set link for list */
|
||||
nextFMB = (P_FMB)usedMB->nextMB;
|
||||
curFMB = (P_FMB)(usedMB->preMB);
|
||||
|
||||
curFMB->nextFMB = nextFMB->nextFMB;
|
||||
curFMB->nextUMB = nextFMB->nextUMB;
|
||||
}
|
||||
}
|
||||
else if(((U32)(usedMB->preMB)&0x1) == 0) /* Is between FMB and UMB? */
|
||||
{
|
||||
if(usedMB->preMB == Co_NULL) /* Yes,is the first item in kernel heap? */
|
||||
{
|
||||
/* Yes,release this item,and set link for list */
|
||||
curFMB = (P_FMB)usedMB;
|
||||
nextUMB = (P_UMB)usedMB->nextMB;
|
||||
curFMB->nextUMB = nextUMB;
|
||||
curFMB->preUMB = Co_NULL;
|
||||
curFMB->nextFMB = FMBlist;
|
||||
FMBlist = curFMB;
|
||||
}
|
||||
else /* No,release this item,and set link for list */
|
||||
{
|
||||
curFMB = (P_FMB)usedMB->preMB;
|
||||
nextUMB = (P_UMB)usedMB->nextMB;
|
||||
curFMB->nextUMB = nextUMB;
|
||||
}
|
||||
|
||||
}
|
||||
else if(((U32)(usedMB->nextMB)&0x1) == 0) /* Is between UMB and FMB? */
|
||||
{ /* Yes */
|
||||
preUMB = (P_UMB)(usedMB->preMB); /* Get previous UMB */
|
||||
curFMB = (P_FMB)(usedMB); /* new FMB */
|
||||
preFMB = GetPreFMB(usedMB); /* Get previous FMB */
|
||||
if(preFMB == Co_NULL) /* Is previous FMB==Co_NULL? */
|
||||
{
|
||||
nextFMB = FMBlist; /* Yes,get next FMB */
|
||||
FMBlist = curFMB; /* Reset new FMB as the first item of FMB list*/
|
||||
}
|
||||
else
|
||||
{
|
||||
nextFMB = preFMB->nextFMB; /* No,get next FMB */
|
||||
preFMB->nextFMB = curFMB; /* Set link for FMB list */
|
||||
}
|
||||
|
||||
if(nextFMB == Co_NULL) /* Is new FMB as last item of FMB list? */
|
||||
{
|
||||
curFMB->preUMB = preUMB; /* Yes,set link for list */
|
||||
curFMB->nextUMB = Co_NULL;
|
||||
curFMB->nextFMB = Co_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
curFMB->preUMB = preUMB; /* No,set link for list */
|
||||
curFMB->nextUMB = nextFMB->nextUMB;
|
||||
curFMB->nextFMB = nextFMB->nextFMB;
|
||||
}
|
||||
}
|
||||
else /* All no,show UMB between two UMB*/
|
||||
{
|
||||
curFMB = (P_FMB)(usedMB); /* new FMB */
|
||||
preFMB = GetPreFMB(usedMB); /* Get previous FMB */
|
||||
preUMB = (P_UMB)(usedMB->preMB); /* Get previous UMB */
|
||||
nextUMB = (P_UMB)(usedMB->nextMB); /* Get next UMB */
|
||||
|
||||
if(preFMB == Co_NULL ) /* Is previous FMB==Co_NULL? */
|
||||
{
|
||||
nextFMB = FMBlist; /* Yes,get next FMB */
|
||||
FMBlist = curFMB; /* Reset new FMB as the first item of FMB list */
|
||||
}
|
||||
else
|
||||
{
|
||||
nextFMB = preFMB->nextFMB; /* No,get next FMB */
|
||||
preFMB->nextFMB = curFMB; /* Set link for FMB list */
|
||||
}
|
||||
|
||||
curFMB->preUMB = preUMB; /* Set current FMB link for list */
|
||||
curFMB->nextUMB = nextUMB;
|
||||
curFMB->nextFMB = nextFMB;
|
||||
}
|
||||
|
||||
if(curFMB->preUMB != Co_NULL)/* Is current FMB as first item in kernel heap? */
|
||||
{ /* No,set link for list */
|
||||
preUMB = (P_UMB)((U32)(curFMB->preUMB)-1);
|
||||
preUMB->nextMB = (void*)curFMB;
|
||||
}
|
||||
if(curFMB->nextUMB != Co_NULL)/* Is current FMB as last item in kernel heap? */
|
||||
{ /* No,set link for list */
|
||||
nextUMB = (P_UMB)((U32)(curFMB->nextUMB)-1);
|
||||
nextUMB->preMB = (void*)curFMB;
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get previous free memory block pointer.
|
||||
* @param[in] usedMB Current used memory block.
|
||||
* @param[out] None
|
||||
* @retval Previous free memory block pointer.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to get previous free memory block pointer.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static P_FMB GetPreFMB(P_UMB usedMB)
|
||||
{
|
||||
P_UMB preUMB;
|
||||
preUMB = usedMB;
|
||||
while(((U32)(preUMB->preMB)&0x1)) /* Is previous MB as FMB? */
|
||||
{ /* No,get previous MB */
|
||||
preUMB = (P_UMB)((U32)(preUMB->preMB)-1);
|
||||
}
|
||||
return (P_FMB)(preUMB->preMB); /* Yes,return previous MB */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
+356
-325
@@ -1,325 +1,356 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file mbox.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Mailbox management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_MAILBOX_EN > 0
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a mailbox
|
||||
* @param[in] sortType Mail box waiting list sort type.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create mailbox fail.
|
||||
* @retval others Create mailbox successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_EventID CoCreateMbox(U8 sortType)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
/* Create a mailbox type event control block */
|
||||
pecb = CreatEvent(EVENT_TYPE_MBOX,sortType,Co_NULL);
|
||||
if(pecb == Co_NULL) /* If failed to create event block */
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
pecb->eventCounter = 0;
|
||||
return (pecb->id); /* Create a mailbox successfully, return event ID */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] opt Delete option.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter.
|
||||
* @retval E_TASK_WAITTING Tasks waitting for the event,delete fail.
|
||||
* @retval E_OK Event deleted successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelMbox(OS_EventID id,U8 opt)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT) /* Judge id is valid or not? */
|
||||
{
|
||||
return E_INVALID_ID; /* Id is invalid ,return error */
|
||||
}
|
||||
#endif
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)/* Validate event control block type*/
|
||||
{
|
||||
return E_INVALID_ID; /* The event is not mailbox */
|
||||
}
|
||||
#endif
|
||||
return (DeleteEvent(pecb,opt)); /* Delete the mailbox event control block */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Accept a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mailbox accepted.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to accept a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoAcceptMail(OS_EventID id,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
void* pmail;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid 'id' */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
pecb = &EventTbl[id];
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)/* Invalid event control block type */
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock();
|
||||
if(pecb->eventCounter == 1) /* If there is already a message */
|
||||
{
|
||||
*perr = E_OK;
|
||||
pmail = pecb->eventPtr; /* Get the message */
|
||||
pecb->eventPtr = Co_NULL; /* Clear the mailbox */
|
||||
pecb->eventCounter = 0;
|
||||
OsSchedUnlock();
|
||||
return pmail; /* Return the message received */
|
||||
}
|
||||
else /* If the mailbox is empty */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
*perr = E_MBOX_EMPTY; /* Mailbox is empty,return Co_NULL */
|
||||
return Co_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Wait for a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] timeout The longest time for writting mail.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mailbox accept.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to wait a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoPendMail(OS_EventID id,U32 timeout,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
void* pmail;
|
||||
P_OSTCB curTCB;
|
||||
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
*perr = E_CALL;
|
||||
return Co_NULL;
|
||||
}
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid 'id',retrun error */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid event type,not EVENT_TYPE_MBOX */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(OSSchedLock != 0) /* Judge schedule is locked or not? */
|
||||
{
|
||||
*perr = E_OS_IN_LOCK; /* Schedule is locked */
|
||||
return Co_NULL; /* return Co_NULL */
|
||||
}
|
||||
OsSchedLock();
|
||||
if( pecb->eventCounter == 1) /* If there is already a message */
|
||||
{
|
||||
*perr = E_OK;
|
||||
pmail = pecb->eventPtr; /* Get the message */
|
||||
pecb->eventPtr = Co_NULL; /* Clear the mailbox */
|
||||
pecb->eventCounter = 0;
|
||||
OsSchedUnlock();
|
||||
return pmail; /* Return the message received */
|
||||
}
|
||||
else /* If message is not available, task will pend */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
curTCB = TCBRunning;
|
||||
if(timeout == 0) /* If time-out is not configured */
|
||||
{
|
||||
EventTaskToWait(pecb,curTCB); /* Block task until event occurs */
|
||||
*perr = E_OK;
|
||||
|
||||
/* Have recived a message or the mailbox have been deleted */
|
||||
pmail = curTCB->pmail;
|
||||
curTCB->pmail = Co_NULL;
|
||||
return pmail; /* Return received message or Co_NULL */
|
||||
}
|
||||
else /* If time-out is configured */
|
||||
{
|
||||
OsSchedLock();
|
||||
|
||||
/* Block task until event or timeout occurs */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
InsertDelayList(curTCB,timeout);
|
||||
OsSchedUnlock();
|
||||
if( curTCB->pmail == Co_NULL) /* Time-out occurred */
|
||||
{
|
||||
*perr = E_TIMEOUT;
|
||||
return Co_NULL;
|
||||
}
|
||||
else /* Have recived a message or the mailbox have been deleted*/
|
||||
{
|
||||
*perr = E_OK;
|
||||
pmail = curTCB->pmail;
|
||||
curTCB->pmail = Co_NULL;
|
||||
return pmail; /* Return received message or Co_NULL */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_OK
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a mail.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPostMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID; /* Invalid id,return error */
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)/* Validate event control block type*/
|
||||
{
|
||||
return E_INVALID_ID; /* Event is not mailbox,return error*/
|
||||
}
|
||||
#endif
|
||||
|
||||
if(pecb->eventCounter == 0) /* If mailbox doesn't already have a message*/
|
||||
{
|
||||
OsSchedLock();
|
||||
pecb->eventPtr = pmail; /* Place message in mailbox */
|
||||
pecb->eventCounter = 1;
|
||||
EventTaskToRdy(pecb); /* Check waiting list */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
else /* If there is already a message in mailbox */
|
||||
{
|
||||
return E_MBOX_FULL; /* Mailbox is full,and return "E_MBOX_FULL" */
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mailbox in ISR
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_OK
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a mail in ISR.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
StatusType isr_PostMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
if(OSSchedLock > 0) /* If scheduler is locked,(the caller is ISR) */
|
||||
{
|
||||
/* Insert the request into service request queue */
|
||||
if(InsertInSRQ(MBOX_REQ,id,pmail) == Co_FALSE)
|
||||
{
|
||||
return E_SEV_REQ_FULL; /* If service request queue is full */
|
||||
}
|
||||
else /* Operate successfully */
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return(CoPostMail(id,pmail)); /* Sends the message to the mailbox */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file mbox.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Mailbox management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_MAILBOX_EN > 0
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a mailbox
|
||||
* @param[in] sortType Mail box waiting list sort type.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create mailbox fail.
|
||||
* @retval others Create mailbox successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_EventID CoCreateMbox(U8 sortType)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
/* Create a mailbox type event control block */
|
||||
pecb = CreatEvent(EVENT_TYPE_MBOX,sortType,Co_NULL);
|
||||
if(pecb == Co_NULL) /* If failed to create event block */
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
pecb->eventCounter = 0;
|
||||
return (pecb->id); /* Create a mailbox successfully, return event ID */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] opt Delete option.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter.
|
||||
* @retval E_TASK_WAITTING Tasks waitting for the event,delete fail.
|
||||
* @retval E_OK Event deleted successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelMbox(OS_EventID id,U8 opt)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT) /* Judge id is valid or not? */
|
||||
{
|
||||
return E_INVALID_ID; /* Id is invalid ,return error */
|
||||
}
|
||||
#endif
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)/* Validate event control block type*/
|
||||
{
|
||||
return E_INVALID_ID; /* The event is not mailbox */
|
||||
}
|
||||
#endif
|
||||
return (DeleteEvent(pecb,opt)); /* Delete the mailbox event control block */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Accept a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mailbox accepted.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to accept a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoAcceptMail(OS_EventID id,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
void* pmail;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid 'id' */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
pecb = &EventTbl[id];
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)/* Invalid event control block type */
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock();
|
||||
if(pecb->eventCounter == 1) /* If there is already a message */
|
||||
{
|
||||
*perr = E_OK;
|
||||
pmail = pecb->eventPtr; /* Get the message */
|
||||
pecb->eventPtr = Co_NULL; /* Clear the mailbox */
|
||||
pecb->eventCounter = 0;
|
||||
OsSchedUnlock();
|
||||
return pmail; /* Return the message received */
|
||||
}
|
||||
else /* If the mailbox is empty */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
*perr = E_MBOX_EMPTY; /* Mailbox is empty,return Co_NULL */
|
||||
return Co_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Wait for a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] timeout The longest time for writting mail.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mailbox accept.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to wait a mailbox.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoPendMail(OS_EventID id,U32 timeout,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
void* pmail;
|
||||
P_OSTCB curTCB;
|
||||
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
*perr = E_CALL;
|
||||
return Co_NULL;
|
||||
}
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid 'id',retrun error */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid event type,not EVENT_TYPE_MBOX */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(OSSchedLock != 0) /* Judge schedule is locked or not? */
|
||||
{
|
||||
*perr = E_OS_IN_LOCK; /* Schedule is locked */
|
||||
return Co_NULL; /* return Co_NULL */
|
||||
}
|
||||
OsSchedLock();
|
||||
if( pecb->eventCounter == 1) /* If there is already a message */
|
||||
{
|
||||
*perr = E_OK;
|
||||
pmail = pecb->eventPtr; /* Get the message */
|
||||
pecb->eventPtr = Co_NULL; /* Clear the mailbox */
|
||||
pecb->eventCounter = 0;
|
||||
OsSchedUnlock();
|
||||
return pmail; /* Return the message received */
|
||||
}
|
||||
else /* If message is not available, task will pend */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
curTCB = TCBRunning;
|
||||
if(timeout == 0) /* If time-out is not configured */
|
||||
{
|
||||
EventTaskToWait(pecb,curTCB); /* Block task until event occurs */
|
||||
*perr = E_OK;
|
||||
|
||||
/* Have recived a message or the mailbox have been deleted */
|
||||
OsSchedLock();
|
||||
pmail = curTCB->pmail;
|
||||
pecb->eventCounter = 0;
|
||||
curTCB->pmail = Co_NULL;
|
||||
OsSchedUnlock();
|
||||
return pmail; /* Return received message or Co_NULL */
|
||||
}
|
||||
else /* If time-out is configured */
|
||||
{
|
||||
OsSchedLock();
|
||||
|
||||
/* Block task until event or timeout occurs */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
InsertDelayList(curTCB,timeout);
|
||||
OsSchedUnlock();
|
||||
if( curTCB->pmail == Co_NULL) /* Time-out occurred */
|
||||
{
|
||||
*perr = E_TIMEOUT;
|
||||
return Co_NULL;
|
||||
}
|
||||
else /* Have recived a message or the mailbox have been deleted*/
|
||||
{
|
||||
*perr = E_OK;
|
||||
|
||||
OsSchedLock();
|
||||
pmail = curTCB->pmail;
|
||||
pecb->eventCounter = 0;
|
||||
curTCB->pmail = Co_NULL;
|
||||
OsSchedUnlock();
|
||||
|
||||
return pmail; /* Return received message or Co_NULL */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mailbox
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_OK
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a mail.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPostMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID; /* Invalid id,return error */
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_MBOX)/* Validate event control block type*/
|
||||
{
|
||||
return E_INVALID_ID; /* Event is not mailbox,return error*/
|
||||
}
|
||||
#endif
|
||||
|
||||
if(pecb->eventCounter == 0) /* If mailbox doesn't already have a message*/
|
||||
{
|
||||
OsSchedLock();
|
||||
pecb->eventPtr = pmail; /* Place message in mailbox */
|
||||
pecb->eventCounter = 1;
|
||||
EventTaskToRdy(pecb); /* Check waiting list */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
else /* If there is already a message in mailbox */
|
||||
{
|
||||
return E_MBOX_FULL; /* Mailbox is full,and return "E_MBOX_FULL" */
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mailbox in ISR
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_OK
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a mail in ISR.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
StatusType isr_PostMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
if(OSSchedLock > 0) /* If scheduler is locked,(the caller is ISR) */
|
||||
{
|
||||
/* Insert the request into service request queue */
|
||||
if(InsertInSRQ(MBOX_REQ,id,pmail) == Co_FALSE)
|
||||
{
|
||||
return E_SEV_REQ_FULL; /* If service request queue is full */
|
||||
}
|
||||
else /* Operate successfully */
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return(CoPostMail(id,pmail)); /* Sends the message to the mailbox */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+298
-275
@@ -1,275 +1,298 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file mm.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief memory management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_MM_EN > 0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
MM MemoryTbl[CFG_MAX_MM] = {{0}};/*!< Table which save memory control block. */
|
||||
U32 MemoryIDVessel = 0; /*!< Memory ID container. */
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a memory partition
|
||||
* @param[in] memBuf Specify memory partition head address.
|
||||
* @param[in] blockSize Specify memory block size.
|
||||
* @param[in] blockNum Specify memory block number.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create memory partition fail.
|
||||
* @retval others Create memory partition successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_MMID CoCreateMemPartition(U8* memBuf,U32 blockSize,U32 blockNum)
|
||||
{
|
||||
U8 i,j;
|
||||
U8 *memory;
|
||||
P_MemBlk memBlk;
|
||||
memory = memBuf;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(memBuf == Co_NULL)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if(blockSize == 0)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if((blockSize&0x3) != 0)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if(blockNum<=1)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
for(i = 0; i < CFG_MAX_MM; i++)
|
||||
{
|
||||
if((MemoryIDVessel & (1 << i)) == 0) /* Is free memory ID? */
|
||||
{
|
||||
MemoryIDVessel |= (1<<i); /* Yes,assign ID to this memory block */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
MemoryTbl[i].memAddr = memory;/* Initialize memory control block*/
|
||||
MemoryTbl[i].freeBlock = memory;
|
||||
MemoryTbl[i].blockSize = blockSize;
|
||||
MemoryTbl[i].blockNum = blockNum;
|
||||
memBlk = (P_MemBlk)memory; /* Bulid list in this memory block*/
|
||||
for(j=0;j<blockNum-1;j++)
|
||||
{
|
||||
memory = memory+blockSize;
|
||||
memBlk->nextBlock = (P_MemBlk)memory;
|
||||
memBlk = memBlk->nextBlock;
|
||||
}
|
||||
memBlk->nextBlock = Co_NULL;
|
||||
return i; /* Return memory block ID */
|
||||
}
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return E_CREATE_FAIL; /* Error return */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a memory partition
|
||||
* @param[in] mmID Specify memory partition that want to delete.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The memory partition id passed was invalid,delete fail.
|
||||
* @retval E_OK Delete successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Delete a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelMemoryPartition(OS_MMID mmID)
|
||||
{
|
||||
P_MM memCtl;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
memCtl = &MemoryTbl[mmID]; /* Release memory control block */
|
||||
MemoryIDVessel &= ~(1<<mmID);
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
|
||||
memCtl->memAddr = Co_NULL;
|
||||
memCtl->freeBlock = Co_NULL;
|
||||
memCtl->blockSize = 0;
|
||||
memCtl->blockNum = 0;
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get free block number in a memory partition
|
||||
* @param[in] mmID Specify memory partition.
|
||||
*
|
||||
* @param[out] E_INVALID_ID Invalid ID was passed and get counter failure.
|
||||
* @param[out] E_OK Get current counter successful.
|
||||
* @retval fbNum The number of free block.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to get free block number in a memory
|
||||
* partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
U32 CoGetFreeBlockNum(OS_MMID mmID,StatusType* perr)
|
||||
{
|
||||
U32 fbNum;
|
||||
P_MM memCtl;
|
||||
P_MemBlk memBlk;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return 0;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid memory id,return 0 */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
memCtl = &MemoryTbl[mmID];
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
memBlk = (P_MemBlk)(memCtl->freeBlock);/* Get the free item in memory list*/
|
||||
fbNum = 0;
|
||||
while(memBlk != Co_NULL) /* Get counter of free item */
|
||||
{
|
||||
fbNum++;
|
||||
memBlk = memBlk->nextBlock; /* Get next free iterm */
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedul */
|
||||
*perr = E_OK;
|
||||
return fbNum; /* Return the counter of free item */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get a memory buffer from memory partition
|
||||
* @param[in] mmID Specify memory partition that want to assign buffer.
|
||||
* @param[out] None
|
||||
* @retval Co_NULL Assign buffer fail.
|
||||
* @retval others Assign buffer successful,and return the buffer pointer.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Delete a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoGetMemoryBuffer(OS_MMID mmID)
|
||||
{
|
||||
P_MM memCtl;
|
||||
P_MemBlk memBlk;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
return Co_NULL;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
memCtl = &MemoryTbl[mmID];
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
if(memCtl->freeBlock == Co_NULL ) /* Is there no free item in memory list */
|
||||
{
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return Co_NULL; /* Yes,error return */
|
||||
}
|
||||
memBlk = (P_MemBlk)memCtl->freeBlock; /* Get free memory block */
|
||||
memCtl->freeBlock = (U8*)memBlk->nextBlock; /* Reset the first free item */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return memBlk; /* Return free memory block address */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Free a memory buffer to memory partition
|
||||
* @param[in] mmID Specify memory partition.
|
||||
* @param[in] buf Specify memory buffer that want to free.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The memory partition id passed was invalid.
|
||||
* @retval E_INVALID_PARAMETER The parameter passed was invalid.
|
||||
* @retval E_OK Free successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Delete a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoFreeMemoryBuffer(OS_MMID mmID,void* buf)
|
||||
{
|
||||
P_MM memCtl;
|
||||
P_MemBlk memBlk;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if(buf == Co_NULL)
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
#endif
|
||||
|
||||
memCtl = &MemoryTbl[mmID];
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if((U32)buf < (U32)(memCtl->memAddr))
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
if((U32)buf > (U32)(memCtl->memAddr + memCtl->blockSize*memCtl->blockNum))
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
if(((U32)buf - (U32)(memCtl->memAddr))%(memCtl->blockSize) != 0)
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
#endif
|
||||
memBlk = (P_MemBlk)buf; /* Reset the first free item */
|
||||
OsSchedLock();
|
||||
memBlk->nextBlock = (P_MemBlk)memCtl->freeBlock;
|
||||
memCtl->freeBlock = buf;
|
||||
OsSchedUnlock();
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file mm.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief memory management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_MM_EN > 0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
MM MemoryTbl[CFG_MAX_MM] = {{0}};/*!< Table which save memory control block. */
|
||||
U32 MemoryIDVessel = 0; /*!< Memory ID container. */
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a memory partition
|
||||
* @param[in] memBuf Specify memory partition head address.
|
||||
* @param[in] blockSize Specify memory block size.
|
||||
* @param[in] blockNum Specify memory block number.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create memory partition fail.
|
||||
* @retval others Create memory partition successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_MMID CoCreateMemPartition(U8* memBuf,U32 blockSize,U32 blockNum)
|
||||
{
|
||||
U8 i,j;
|
||||
U8 *memory;
|
||||
P_MemBlk memBlk;
|
||||
memory = memBuf;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(memBuf == Co_NULL)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if(blockSize == 0)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if((blockSize&0x3) != 0)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if(blockNum<=1)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
for(i = 0; i < CFG_MAX_MM; i++)
|
||||
{
|
||||
if((MemoryIDVessel & (1 << i)) == 0) /* Is free memory ID? */
|
||||
{
|
||||
MemoryIDVessel |= (1<<i); /* Yes,assign ID to this memory block */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
MemoryTbl[i].memAddr = memory;/* Initialize memory control block*/
|
||||
MemoryTbl[i].freeBlock = memory;
|
||||
MemoryTbl[i].blockSize = blockSize;
|
||||
MemoryTbl[i].blockNum = blockNum;
|
||||
memBlk = (P_MemBlk)memory; /* Bulid list in this memory block*/
|
||||
for(j=0;j<blockNum-1;j++)
|
||||
{
|
||||
memory = memory+blockSize;
|
||||
memBlk->nextBlock = (P_MemBlk)memory;
|
||||
memBlk = memBlk->nextBlock;
|
||||
}
|
||||
memBlk->nextBlock = Co_NULL;
|
||||
return i; /* Return memory block ID */
|
||||
}
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return E_CREATE_FAIL; /* Error return */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a memory partition
|
||||
* @param[in] mmID Specify memory partition that want to delete.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The memory partition id passed was invalid,delete fail.
|
||||
* @retval E_OK Delete successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Delete a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelMemoryPartition(OS_MMID mmID)
|
||||
{
|
||||
P_MM memCtl;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
memCtl = &MemoryTbl[mmID]; /* Release memory control block */
|
||||
MemoryIDVessel &= ~(1<<mmID);
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
|
||||
memCtl->memAddr = Co_NULL;
|
||||
memCtl->freeBlock = Co_NULL;
|
||||
memCtl->blockSize = 0;
|
||||
memCtl->blockNum = 0;
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get free block number in a memory partition
|
||||
* @param[in] mmID Specify memory partition.
|
||||
*
|
||||
* @param[out] E_INVALID_ID Invalid ID was passed and get counter failure.
|
||||
* @param[out] E_OK Get current counter successful.
|
||||
* @retval fbNum The number of free block.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to get free block number in a memory
|
||||
* partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
U32 CoGetFreeBlockNum(OS_MMID mmID,StatusType* perr)
|
||||
{
|
||||
U32 fbNum;
|
||||
P_MM memCtl;
|
||||
P_MemBlk memBlk;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return 0;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid memory id,return 0 */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
memCtl = &MemoryTbl[mmID];
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
memBlk = (P_MemBlk)(memCtl->freeBlock);/* Get the free item in memory list*/
|
||||
fbNum = 0;
|
||||
while(memBlk != Co_NULL) /* Get counter of free item */
|
||||
{
|
||||
fbNum++;
|
||||
memBlk = memBlk->nextBlock; /* Get next free iterm */
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedul */
|
||||
*perr = E_OK;
|
||||
return fbNum; /* Return the counter of free item */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get a memory buffer from memory partition
|
||||
* @param[in] mmID Specify memory partition that want to assign buffer.
|
||||
* @param[out] None
|
||||
* @retval Co_NULL Assign buffer fail.
|
||||
* @retval others Assign buffer successful,and return the buffer pointer.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Delete a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoGetMemoryBuffer(OS_MMID mmID)
|
||||
{
|
||||
P_MM memCtl;
|
||||
P_MemBlk memBlk;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
return Co_NULL;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
memCtl = &MemoryTbl[mmID];
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
if(memCtl->freeBlock == Co_NULL ) /* Is there no free item in memory list */
|
||||
{
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return Co_NULL; /* Yes,error return */
|
||||
}
|
||||
memBlk = (P_MemBlk)memCtl->freeBlock; /* Get free memory block */
|
||||
memCtl->freeBlock = (U8*)memBlk->nextBlock; /* Reset the first free item */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return memBlk; /* Return free memory block address */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Free a memory buffer to memory partition
|
||||
* @param[in] mmID Specify memory partition.
|
||||
* @param[in] buf Specify memory buffer that want to free.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The memory partition id passed was invalid.
|
||||
* @retval E_INVALID_PARAMETER The parameter passed was invalid.
|
||||
* @retval E_OK Free successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Delete a memory partition.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoFreeMemoryBuffer(OS_MMID mmID,void* buf)
|
||||
{
|
||||
P_MM memCtl;
|
||||
P_MemBlk memBlk;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(mmID >= CFG_MAX_MM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( ((1<<mmID)&MemoryIDVessel) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if(buf == Co_NULL)
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
#endif
|
||||
|
||||
memCtl = &MemoryTbl[mmID];
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if((U32)buf < (U32)(memCtl->memAddr))
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
if((U32)buf > (U32)(memCtl->memAddr + memCtl->blockSize*memCtl->blockNum))
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
if(((U32)buf - (U32)(memCtl->memAddr))%(memCtl->blockSize) != 0)
|
||||
{
|
||||
return E_INVALID_PARAMETER;
|
||||
}
|
||||
#endif
|
||||
memBlk = (P_MemBlk)buf; /* Reset the first free item */
|
||||
OsSchedLock();
|
||||
memBlk->nextBlock = (P_MemBlk)memCtl->freeBlock;
|
||||
memCtl->freeBlock = buf;
|
||||
OsSchedUnlock();
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+372
-349
@@ -1,349 +1,372 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file mutex.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Mutex management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
#if CFG_MUTEX_EN > 0
|
||||
|
||||
OS_MutexID MutexFreeID = 0; /*!< Point to next vliad mutex ID. */
|
||||
MUTEX MutexTbl[CFG_MAX_MUTEX] = {{0}}; /*!< Mutex struct array */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a mutex
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create mutex fail.
|
||||
* @retval others Create mutex successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a mutex.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_MutexID CoCreateMutex(void)
|
||||
{
|
||||
OS_MutexID id;
|
||||
P_MUTEX pMutex;
|
||||
OsSchedLock();
|
||||
|
||||
/* Assign a free mutex control block */
|
||||
if(MutexFreeID < CFG_MAX_MUTEX )
|
||||
{
|
||||
id = MutexFreeID++;
|
||||
OsSchedUnlock();
|
||||
pMutex = &MutexTbl[id];
|
||||
pMutex->hipriTaskID = INVALID_ID;
|
||||
pMutex->originalPrio = 0xff;
|
||||
pMutex->mutexFlag = MUTEX_FREE; /* Mutex is free,not was occupied */
|
||||
pMutex->taskID = INVALID_ID;
|
||||
pMutex->waittingList = Co_NULL;
|
||||
return id; /* Return mutex ID */
|
||||
}
|
||||
|
||||
OsSchedUnlock();
|
||||
return E_CREATE_FAIL; /* No free mutex control block */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Enter a critical area
|
||||
* @param[in] mutexID Specify mutex.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid mutex id.
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_OK Enter critical area successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called when entering a critical area.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoEnterMutexSection(OS_MutexID mutexID)
|
||||
{
|
||||
P_OSTCB ptcb,pCurTcb;
|
||||
P_MUTEX pMutex;
|
||||
|
||||
#if CFG_EVENT_EN >0
|
||||
P_ECB pecb;
|
||||
#endif
|
||||
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
if(OSSchedLock != 0) /* Is OS lock? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(mutexID >= MutexFreeID) /* Invalid 'mutexID' */
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
OsSchedLock();
|
||||
pCurTcb = TCBRunning;
|
||||
pMutex = &MutexTbl[mutexID];
|
||||
|
||||
pCurTcb->mutexID = mutexID;
|
||||
if(pMutex->mutexFlag == MUTEX_FREE) /* If mutex is available */
|
||||
{
|
||||
pMutex->originalPrio = pCurTcb->prio; /* Save priority of owning task */
|
||||
pMutex->taskID = pCurTcb->taskID; /* Acquire the resource */
|
||||
pMutex->hipriTaskID = pCurTcb->taskID;
|
||||
pMutex->mutexFlag = MUTEX_OCCUPY; /* Occupy the mutex resource*/
|
||||
}
|
||||
/* If the mutex resource had been occupied */
|
||||
else if(pMutex->mutexFlag == MUTEX_OCCUPY)
|
||||
{
|
||||
ptcb = &TCBTbl[pMutex->taskID];
|
||||
if(ptcb->prio > pCurTcb->prio) /* Need to promote priority of owner? */
|
||||
{
|
||||
#if CFG_ORDER_LIST_SCHEDULE_EN ==0
|
||||
DeleteTaskPri(ptcb->prio);
|
||||
ActiveTaskPri(pCurTcb->prio);
|
||||
#endif
|
||||
ptcb->prio = pCurTcb->prio; /* Promote prio of owner */
|
||||
|
||||
/* Upgarde the highest priority about the mutex */
|
||||
pMutex->hipriTaskID = pCurTcb->taskID;
|
||||
if(ptcb->state == TASK_READY) /* If the task is ready to run */
|
||||
{
|
||||
RemoveFromTCBRdyList(ptcb); /* Remove the task from READY list*/
|
||||
InsertToTCBRdyList(ptcb); /* Insert the task into READY list*/
|
||||
}
|
||||
#if CFG_EVENT_EN >0
|
||||
/* If the task is waiting on a event */
|
||||
else if(ptcb->eventID != INVALID_ID)
|
||||
{
|
||||
pecb = &EventTbl[ptcb->eventID];
|
||||
|
||||
/* If the event waiting type is preemptive Priority */
|
||||
if(pecb->eventSortType == EVENT_SORT_TYPE_PRIO)
|
||||
{
|
||||
/* Remove the task from event waiting list */
|
||||
RemoveEventWaittingList(ptcb);
|
||||
|
||||
/* Insert the task into event waiting list */
|
||||
EventTaskToWait(pecb,ptcb);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
pCurTcb->state = TASK_WAITING; /* Block current task */
|
||||
TaskSchedReq = Co_TRUE;
|
||||
pCurTcb->TCBnext = Co_NULL;
|
||||
pCurTcb->TCBprev = Co_NULL;
|
||||
|
||||
ptcb = pMutex->waittingList;
|
||||
if(ptcb == Co_NULL) /* If the event waiting list is empty */
|
||||
{
|
||||
pMutex->waittingList = pCurTcb; /* Insert the task to head */
|
||||
}
|
||||
else /* If the event waiting list is not empty */
|
||||
{
|
||||
while(ptcb->TCBnext != Co_NULL) /* Insert the task to tail */
|
||||
{
|
||||
ptcb = ptcb->TCBnext;
|
||||
}
|
||||
ptcb->TCBnext = pCurTcb;
|
||||
pCurTcb->TCBprev = ptcb;
|
||||
pCurTcb->TCBnext = Co_NULL;
|
||||
}
|
||||
}
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Leave from a critical area
|
||||
* @param[in] mutexID Specify mutex id.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid mutex id.
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_OK Exit a critical area successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function must be called when exiting from a critical area.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoLeaveMutexSection(OS_MutexID mutexID)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
P_MUTEX pMutex;
|
||||
U8 prio;
|
||||
U8 taskID;
|
||||
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(mutexID >= MutexFreeID)
|
||||
{
|
||||
return E_INVALID_ID; /* Invalid mutex id, return error */
|
||||
}
|
||||
#endif
|
||||
OsSchedLock();
|
||||
pMutex = &MutexTbl[mutexID]; /* Obtain point of mutex control block*/
|
||||
ptcb = &TCBTbl[pMutex->taskID];
|
||||
ptcb->mutexID = INVALID_ID;
|
||||
if(pMutex->waittingList == Co_NULL) /* If the mutex waiting list is empty */
|
||||
{
|
||||
pMutex->mutexFlag = MUTEX_FREE; /* The mutex resource is available */
|
||||
pMutex->taskID = INVALID_ID;
|
||||
OsSchedUnlock();
|
||||
}
|
||||
else /* If there is at least one task waitting for the mutex */
|
||||
{
|
||||
taskID = pMutex->taskID; /* Get task ID of mutex owner */
|
||||
|
||||
/* we havn't promoted current task's priority */
|
||||
if(pMutex->hipriTaskID == taskID)
|
||||
{
|
||||
ptcb = pMutex->waittingList;/* Point to mutex first waiting task */
|
||||
prio = ptcb->prio;
|
||||
while(ptcb != Co_NULL) /* Find the highest priority task */
|
||||
{
|
||||
if(ptcb->prio < prio)
|
||||
{
|
||||
prio = ptcb->prio;
|
||||
pMutex->hipriTaskID = ptcb->taskID;
|
||||
}
|
||||
ptcb = ptcb->TCBnext;
|
||||
}
|
||||
}
|
||||
else /* we have promoted current task's priority */
|
||||
{
|
||||
prio = TCBTbl[taskID].prio;
|
||||
}
|
||||
|
||||
/* Reset the task priority */
|
||||
pMutex->taskID = INVALID_ID;
|
||||
CoSetPriority(taskID,pMutex->originalPrio);
|
||||
|
||||
/* Find first task in waiting list ready to run */
|
||||
ptcb = pMutex->waittingList;
|
||||
pMutex->waittingList = ptcb->TCBnext;
|
||||
pMutex->originalPrio = ptcb->prio;
|
||||
pMutex->taskID = ptcb->taskID;
|
||||
|
||||
#if CFG_ORDER_LIST_SCHEDULE_EN ==0
|
||||
if(prio != ptcb->prio)
|
||||
{
|
||||
DeleteTaskPri(ptcb->prio);
|
||||
ActiveTaskPri(prio);
|
||||
}
|
||||
#endif
|
||||
|
||||
ptcb->prio = prio; /* Raise the task's priority */
|
||||
|
||||
/* Insert the task which acquire the mutex into ready list. */
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
|
||||
InsertToTCBRdyList(ptcb); /* Insert the task into the READY list */
|
||||
OsSchedUnlock();
|
||||
}
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Remove a task from mutex waiting list
|
||||
* @param[in] ptcb TCB which will remove out.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function be called when delete a task.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RemoveMutexList(P_OSTCB ptcb)
|
||||
{
|
||||
U8 prio;
|
||||
OS_TID taskID;
|
||||
P_MUTEX pMutex;
|
||||
pMutex = &MutexTbl[ptcb->mutexID];
|
||||
|
||||
/* If only one task waiting on mutex */
|
||||
if((ptcb->TCBnext ==Co_NULL) && (ptcb->TCBprev == Co_NULL))
|
||||
{
|
||||
pMutex->waittingList = Co_NULL; /* Waiting list is empty */
|
||||
}
|
||||
else if(ptcb->TCBnext == Co_NULL) /* If the task is the last of waiting list*/
|
||||
{
|
||||
/* Remove task from mutex waiting list */
|
||||
ptcb->TCBprev->TCBnext = Co_NULL;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
}
|
||||
else if(ptcb->TCBprev == Co_NULL)/* If the task is the first of waiting list*/
|
||||
{
|
||||
/* Remove task from waiting list */
|
||||
ptcb->TCBnext->TCBprev = Co_NULL;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
}
|
||||
else /* If the task is in the middle of waiting list */
|
||||
{
|
||||
/* Remove task from wait list */
|
||||
ptcb->TCBnext->TCBprev = ptcb->TCBprev;
|
||||
ptcb->TCBprev->TCBnext = ptcb->TCBnext;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
}
|
||||
|
||||
ptcb->mutexID = INVALID_ID;
|
||||
|
||||
/* If the task have highest priority in mutex waiting list */
|
||||
if(pMutex->hipriTaskID == ptcb->taskID)
|
||||
{
|
||||
ptcb = pMutex->waittingList;
|
||||
prio = pMutex->originalPrio;
|
||||
pMutex->hipriTaskID = pMutex->taskID;
|
||||
while(ptcb != Co_NULL) /* Find task ID of highest priority task*/
|
||||
{
|
||||
if(ptcb->prio < prio)
|
||||
{
|
||||
prio = ptcb->prio;
|
||||
pMutex->hipriTaskID = ptcb->taskID;
|
||||
}
|
||||
ptcb = ptcb->TCBnext;
|
||||
}
|
||||
taskID = pMutex->taskID;
|
||||
pMutex->taskID = INVALID_ID;
|
||||
CoSetPriority(taskID,prio); /* Reset the mutex ower priority */
|
||||
pMutex->taskID = taskID;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file mutex.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Mutex management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
#if CFG_MUTEX_EN > 0
|
||||
|
||||
OS_MutexID MutexFreeID = 0; /*!< Point to next vliad mutex ID. */
|
||||
MUTEX MutexTbl[CFG_MAX_MUTEX] = {{0}}; /*!< Mutex struct array */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a mutex
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create mutex fail.
|
||||
* @retval others Create mutex successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a mutex.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_MutexID CoCreateMutex(void)
|
||||
{
|
||||
OS_MutexID id;
|
||||
P_MUTEX pMutex;
|
||||
OsSchedLock();
|
||||
|
||||
/* Assign a free mutex control block */
|
||||
if(MutexFreeID < CFG_MAX_MUTEX )
|
||||
{
|
||||
id = MutexFreeID++;
|
||||
OsSchedUnlock();
|
||||
pMutex = &MutexTbl[id];
|
||||
pMutex->hipriTaskID = INVALID_ID;
|
||||
pMutex->originalPrio = 0xff;
|
||||
pMutex->mutexFlag = MUTEX_FREE; /* Mutex is free,not was occupied */
|
||||
pMutex->taskID = INVALID_ID;
|
||||
pMutex->waittingList = Co_NULL;
|
||||
return id; /* Return mutex ID */
|
||||
}
|
||||
|
||||
OsSchedUnlock();
|
||||
return E_CREATE_FAIL; /* No free mutex control block */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Enter a critical area
|
||||
* @param[in] mutexID Specify mutex.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid mutex id.
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_OK Enter critical area successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called when entering a critical area.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoEnterMutexSection(OS_MutexID mutexID)
|
||||
{
|
||||
P_OSTCB ptcb,pCurTcb;
|
||||
P_MUTEX pMutex;
|
||||
|
||||
#if CFG_EVENT_EN >0
|
||||
P_ECB pecb;
|
||||
#endif
|
||||
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
if(OSSchedLock != 0) /* Is OS lock? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(mutexID >= MutexFreeID) /* Invalid 'mutexID' */
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
OsSchedLock();
|
||||
pCurTcb = TCBRunning;
|
||||
pMutex = &MutexTbl[mutexID];
|
||||
|
||||
pCurTcb->mutexID = mutexID;
|
||||
if(pMutex->mutexFlag == MUTEX_FREE) /* If mutex is available */
|
||||
{
|
||||
pMutex->originalPrio = pCurTcb->prio; /* Save priority of owning task */
|
||||
pMutex->taskID = pCurTcb->taskID; /* Acquire the resource */
|
||||
pMutex->hipriTaskID = pCurTcb->taskID;
|
||||
pMutex->mutexFlag = MUTEX_OCCUPY; /* Occupy the mutex resource*/
|
||||
}
|
||||
/* If the mutex resource had been occupied */
|
||||
else if(pMutex->mutexFlag == MUTEX_OCCUPY)
|
||||
{
|
||||
ptcb = &TCBTbl[pMutex->taskID];
|
||||
if(ptcb->prio > pCurTcb->prio) /* Need to promote priority of owner? */
|
||||
{
|
||||
#if CFG_ORDER_LIST_SCHEDULE_EN ==0
|
||||
DeleteTaskPri(ptcb->prio);
|
||||
ActiveTaskPri(pCurTcb->prio);
|
||||
#endif
|
||||
ptcb->prio = pCurTcb->prio; /* Promote prio of owner */
|
||||
|
||||
/* Upgarde the highest priority about the mutex */
|
||||
pMutex->hipriTaskID = pCurTcb->taskID;
|
||||
if(ptcb->state == TASK_READY) /* If the task is ready to run */
|
||||
{
|
||||
RemoveFromTCBRdyList(ptcb); /* Remove the task from READY list*/
|
||||
InsertToTCBRdyList(ptcb); /* Insert the task into READY list*/
|
||||
}
|
||||
#if CFG_EVENT_EN >0
|
||||
/* If the task is waiting on a event */
|
||||
else if(ptcb->eventID != INVALID_ID)
|
||||
{
|
||||
pecb = &EventTbl[ptcb->eventID];
|
||||
|
||||
/* If the event waiting type is preemptive Priority */
|
||||
if(pecb->eventSortType == EVENT_SORT_TYPE_PRIO)
|
||||
{
|
||||
/* Remove the task from event waiting list */
|
||||
RemoveEventWaittingList(ptcb);
|
||||
|
||||
/* Insert the task into event waiting list */
|
||||
EventTaskToWait(pecb,ptcb);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
pCurTcb->state = TASK_WAITING; /* Block current task */
|
||||
TaskSchedReq = Co_TRUE;
|
||||
pCurTcb->TCBnext = Co_NULL;
|
||||
pCurTcb->TCBprev = Co_NULL;
|
||||
|
||||
ptcb = pMutex->waittingList;
|
||||
if(ptcb == Co_NULL) /* If the event waiting list is empty */
|
||||
{
|
||||
pMutex->waittingList = pCurTcb; /* Insert the task to head */
|
||||
}
|
||||
else /* If the event waiting list is not empty */
|
||||
{
|
||||
while(ptcb->TCBnext != Co_NULL) /* Insert the task to tail */
|
||||
{
|
||||
ptcb = ptcb->TCBnext;
|
||||
}
|
||||
ptcb->TCBnext = pCurTcb;
|
||||
pCurTcb->TCBprev = ptcb;
|
||||
pCurTcb->TCBnext = Co_NULL;
|
||||
}
|
||||
}
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Leave from a critical area
|
||||
* @param[in] mutexID Specify mutex id.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid mutex id.
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_OK Exit a critical area successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function must be called when exiting from a critical area.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoLeaveMutexSection(OS_MutexID mutexID)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
P_MUTEX pMutex;
|
||||
U8 prio;
|
||||
U8 taskID;
|
||||
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(mutexID >= MutexFreeID)
|
||||
{
|
||||
return E_INVALID_ID; /* Invalid mutex id, return error */
|
||||
}
|
||||
#endif
|
||||
OsSchedLock();
|
||||
pMutex = &MutexTbl[mutexID]; /* Obtain point of mutex control block*/
|
||||
ptcb = &TCBTbl[pMutex->taskID];
|
||||
ptcb->mutexID = INVALID_ID;
|
||||
if(pMutex->waittingList == Co_NULL) /* If the mutex waiting list is empty */
|
||||
{
|
||||
pMutex->mutexFlag = MUTEX_FREE; /* The mutex resource is available */
|
||||
pMutex->taskID = INVALID_ID;
|
||||
OsSchedUnlock();
|
||||
}
|
||||
else /* If there is at least one task waitting for the mutex */
|
||||
{
|
||||
taskID = pMutex->taskID; /* Get task ID of mutex owner */
|
||||
|
||||
/* we havn't promoted current task's priority */
|
||||
if(pMutex->hipriTaskID == taskID)
|
||||
{
|
||||
ptcb = pMutex->waittingList;/* Point to mutex first waiting task */
|
||||
prio = ptcb->prio;
|
||||
while(ptcb != Co_NULL) /* Find the highest priority task */
|
||||
{
|
||||
if(ptcb->prio < prio)
|
||||
{
|
||||
prio = ptcb->prio;
|
||||
pMutex->hipriTaskID = ptcb->taskID;
|
||||
}
|
||||
ptcb = ptcb->TCBnext;
|
||||
}
|
||||
}
|
||||
else /* we have promoted current task's priority */
|
||||
{
|
||||
prio = TCBTbl[taskID].prio;
|
||||
}
|
||||
|
||||
/* Reset the task priority */
|
||||
pMutex->taskID = INVALID_ID;
|
||||
CoSetPriority(taskID,pMutex->originalPrio);
|
||||
|
||||
/* Find first task in waiting list ready to run */
|
||||
ptcb = pMutex->waittingList;
|
||||
pMutex->waittingList = ptcb->TCBnext;
|
||||
pMutex->originalPrio = ptcb->prio;
|
||||
pMutex->taskID = ptcb->taskID;
|
||||
|
||||
#if CFG_ORDER_LIST_SCHEDULE_EN ==0
|
||||
if(prio != ptcb->prio)
|
||||
{
|
||||
DeleteTaskPri(ptcb->prio);
|
||||
ActiveTaskPri(prio);
|
||||
}
|
||||
#endif
|
||||
|
||||
ptcb->prio = prio; /* Raise the task's priority */
|
||||
|
||||
/* Insert the task which acquire the mutex into ready list. */
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
|
||||
InsertToTCBRdyList(ptcb); /* Insert the task into the READY list */
|
||||
OsSchedUnlock();
|
||||
}
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Remove a task from mutex waiting list
|
||||
* @param[in] ptcb TCB which will remove out.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function be called when delete a task.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RemoveMutexList(P_OSTCB ptcb)
|
||||
{
|
||||
U8 prio;
|
||||
OS_TID taskID;
|
||||
P_MUTEX pMutex;
|
||||
pMutex = &MutexTbl[ptcb->mutexID];
|
||||
|
||||
/* If only one task waiting on mutex */
|
||||
if((ptcb->TCBnext ==Co_NULL) && (ptcb->TCBprev == Co_NULL))
|
||||
{
|
||||
pMutex->waittingList = Co_NULL; /* Waiting list is empty */
|
||||
}
|
||||
else if(ptcb->TCBnext == Co_NULL) /* If the task is the last of waiting list*/
|
||||
{
|
||||
/* Remove task from mutex waiting list */
|
||||
ptcb->TCBprev->TCBnext = Co_NULL;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
}
|
||||
else if(ptcb->TCBprev == Co_NULL)/* If the task is the first of waiting list*/
|
||||
{
|
||||
/* Remove task from waiting list */
|
||||
ptcb->TCBnext->TCBprev = Co_NULL;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
}
|
||||
else /* If the task is in the middle of waiting list */
|
||||
{
|
||||
/* Remove task from wait list */
|
||||
ptcb->TCBnext->TCBprev = ptcb->TCBprev;
|
||||
ptcb->TCBprev->TCBnext = ptcb->TCBnext;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
}
|
||||
|
||||
ptcb->mutexID = INVALID_ID;
|
||||
|
||||
/* If the task have highest priority in mutex waiting list */
|
||||
if(pMutex->hipriTaskID == ptcb->taskID)
|
||||
{
|
||||
ptcb = pMutex->waittingList;
|
||||
prio = pMutex->originalPrio;
|
||||
pMutex->hipriTaskID = pMutex->taskID;
|
||||
while(ptcb != Co_NULL) /* Find task ID of highest priority task*/
|
||||
{
|
||||
if(ptcb->prio < prio)
|
||||
{
|
||||
prio = ptcb->prio;
|
||||
pMutex->hipriTaskID = ptcb->taskID;
|
||||
}
|
||||
ptcb = ptcb->TCBnext;
|
||||
}
|
||||
taskID = pMutex->taskID;
|
||||
pMutex->taskID = INVALID_ID;
|
||||
CoSetPriority(taskID,prio); /* Reset the mutex ower priority */
|
||||
pMutex->taskID = taskID;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
+432
-393
@@ -1,393 +1,432 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file queue.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Queue management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_QUEUE_EN > 0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
QCB QueueTbl[CFG_MAX_QUEUE] = {{0}}; /*!< Queue control block table */
|
||||
U32 QueueIDVessel = 0; /*!< Queue list mask */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a queue
|
||||
* @param[in] qStart Pointer to mail pointer buffer.
|
||||
* @param[in] size The length of queue.
|
||||
* @param[in] sortType Mail queue waiting list sort type.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create queue fail.
|
||||
* @retval others Create queue successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_EventID CoCreateQueue(void **qStart, U16 size ,U8 sortType)
|
||||
{
|
||||
U8 i;
|
||||
P_ECB pecb;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if((qStart == Co_NULL) || (size == 0))
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
OsSchedLock();
|
||||
for(i = 0; i < CFG_MAX_QUEUE; i++)
|
||||
{
|
||||
/* Assign a free QUEUE control block */
|
||||
if((QueueIDVessel & (1 << i)) == 0)
|
||||
{
|
||||
QueueIDVessel |= (1<<i);
|
||||
OsSchedUnlock();
|
||||
|
||||
QueueTbl[i].qStart = qStart; /* Initialize the queue */
|
||||
QueueTbl[i].id = i;
|
||||
QueueTbl[i].head = 0;
|
||||
QueueTbl[i].tail = 0;
|
||||
QueueTbl[i].qMaxSize = size;
|
||||
QueueTbl[i].qSize = 0;
|
||||
|
||||
/* Get a event control block and initial the event content */
|
||||
pecb = CreatEvent(EVENT_TYPE_QUEUE,sortType,&QueueTbl[i]);
|
||||
|
||||
if(pecb == Co_NULL ) /* If there is no free EVENT control block*/
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
return (pecb->id);
|
||||
}
|
||||
}
|
||||
|
||||
OsSchedUnlock();
|
||||
return E_CREATE_FAIL; /* There is no free QUEUE control block */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a queue
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] opt Delete option.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter.
|
||||
* @retval E_TASK_WAITTING Tasks waitting for the event,delete fail.
|
||||
* @retval E_OK Event deleted successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelQueue(OS_EventID id,U8 opt)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
StatusType err;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID; /* Invalid id,return error */
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if( pecb->eventType != EVENT_TYPE_QUEUE)
|
||||
{
|
||||
return E_INVALID_ID; /* The event is not queue,return error*/
|
||||
}
|
||||
#endif
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Point at queue control block */
|
||||
err = DeleteEvent(pecb,opt); /* Delete the event control block */
|
||||
if(err == E_OK) /* If the event block have been deleted */
|
||||
{
|
||||
QueueIDVessel &= ~((U32)(1<<(pqcb->id))); /* Update free queue list */
|
||||
pqcb->qStart = Co_NULL;
|
||||
pqcb->id = 0;
|
||||
pqcb->head = 0;
|
||||
pqcb->tail = 0;
|
||||
pqcb->qMaxSize = 0;
|
||||
pqcb->qSize = 0;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Accept a mail from queue
|
||||
* @param[in] id Event ID.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mail accepted.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to accept a mail from queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoAcceptQueueMail(OS_EventID id,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
void* pmail;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid id,return error */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_QUEUE)/* Invalid event control block type*/
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Point at queue control block */
|
||||
OsSchedLock();
|
||||
if(pqcb->qSize != 0) /* If there are any messages in the queue */
|
||||
{
|
||||
/* Extract oldest message from the queue */
|
||||
pmail = *(pqcb->qStart + pqcb->head);
|
||||
pqcb->head++; /* Update the queue head */
|
||||
pqcb->qSize--; /* Update the number of messages in the queue */
|
||||
if(pqcb->head == pqcb->qMaxSize)
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
OsSchedUnlock();
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received */
|
||||
}
|
||||
else /* If there is no message in the queue*/
|
||||
{
|
||||
OsSchedUnlock();
|
||||
*perr = E_QUEUE_EMPTY;
|
||||
return Co_NULL; /* Return Co_NULL */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Pend for a mail
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] timeout The longest time for writting mail.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mail accept.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to wait for a mail.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoPendQueueMail(OS_EventID id,U32 timeout,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
P_OSTCB curTCB;
|
||||
void* pmail;
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
*perr = E_CALL;
|
||||
return Co_NULL;
|
||||
}
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid event id,return error */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_QUEUE) /* The event type is not queue */
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
if(OSSchedLock != 0) /* Judge schedule is locked or not? */
|
||||
{
|
||||
*perr = E_OS_IN_LOCK; /* Schedule is locked,return error */
|
||||
return Co_NULL;
|
||||
}
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Point at queue control block */
|
||||
OsSchedLock();
|
||||
if(pqcb->qSize != 0) /* If there are any messages in the queue */
|
||||
{
|
||||
/* Extract oldest message from the queue */
|
||||
pmail = *(pqcb->qStart + pqcb->head);
|
||||
pqcb->head++; /* Update the queue head */
|
||||
pqcb->qSize--; /* Update the number of messages in the queue */
|
||||
if(pqcb->head == pqcb->qMaxSize)/* Check queue head */
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
OsSchedUnlock();
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received */
|
||||
}
|
||||
else /* If there is no message in the queue*/
|
||||
{
|
||||
OsSchedUnlock();
|
||||
curTCB = TCBRunning;
|
||||
if(timeout == 0) /* If time-out is not configured */
|
||||
{
|
||||
/* Block current task until the event occur */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
|
||||
/* Have recived message or the queue have been deleted */
|
||||
pmail = curTCB->pmail;
|
||||
curTCB->pmail = Co_NULL;
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received or Co_NULL */
|
||||
}
|
||||
else /* If time-out is configured */
|
||||
{
|
||||
OsSchedLock();
|
||||
|
||||
/* Block current task until event or timeout occurs */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
InsertDelayList(curTCB,timeout);
|
||||
OsSchedUnlock();
|
||||
if(curTCB->pmail == Co_NULL) /* If time-out occurred */
|
||||
{
|
||||
*perr = E_TIMEOUT;
|
||||
return Co_NULL;
|
||||
}
|
||||
else /* If event occured */
|
||||
{
|
||||
pmail = curTCB->pmail;
|
||||
curTCB->pmail = Co_NULL;
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received or Co_NULL */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mail to queue
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_OK
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_QUEUE_FULL
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a mail to queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPostQueueMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_QUEUE)
|
||||
{
|
||||
return E_INVALID_ID; /* The event type isn't queue,return */
|
||||
}
|
||||
#endif
|
||||
pqcb = (P_QCB)pecb->eventPtr;
|
||||
if(pqcb->qSize == pqcb->qMaxSize) /* If queue is full */
|
||||
{
|
||||
return E_QUEUE_FULL;
|
||||
}
|
||||
else /* If queue is not full */
|
||||
{
|
||||
OsSchedLock();
|
||||
*(pqcb->qStart + pqcb->tail) = pmail; /* Insert message into queue */
|
||||
pqcb->tail++; /* Update queue tail */
|
||||
pqcb->qSize++; /* Update the number of messages in the queue */
|
||||
if(pqcb->tail == pqcb->qMaxSize) /* Check queue tail */
|
||||
{
|
||||
pqcb->tail = 0;
|
||||
}
|
||||
EventTaskToRdy(pecb); /* Check the event waiting list */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mail to queue in ISR
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_OK
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_QUEUE_FULL
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in ISR to post a mail to queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
StatusType isr_PostQueueMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
if(OSSchedLock > 0) /* If scheduler is locked,(the caller is ISR) */
|
||||
{
|
||||
/* Insert the request into service request queue */
|
||||
if(InsertInSRQ(QUEUE_REQ,id,pmail) == Co_FALSE)
|
||||
{
|
||||
return E_SEV_REQ_FULL; /* If service request queue is full */
|
||||
}
|
||||
else /* If the request have been inserted into service request queue */
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
else /* The scheduler is unlocked */
|
||||
{
|
||||
return(CoPostQueueMail(id,pmail)); /* Send the message to the queue*/
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file queue.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Queue management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
|
||||
#if CFG_QUEUE_EN > 0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
QCB QueueTbl[CFG_MAX_QUEUE] = {{0}}; /*!< Queue control block table */
|
||||
U32 QueueIDVessel = 0; /*!< Queue list mask */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a queue
|
||||
* @param[in] qStart Pointer to mail pointer buffer.
|
||||
* @param[in] size The length of queue.
|
||||
* @param[in] sortType Mail queue waiting list sort type.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create queue fail.
|
||||
* @retval others Create queue successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_EventID CoCreateQueue(void **qStart, U16 size ,U8 sortType)
|
||||
{
|
||||
U8 i;
|
||||
P_ECB pecb;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if((qStart == Co_NULL) || (size == 0))
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
OsSchedLock();
|
||||
for(i = 0; i < CFG_MAX_QUEUE; i++)
|
||||
{
|
||||
/* Assign a free QUEUE control block */
|
||||
if((QueueIDVessel & (1 << i)) == 0)
|
||||
{
|
||||
QueueIDVessel |= (1<<i);
|
||||
OsSchedUnlock();
|
||||
|
||||
QueueTbl[i].qStart = qStart; /* Initialize the queue */
|
||||
QueueTbl[i].id = i;
|
||||
QueueTbl[i].head = 0;
|
||||
QueueTbl[i].tail = 0;
|
||||
QueueTbl[i].qMaxSize = size;
|
||||
QueueTbl[i].qSize = 0;
|
||||
|
||||
/* Get a event control block and initial the event content */
|
||||
pecb = CreatEvent(EVENT_TYPE_QUEUE,sortType,&QueueTbl[i]);
|
||||
|
||||
if(pecb == Co_NULL ) /* If there is no free EVENT control block*/
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
return (pecb->id);
|
||||
}
|
||||
}
|
||||
|
||||
OsSchedUnlock();
|
||||
return E_CREATE_FAIL; /* There is no free QUEUE control block */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a queue
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] opt Delete option.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter.
|
||||
* @retval E_TASK_WAITTING Tasks waitting for the event,delete fail.
|
||||
* @retval E_OK Event deleted successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelQueue(OS_EventID id,U8 opt)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
StatusType err;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID; /* Invalid id,return error */
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if( pecb->eventType != EVENT_TYPE_QUEUE)
|
||||
{
|
||||
return E_INVALID_ID; /* The event is not queue,return error*/
|
||||
}
|
||||
#endif
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Point at queue control block */
|
||||
err = DeleteEvent(pecb,opt); /* Delete the event control block */
|
||||
if(err == E_OK) /* If the event block have been deleted */
|
||||
{
|
||||
QueueIDVessel &= ~((U32)(1<<(pqcb->id))); /* Update free queue list */
|
||||
pqcb->qStart = Co_NULL;
|
||||
pqcb->id = 0;
|
||||
pqcb->head = 0;
|
||||
pqcb->tail = 0;
|
||||
pqcb->qMaxSize = 0;
|
||||
pqcb->qSize = 0;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Accept a mail from queue
|
||||
* @param[in] id Event ID.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mail accepted.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to accept a mail from queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoAcceptQueueMail(OS_EventID id,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
void* pmail;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid id,return error */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_QUEUE)/* Invalid event control block type*/
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Point at queue control block */
|
||||
OsSchedLock();
|
||||
if(pqcb->qSize != 0) /* If there are any messages in the queue */
|
||||
{
|
||||
/* Extract oldest message from the queue */
|
||||
pmail = *(pqcb->qStart + pqcb->head);
|
||||
pqcb->head++; /* Update the queue head */
|
||||
pqcb->qSize--; /* Update the number of messages in the queue */
|
||||
if(pqcb->head == pqcb->qMaxSize)
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
OsSchedUnlock();
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received */
|
||||
}
|
||||
else /* If there is no message in the queue*/
|
||||
{
|
||||
OsSchedUnlock();
|
||||
*perr = E_QUEUE_EMPTY;
|
||||
return Co_NULL; /* Return Co_NULL */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Pend for a mail
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] timeout The longest time for writting mail.
|
||||
* @param[out] perr A pointer to error code.
|
||||
* @retval Co_NULL
|
||||
* @retval A pointer to mail accept.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to wait for a mail.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void* CoPendQueueMail(OS_EventID id,U32 timeout,StatusType* perr)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
P_OSTCB curTCB;
|
||||
void* pmail;
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
*perr = E_CALL;
|
||||
return Co_NULL;
|
||||
}
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
*perr = E_INVALID_ID; /* Invalid event id,return error */
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_QUEUE) /* The event type is not queue */
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return Co_NULL;
|
||||
}
|
||||
#endif
|
||||
if(OSSchedLock != 0) /* Judge schedule is locked or not? */
|
||||
{
|
||||
*perr = E_OS_IN_LOCK; /* Schedule is locked,return error */
|
||||
return Co_NULL;
|
||||
}
|
||||
pqcb = (P_QCB)pecb->eventPtr; /* Point at queue control block */
|
||||
OsSchedLock();
|
||||
if(pqcb->qSize != 0) /* If there are any messages in the queue */
|
||||
{
|
||||
/* Extract oldest message from the queue */
|
||||
pmail = *(pqcb->qStart + pqcb->head);
|
||||
pqcb->head++; /* Update the queue head */
|
||||
pqcb->qSize--; /* Update the number of messages in the queue */
|
||||
if(pqcb->head == pqcb->qMaxSize)/* Check queue head */
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
OsSchedUnlock();
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received */
|
||||
}
|
||||
else /* If there is no message in the queue*/
|
||||
{
|
||||
OsSchedUnlock();
|
||||
curTCB = TCBRunning;
|
||||
if(timeout == 0) /* If time-out is not configured */
|
||||
{
|
||||
/* Block current task until the event occur */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
|
||||
/* Have recived message or the queue have been deleted */
|
||||
OsSchedLock();
|
||||
pmail = curTCB->pmail;
|
||||
curTCB->pmail = Co_NULL;
|
||||
pqcb->head++; /* Clear event sign */
|
||||
pqcb->qSize--;
|
||||
if(pqcb->head == pqcb->qMaxSize)
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
OsSchedUnlock();
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received or Co_NULL */
|
||||
}
|
||||
else /* If time-out is configured */
|
||||
{
|
||||
OsSchedLock();
|
||||
|
||||
/* Block current task until event or timeout occurs */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
InsertDelayList(curTCB,timeout);
|
||||
OsSchedUnlock();
|
||||
if(curTCB->pmail == Co_NULL) /* If time-out occurred */
|
||||
{
|
||||
*perr = E_TIMEOUT;
|
||||
return Co_NULL;
|
||||
}
|
||||
else /* If event occured */
|
||||
{
|
||||
OsSchedLock();
|
||||
pmail = curTCB->pmail;
|
||||
curTCB->pmail = Co_NULL;
|
||||
pqcb->head++; /* Clear event sign */
|
||||
pqcb->qSize--;
|
||||
if(pqcb->head == pqcb->qMaxSize)
|
||||
{
|
||||
pqcb->head = 0;
|
||||
}
|
||||
OsSchedUnlock();
|
||||
*perr = E_OK;
|
||||
return pmail; /* Return message received or Co_NULL */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mail to queue
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_OK
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_QUEUE_FULL
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a mail to queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPostQueueMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_QCB pqcb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_QUEUE)
|
||||
{
|
||||
return E_INVALID_ID; /* The event type isn't queue,return */
|
||||
}
|
||||
#endif
|
||||
pqcb = (P_QCB)pecb->eventPtr;
|
||||
if(pqcb->qSize == pqcb->qMaxSize) /* If queue is full */
|
||||
{
|
||||
return E_QUEUE_FULL;
|
||||
}
|
||||
else /* If queue is not full */
|
||||
{
|
||||
OsSchedLock();
|
||||
*(pqcb->qStart + pqcb->tail) = pmail; /* Insert message into queue */
|
||||
pqcb->tail++; /* Update queue tail */
|
||||
pqcb->qSize++; /* Update the number of messages in the queue */
|
||||
if(pqcb->tail == pqcb->qMaxSize) /* Check queue tail */
|
||||
{
|
||||
pqcb->tail = 0;
|
||||
}
|
||||
EventTaskToRdy(pecb); /* Check the event waiting list */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a mail to queue in ISR
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] pmail Pointer to mail that want to send.
|
||||
* @param[out] None
|
||||
* @retval E_OK
|
||||
* @retval E_INVALID_ID
|
||||
* @retval E_QUEUE_FULL
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in ISR to post a mail to queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
StatusType isr_PostQueueMail(OS_EventID id,void* pmail)
|
||||
{
|
||||
if(OSSchedLock > 0) /* If scheduler is locked,(the caller is ISR) */
|
||||
{
|
||||
/* Insert the request into service request queue */
|
||||
if(InsertInSRQ(QUEUE_REQ,id,pmail) == Co_FALSE)
|
||||
{
|
||||
return E_SEV_REQ_FULL; /* If service request queue is full */
|
||||
}
|
||||
else /* If the request have been inserted into service request queue */
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
else /* The scheduler is unlocked */
|
||||
{
|
||||
return(CoPostQueueMail(id,pmail)); /* Send the message to the queue*/
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+347
-322
@@ -1,322 +1,347 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file sem.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Semaphore management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_SEM_EN >0
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a semaphore
|
||||
* @param[in] initCnt Semaphore valid counter.
|
||||
* @param[in] maxCnt Semaphore max initialize counter.
|
||||
* @param[in] sortType Semaphore sort type.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create semaphore fail.
|
||||
* @retval others Create semaphore successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a semaphore.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_EventID CoCreateSem(U16 initCnt,U16 maxCnt,U8 sortType)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(initCnt > maxCnt)
|
||||
{
|
||||
return E_CREATE_FAIL; /* Invalid 'initCnt' or 'maxCnt' */
|
||||
}
|
||||
|
||||
if ((sortType != EVENT_SORT_TYPE_FIFO) && (sortType != EVENT_SORT_TYPE_PRIO))
|
||||
{
|
||||
return E_CREATE_FAIL; /* Illegal sort type,return error */
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create a semaphore type event control block */
|
||||
pecb = CreatEvent(EVENT_TYPE_SEM,sortType,Co_NULL);
|
||||
if(pecb == Co_NULL) /* If failed to create event block */
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
pecb->eventCounter = initCnt;/* Initialize event block */
|
||||
pecb->initialEventCounter = maxCnt;
|
||||
return (pecb->id); /* Return event id */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a semaphore
|
||||
* @param[in] id Event ID which to be deleted.
|
||||
* @param[in] opt Delete option.
|
||||
* @arg == OPT_DEL_ANYWAY Delete semaphore always
|
||||
* @arg == OPT_DEL_NO_PEND Delete semaphore only when no task pending on.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter.
|
||||
* @retval E_TASK_WAITTING Tasks waitting for the event,delete fail.
|
||||
* @retval E_OK Event deleted successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a semaphore.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelSem(OS_EventID id,U8 opt)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_SEM)
|
||||
{
|
||||
return E_INVALID_ID; /* The event type is not semaphore */
|
||||
}
|
||||
#endif
|
||||
|
||||
return (DeleteEvent(pecb,opt));/* Delete the semaphore event control block*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Accept a semaphore without waitting
|
||||
* @param[in] id Event ID
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_SEM_EMPTY No semaphore exist.
|
||||
* @retval E_OK Get semaphore successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called accept a semaphore without waitting.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoAcceptSem(OS_EventID id)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if( pecb->eventType != EVENT_TYPE_SEM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock();
|
||||
if(pecb->eventCounter > 0) /* If semaphore is positive,resource available */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
pecb->eventCounter--; /* Decrement semaphore only if positive */
|
||||
return E_OK;
|
||||
}
|
||||
else /* Resource is not available */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
return E_SEM_EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief wait for a semaphore
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] timeout The longest time for writting semaphore.
|
||||
* @para 0
|
||||
* @para 0x1~0xff
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_TIMEOUT Semaphore was not received within the specified
|
||||
* 'timeout' time.
|
||||
* @retval E_OK The call was successful and your task owns the
|
||||
* resource,or the event you are waiting for occurred.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to waits for a semaphore.
|
||||
* @note IF this function is called in ISR,nothing to do and return immediately.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPendSem(OS_EventID id,U32 timeout)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_OSTCB curTCB;
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_SEM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
if(OSSchedLock != 0) /* Schdule is locked? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
OsSchedLock();
|
||||
if(pecb->eventCounter > 0) /* If semaphore is positive,resource available */
|
||||
{
|
||||
pecb->eventCounter--; /* Decrement semaphore only if positive */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
else /* Resource is not available */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
curTCB = TCBRunning;
|
||||
if(timeout == 0) /* If time-out is not configured */
|
||||
{
|
||||
EventTaskToWait(pecb,curTCB); /* Block task until event occurs */
|
||||
curTCB->pmail = Co_NULL;
|
||||
return E_OK;
|
||||
}
|
||||
else /* If time-out is configured */
|
||||
{
|
||||
OsSchedLock();
|
||||
|
||||
/* Block task until event or timeout occurs */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
InsertDelayList(curTCB,timeout);
|
||||
|
||||
OsSchedUnlock();
|
||||
if (curTCB->pmail == Co_NULL) /* If pmail is Co_NULL, time-out occurred*/
|
||||
{
|
||||
return E_TIMEOUT;
|
||||
}
|
||||
else /* Event occurred or event have been deleted*/
|
||||
{
|
||||
curTCB->pmail = Co_NULL;
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a semaphore
|
||||
* @param[in] id id of event control block associated with the desired semaphore.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Parameter id passed was invalid event ID.
|
||||
* @retval E_SEM_FULL Semaphore full.
|
||||
* @retval E_OK Semaphore had post successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a semaphore to corresponding event.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPostSem(OS_EventID id)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_SEM) /* Invalid event control block type */
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Make sure semaphore will not overflow */
|
||||
if(pecb->eventCounter == pecb->initialEventCounter)
|
||||
{
|
||||
return E_SEM_FULL; /* The counter of Semaphore reach the max number*/
|
||||
}
|
||||
OsSchedLock();
|
||||
pecb->eventCounter++; /* Increment semaphore count to register event */
|
||||
EventTaskToRdy(pecb); /* Check semaphore event waiting list */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a semaphore in ISR
|
||||
* @param[in] id identifier of event control block associated with the
|
||||
* desired semaphore.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Parameter id passed was invalid event ID.
|
||||
* @retval E_NO_TASK_WAITTING There are one more tasks waitting for the event.
|
||||
* @retval E_OK Semaphore had signaled successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in ISR to post a semaphore to corresponding
|
||||
* event.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
StatusType isr_PostSem(OS_EventID id)
|
||||
{
|
||||
if(OSSchedLock > 0) /* If scheduler is locked,(the caller is ISR) */
|
||||
{
|
||||
/* Initiate a post service handling request */
|
||||
if(InsertInSRQ(SEM_REQ,id,Co_NULL) == Co_FALSE)
|
||||
{
|
||||
return E_SEV_REQ_FULL; /* If service request queue is full */
|
||||
}
|
||||
else /* Operate successfully */
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return(CoPostSem(id)); /* Post semaphore */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file sem.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Semaphore management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_SEM_EN >0
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a semaphore
|
||||
* @param[in] initCnt Semaphore valid counter.
|
||||
* @param[in] maxCnt Semaphore max initialize counter.
|
||||
* @param[in] sortType Semaphore sort type.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create semaphore fail.
|
||||
* @retval others Create semaphore successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a semaphore.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_EventID CoCreateSem(U16 initCnt,U16 maxCnt,U8 sortType)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(initCnt > maxCnt)
|
||||
{
|
||||
return E_CREATE_FAIL; /* Invalid 'initCnt' or 'maxCnt' */
|
||||
}
|
||||
|
||||
if ((sortType != EVENT_SORT_TYPE_FIFO) && (sortType != EVENT_SORT_TYPE_PRIO))
|
||||
{
|
||||
return E_CREATE_FAIL; /* Illegal sort type,return error */
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create a semaphore type event control block */
|
||||
pecb = CreatEvent(EVENT_TYPE_SEM,sortType,Co_NULL);
|
||||
if(pecb == Co_NULL) /* If failed to create event block */
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
pecb->eventCounter = initCnt;/* Initialize event block */
|
||||
pecb->initialEventCounter = maxCnt;
|
||||
return (pecb->id); /* Return event id */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a semaphore
|
||||
* @param[in] id Event ID which to be deleted.
|
||||
* @param[in] opt Delete option.
|
||||
* @arg == OPT_DEL_ANYWAY Delete semaphore always
|
||||
* @arg == OPT_DEL_NO_PEND Delete semaphore only when no task pending on.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter.
|
||||
* @retval E_TASK_WAITTING Tasks waitting for the event,delete fail.
|
||||
* @retval E_OK Event deleted successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a semaphore.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelSem(OS_EventID id,U8 opt)
|
||||
{
|
||||
P_ECB pecb;
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_SEM)
|
||||
{
|
||||
return E_INVALID_ID; /* The event type is not semaphore */
|
||||
}
|
||||
#endif
|
||||
|
||||
return (DeleteEvent(pecb,opt));/* Delete the semaphore event control block*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Accept a semaphore without waitting
|
||||
* @param[in] id Event ID
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_SEM_EMPTY No semaphore exist.
|
||||
* @retval E_OK Get semaphore successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called accept a semaphore without waitting.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoAcceptSem(OS_EventID id)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if( pecb->eventType != EVENT_TYPE_SEM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock();
|
||||
if(pecb->eventCounter > 0) /* If semaphore is positive,resource available */
|
||||
{
|
||||
pecb->eventCounter--; /* Decrement semaphore only if positive */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
else /* Resource is not available */
|
||||
{
|
||||
OsSchedUnlock();
|
||||
return E_SEM_EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief wait for a semaphore
|
||||
* @param[in] id Event ID.
|
||||
* @param[in] timeout The longest time for writting semaphore.
|
||||
* @para 0
|
||||
* @para 0x1~0xff
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_INVALID_ID Invalid event ID.
|
||||
* @retval E_TIMEOUT Semaphore was not received within the specified
|
||||
* 'timeout' time.
|
||||
* @retval E_OK The call was successful and your task owns the
|
||||
* resource,or the event you are waiting for occurred.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to waits for a semaphore.
|
||||
* @note IF this function is called in ISR,nothing to do and return immediately.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPendSem(OS_EventID id,U32 timeout)
|
||||
{
|
||||
P_ECB pecb;
|
||||
P_OSTCB curTCB;
|
||||
if(OSIntNesting > 0) /* If the caller is ISR */
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_SEM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
if(OSSchedLock != 0) /* Schdule is locked? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
OsSchedLock();
|
||||
if(pecb->eventCounter > 0) /* If semaphore is positive,resource available */
|
||||
{
|
||||
pecb->eventCounter--; /* Decrement semaphore only if positive */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
else /* Resource is not available */
|
||||
{
|
||||
curTCB = TCBRunning;
|
||||
if(timeout == 0) /* If time-out is not configured */
|
||||
{
|
||||
EventTaskToWait(pecb,curTCB); /* Block task until event occurs */
|
||||
pecb->eventCounter--;
|
||||
curTCB->pmail = Co_NULL;
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
else /* If time-out is configured */
|
||||
{
|
||||
/* Block task until event or timeout occurs */
|
||||
EventTaskToWait(pecb,curTCB);
|
||||
InsertDelayList(curTCB,timeout);
|
||||
|
||||
OsSchedUnlock();
|
||||
if (curTCB->pmail == Co_NULL) /* If pmail is Co_NULL, time-out occurred*/
|
||||
{
|
||||
return E_TIMEOUT;
|
||||
}
|
||||
else /* Event occurred or event have been deleted*/
|
||||
{
|
||||
OsSchedLock();
|
||||
curTCB->pmail = Co_NULL;
|
||||
pecb->eventCounter--;
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a semaphore
|
||||
* @param[in] id id of event control block associated with the desired semaphore.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Parameter id passed was invalid event ID.
|
||||
* @retval E_SEM_FULL Semaphore full.
|
||||
* @retval E_OK Semaphore had post successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to post a semaphore to corresponding event.
|
||||
*
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoPostSem(OS_EventID id)
|
||||
{
|
||||
P_ECB pecb;
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(id >= CFG_MAX_EVENT)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
pecb = &EventTbl[id];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(pecb->eventType != EVENT_TYPE_SEM) /* Invalid event control block type */
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Make sure semaphore will not overflow */
|
||||
if(pecb->eventCounter == pecb->initialEventCounter)
|
||||
{
|
||||
return E_SEM_FULL; /* The counter of Semaphore reach the max number*/
|
||||
}
|
||||
OsSchedLock();
|
||||
pecb->eventCounter++; /* Increment semaphore count to register event */
|
||||
EventTaskToRdy(pecb); /* Check semaphore event waiting list */
|
||||
OsSchedUnlock();
|
||||
return E_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Post a semaphore in ISR
|
||||
* @param[in] id identifier of event control block associated with the
|
||||
* desired semaphore.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Parameter id passed was invalid event ID.
|
||||
* @retval E_NO_TASK_WAITTING There are one more tasks waitting for the event.
|
||||
* @retval E_OK Semaphore had signaled successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in ISR to post a semaphore to corresponding
|
||||
* event.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
StatusType isr_PostSem(OS_EventID id)
|
||||
{
|
||||
if(OSSchedLock > 0) /* If scheduler is locked,(the caller is ISR) */
|
||||
{
|
||||
/* Initiate a post service handling request */
|
||||
if(InsertInSRQ(SEM_REQ,id,Co_NULL) == Co_FALSE)
|
||||
{
|
||||
return E_SEV_REQ_FULL; /* If service request queue is full */
|
||||
}
|
||||
else /* Operate successfully */
|
||||
{
|
||||
return E_OK;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return(CoPostSem(id)); /* Post semaphore */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+188
-165
@@ -1,165 +1,188 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file serviceReq.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief servive request management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if (CFG_TASK_WAITTING_EN > 0) || (CFG_TMR_EN >0)
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
SRQ ServiceReq = {0,0}; /*!< ISR server request queue */
|
||||
#endif
|
||||
BOOL IsrReq = Co_FALSE;
|
||||
#if (CFG_TASK_WAITTING_EN > 0)
|
||||
BOOL TimeReq = Co_FALSE; /*!< Time delay dispose request */
|
||||
#endif
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
BOOL TimerReq = Co_FALSE; /*!< Timer dispose request */
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert into service requst queue
|
||||
* @param[in] type Service request type.
|
||||
* @param[in] id Service request event id,event id/flag id.
|
||||
* @param[in] arg Service request argument.
|
||||
* @param[out] None
|
||||
*
|
||||
* @retval Co_FALSE Successfully insert into service request queue.
|
||||
* @retval Co_TRUE Failure to insert into service request queue.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function be called to insert a requst into service request
|
||||
* queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if (CFG_MAX_SERVICE_REQUEST > 0)
|
||||
BOOL InsertInSRQ(U8 type,U8 id,void* arg)
|
||||
{
|
||||
P_SQC pcell;
|
||||
U8 cnt;
|
||||
U8 heed;
|
||||
IRQ_DISABLE_SAVE();
|
||||
if (ServiceReq.cnt >= CFG_MAX_SERVICE_REQUEST)
|
||||
{
|
||||
IRQ_ENABLE_RESTORE ();
|
||||
|
||||
return Co_FALSE; /* Error return */
|
||||
}
|
||||
cnt = Inc8(&ServiceReq.cnt);
|
||||
heed = ServiceReq.head;
|
||||
IsrReq = Co_TRUE;
|
||||
pcell = &ServiceReq.cell[((cnt+heed)%CFG_MAX_SERVICE_REQUEST)];/*the tail */
|
||||
pcell->type = type; /* Save service request type, */
|
||||
pcell->id = id; /* event id */
|
||||
pcell->arg = arg; /* and parameter */
|
||||
IRQ_ENABLE_RESTORE ();
|
||||
|
||||
return Co_TRUE; /* Return OK */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Respond the request in the service request queue.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function be called to respond the request in the service
|
||||
* request queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RespondSRQ(void)
|
||||
{
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
SQC cell;
|
||||
|
||||
#endif
|
||||
|
||||
#if (CFG_TASK_WAITTING_EN > 0)
|
||||
if(TimeReq == Co_TRUE) /* Time delay request? */
|
||||
{
|
||||
TimeDispose(); /* Yes,call handler */
|
||||
TimeReq = Co_FALSE; /* Reset time delay request Co_FALSE */
|
||||
}
|
||||
#endif
|
||||
#if CFG_TMR_EN > 0
|
||||
if(TimerReq == Co_TRUE) /* Timer request? */
|
||||
{
|
||||
TmrDispose(); /* Yes,call handler */
|
||||
TimerReq = Co_FALSE; /* Reset timer request Co_FALSE */
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
|
||||
while (ServiceReq.cnt != 0)
|
||||
{
|
||||
IRQ_DISABLE_SAVE (); /* need to protect the following */
|
||||
cell = ServiceReq.cell[ServiceReq.head]; /* extract one cell */
|
||||
ServiceReq.head = (ServiceReq.head + 1) % /* move head (pop) */
|
||||
CFG_MAX_SERVICE_REQUEST;
|
||||
ServiceReq.cnt--;
|
||||
IRQ_ENABLE_RESTORE (); /* now use the cell copy */
|
||||
|
||||
switch(cell.type) /* Judge service request type */
|
||||
{
|
||||
#if CFG_SEM_EN > 0
|
||||
case SEM_REQ: /* Semaphore post request,call handler*/
|
||||
CoPostSem(cell.id);
|
||||
break;
|
||||
#endif
|
||||
#if CFG_MAILBOX_EN > 0
|
||||
case MBOX_REQ: /* Mailbox post request,call handler */
|
||||
CoPostMail(cell.id, cell.arg);
|
||||
break;
|
||||
#endif
|
||||
#if CFG_FLAG_EN > 0
|
||||
case FLAG_REQ: /* Flag set request,call handler */
|
||||
CoSetFlag(cell.id);
|
||||
break;
|
||||
#endif
|
||||
#if CFG_QUEUE_EN > 0
|
||||
case QUEUE_REQ: /* Queue post request,call handler */
|
||||
CoPostQueueMail(cell.id, cell.arg);
|
||||
break;
|
||||
#endif
|
||||
default: /* Others,break */
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
IRQ_DISABLE_SAVE (); /* need to protect the following */
|
||||
|
||||
if (ServiceReq.cnt == 0) /* another item in the queue already? */
|
||||
{
|
||||
IsrReq = Co_FALSE; /* queue still empty here */
|
||||
}
|
||||
IRQ_ENABLE_RESTORE (); /* now it is done and return */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file serviceReq.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief servive request management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if (CFG_TASK_WAITTING_EN > 0) || (CFG_TMR_EN >0)
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
SRQ ServiceReq = {0,0}; /*!< ISR server request queue */
|
||||
#endif
|
||||
BOOL IsrReq = Co_FALSE;
|
||||
#if (CFG_TASK_WAITTING_EN > 0)
|
||||
BOOL TimeReq = Co_FALSE; /*!< Time delay dispose request */
|
||||
#endif
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
BOOL TimerReq = Co_FALSE; /*!< Timer dispose request */
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert into service requst queue
|
||||
* @param[in] type Service request type.
|
||||
* @param[in] id Service request event id,event id/flag id.
|
||||
* @param[in] arg Service request argument.
|
||||
* @param[out] None
|
||||
*
|
||||
* @retval Co_FALSE Successfully insert into service request queue.
|
||||
* @retval Co_TRUE Failure to insert into service request queue.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function be called to insert a requst into service request
|
||||
* queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if (CFG_MAX_SERVICE_REQUEST > 0)
|
||||
BOOL InsertInSRQ(U8 type,U8 id,void* arg)
|
||||
{
|
||||
P_SQC pcell;
|
||||
U8 cnt;
|
||||
U8 heed;
|
||||
IRQ_DISABLE_SAVE();
|
||||
if (ServiceReq.cnt >= CFG_MAX_SERVICE_REQUEST)
|
||||
{
|
||||
IRQ_ENABLE_RESTORE ();
|
||||
|
||||
return Co_FALSE; /* Error return */
|
||||
}
|
||||
cnt = Inc8(&ServiceReq.cnt);
|
||||
heed = ServiceReq.head;
|
||||
IsrReq = Co_TRUE;
|
||||
pcell = &ServiceReq.cell[((cnt+heed)%CFG_MAX_SERVICE_REQUEST)];/*the tail */
|
||||
pcell->type = type; /* Save service request type, */
|
||||
pcell->id = id; /* event id */
|
||||
pcell->arg = arg; /* and parameter */
|
||||
IRQ_ENABLE_RESTORE ();
|
||||
|
||||
return Co_TRUE; /* Return OK */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Respond the request in the service request queue.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function be called to respond the request in the service
|
||||
* request queue.
|
||||
* @note
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RespondSRQ(void)
|
||||
{
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
SQC cell;
|
||||
|
||||
#endif
|
||||
|
||||
#if (CFG_TASK_WAITTING_EN > 0)
|
||||
if(TimeReq == Co_TRUE) /* Time delay request? */
|
||||
{
|
||||
TimeDispose(); /* Yes,call handler */
|
||||
TimeReq = Co_FALSE; /* Reset time delay request Co_FALSE */
|
||||
}
|
||||
#endif
|
||||
#if CFG_TMR_EN > 0
|
||||
if(TimerReq == Co_TRUE) /* Timer request? */
|
||||
{
|
||||
TmrDispose(); /* Yes,call handler */
|
||||
TimerReq = Co_FALSE; /* Reset timer request Co_FALSE */
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_MAX_SERVICE_REQUEST > 0
|
||||
|
||||
while (ServiceReq.cnt != 0)
|
||||
{
|
||||
IRQ_DISABLE_SAVE (); /* need to protect the following */
|
||||
cell = ServiceReq.cell[ServiceReq.head]; /* extract one cell */
|
||||
ServiceReq.head = (ServiceReq.head + 1) % /* move head (pop) */
|
||||
CFG_MAX_SERVICE_REQUEST;
|
||||
ServiceReq.cnt--;
|
||||
IRQ_ENABLE_RESTORE (); /* now use the cell copy */
|
||||
|
||||
switch(cell.type) /* Judge service request type */
|
||||
{
|
||||
#if CFG_SEM_EN > 0
|
||||
case SEM_REQ: /* Semaphore post request,call handler*/
|
||||
CoPostSem(cell.id);
|
||||
break;
|
||||
#endif
|
||||
#if CFG_MAILBOX_EN > 0
|
||||
case MBOX_REQ: /* Mailbox post request,call handler */
|
||||
CoPostMail(cell.id, cell.arg);
|
||||
break;
|
||||
#endif
|
||||
#if CFG_FLAG_EN > 0
|
||||
case FLAG_REQ: /* Flag set request,call handler */
|
||||
CoSetFlag(cell.id);
|
||||
break;
|
||||
#endif
|
||||
#if CFG_QUEUE_EN > 0
|
||||
case QUEUE_REQ: /* Queue post request,call handler */
|
||||
CoPostQueueMail(cell.id, cell.arg);
|
||||
break;
|
||||
#endif
|
||||
default: /* Others,break */
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
IRQ_DISABLE_SAVE (); /* need to protect the following */
|
||||
|
||||
if (ServiceReq.cnt == 0) /* another item in the queue already? */
|
||||
{
|
||||
IsrReq = Co_FALSE; /* queue still empty here */
|
||||
}
|
||||
IRQ_ENABLE_RESTORE (); /* now it is done and return */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+1283
-1260
File diff suppressed because it is too large
Load Diff
+399
-376
@@ -1,376 +1,399 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file time.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief time management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_TASK_WAITTING_EN > 0
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
P_OSTCB DlyList = Co_NULL; /*!< Header pointer to the DELAY list.*/
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert into DELAY list
|
||||
*
|
||||
* @param[in] ptcb Task that want to insert into DELAY list.
|
||||
* @param[in] ticks Delay system ticks.
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to insert task into DELAY list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void InsertDelayList(P_OSTCB ptcb,U32 ticks)
|
||||
{
|
||||
S32 deltaTicks;
|
||||
P_OSTCB dlyNext;
|
||||
|
||||
if(ticks == 0) /* Is delay tick == 0? */
|
||||
return; /* Yes,do nothing,return */
|
||||
if(DlyList == Co_NULL) /* Is no item in DELAY list? */
|
||||
{
|
||||
ptcb->delayTick = ticks; /* Yes,set this as first item */
|
||||
DlyList = ptcb;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No,find correct place ,and insert the task */
|
||||
dlyNext = DlyList;
|
||||
deltaTicks = ticks; /* Get task delay ticks */
|
||||
|
||||
/* Find correct place */
|
||||
while(dlyNext != Co_NULL)
|
||||
{
|
||||
/* Get delta ticks with previous item */
|
||||
deltaTicks -= dlyNext->delayTick;
|
||||
if(deltaTicks < 0) /* Is delta ticks<0? */
|
||||
{
|
||||
/* Yes,get correct place */
|
||||
if(dlyNext->TCBprev != Co_NULL) /* Is head item of DELAY list? */
|
||||
{
|
||||
dlyNext->TCBprev->TCBnext = ptcb; /* No,insert into */
|
||||
ptcb->TCBprev = dlyNext->TCBprev;
|
||||
ptcb->TCBnext = dlyNext;
|
||||
dlyNext->TCBprev = ptcb;
|
||||
}
|
||||
else /* Yes,set task as first item */
|
||||
{
|
||||
ptcb->TCBnext = DlyList;
|
||||
DlyList->TCBprev = ptcb;
|
||||
DlyList = ptcb;
|
||||
}
|
||||
ptcb->delayTick = ptcb->TCBnext->delayTick+deltaTicks;
|
||||
ptcb->TCBnext->delayTick -= ptcb->delayTick;
|
||||
break;
|
||||
}
|
||||
/* Is last item in DELAY list? */
|
||||
else if((deltaTicks >= 0) && (dlyNext->TCBnext == Co_NULL) )
|
||||
{
|
||||
ptcb->TCBprev = dlyNext; /* Yes,insert into */
|
||||
dlyNext->TCBnext = ptcb;
|
||||
ptcb->delayTick = deltaTicks;
|
||||
break;
|
||||
}
|
||||
dlyNext = dlyNext->TCBnext; /* Get the next item in DELAY list */
|
||||
}
|
||||
}
|
||||
|
||||
ptcb->state = TASK_WAITING; /* Set task status as TASK_WAITING */
|
||||
TaskSchedReq = Co_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Remove from the DELAY list
|
||||
* @param[in] ptcb Task that want to remove from the DELAY list.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove task from the DELAY list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RemoveDelayList(P_OSTCB ptcb)
|
||||
{
|
||||
|
||||
/* Is there only one item in the DELAY list? */
|
||||
if((ptcb->TCBprev == Co_NULL) && ( ptcb->TCBnext == Co_NULL))
|
||||
{
|
||||
DlyList = Co_NULL; /* Yes,set DELAY list as Co_NULL */
|
||||
}
|
||||
else if(ptcb->TCBprev == Co_NULL) /* Is the first item in DELAY list? */
|
||||
{
|
||||
/* Yes,remove task from the DELAY list,and reset the list */
|
||||
DlyList = ptcb->TCBnext;
|
||||
ptcb->TCBnext->delayTick += ptcb->delayTick;
|
||||
ptcb->TCBnext->TCBprev = Co_NULL;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
|
||||
}
|
||||
else if(ptcb->TCBnext == Co_NULL) /* Is the last item in DELAY list? */
|
||||
{
|
||||
ptcb->TCBprev->TCBnext = Co_NULL; /* Yes,remove task form DELAY list */
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
}
|
||||
else /* No, remove task from DELAY list */
|
||||
{
|
||||
ptcb->TCBprev->TCBnext = ptcb->TCBnext;
|
||||
ptcb->TCBnext->TCBprev = ptcb->TCBprev;
|
||||
ptcb->TCBnext->delayTick += ptcb->delayTick;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
}
|
||||
ptcb->delayTick = INVALID_VALUE; /* Set task delay tick value as invalid */
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get current ticks
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval Return current system tick counter.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to obtain current system tick counter.
|
||||
*******************************************************************************
|
||||
*/
|
||||
U64 CoGetOSTime(void)
|
||||
{
|
||||
return OSTickCnt; /* Get system time(tick) */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delay current task for specify ticks number
|
||||
* @param[in] ticks Specify system tick number which will delay.
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_OK The current task was insert to DELAY list successful,it
|
||||
* will delay specify time.
|
||||
* @par Description
|
||||
* @details This function delay specify ticks for current task.
|
||||
*
|
||||
* @note This function be called in ISR,do nothing and return immediately.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoTickDelay(U32 ticks)
|
||||
{
|
||||
if(OSIntNesting >0) /* Is call in ISR? */
|
||||
{
|
||||
return E_CALL; /* Yes,error return */
|
||||
}
|
||||
|
||||
if(ticks == INVALID_VALUE) /* Is tick==INVALID_VALUE? */
|
||||
{
|
||||
return E_INVALID_PARAMETER; /* Yes,error return */
|
||||
}
|
||||
if(ticks == 0) /* Is tick==0? */
|
||||
{
|
||||
return E_OK; /* Yes,do nothing ,return OK */
|
||||
}
|
||||
if(OSSchedLock != 0) /* Is OS lock? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
InsertDelayList(TCBRunning,ticks); /* Insert task in DELAY list */
|
||||
OsSchedUnlock(); /* Unlock schedule,and call task schedule */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Reset task delay ticks
|
||||
* @param[in] ptcb Task that want to insert into DELAY list.
|
||||
* @param[in] ticks Specify system tick number which will delay .
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_INVALID_ID Invalid task id.
|
||||
* @retval E_NOT_IN_DELAY_LIST Task not in delay list.
|
||||
* @retval E_OK The current task was inserted to DELAY list
|
||||
* successful,it will delay for specify time.
|
||||
* @par Description
|
||||
* @details This function delay specify ticks for current task.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoResetTaskDelayTick(OS_TID taskID,U32 ticks)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(taskID >= CFG_MAX_USER_TASKS + SYS_TASK_NUM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
ptcb = &TCBTbl[taskID];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(ptcb->stkPtr == Co_NULL)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(ptcb->delayTick == INVALID_VALUE) /* Is tick==INVALID_VALUE? */
|
||||
{
|
||||
return E_NOT_IN_DELAY_LIST; /* Yes,error return */
|
||||
}
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
RemoveDelayList(ptcb); /* Remove task from the DELAY list */
|
||||
|
||||
if(ticks == 0) /* Is delay tick==0? */
|
||||
{
|
||||
InsertToTCBRdyList(ptcb); /* Insert task into the DELAY list */
|
||||
}
|
||||
else
|
||||
{
|
||||
InsertDelayList(ptcb,ticks); /* No,insert task into DELAY list */
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule,and call task schedule */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delay current task for detail time
|
||||
* @param[in] hour Specify the number of hours.
|
||||
* @param[in] minute Specify the number of minutes.
|
||||
* @param[in] sec Specify the number of seconds.
|
||||
* @param[in] millsec Specify the number of millseconds.
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_INVALID_PARAMETER Parameter passed was invalid,delay fail.
|
||||
* @retval E_OK The current task was inserted to DELAY list
|
||||
* successful,it will delay for specify time.
|
||||
* @par Description
|
||||
* @details This function delay specify time for current task.
|
||||
*
|
||||
* @note If this function called in ISR,do nothing and return immediately.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_TIME_DELAY_EN >0
|
||||
StatusType CoTimeDelay(U8 hour,U8 minute,U8 sec,U16 millsec)
|
||||
{
|
||||
U32 ticks;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(OSIntNesting > 0)
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
if((minute > 59)||(sec > 59)||(millsec > 999))
|
||||
return E_INVALID_PARAMETER;
|
||||
#endif
|
||||
if(OSSchedLock != 0) /* Is OS lock? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
|
||||
/* Get tick counter from time */
|
||||
ticks = ((hour*3600) + (minute*60) + (sec)) * (CFG_SYSTICK_FREQ)\
|
||||
+ (millsec*CFG_SYSTICK_FREQ + 500)/1000;
|
||||
|
||||
CoTickDelay(ticks); /* Call tick delay */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Dispose time delay
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to dispose time delay of all task.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void TimeDispose(void)
|
||||
{
|
||||
P_OSTCB dlyList;
|
||||
|
||||
dlyList = DlyList; /* Get first item of DELAY list */
|
||||
while((dlyList != Co_NULL) && (dlyList->delayTick == 0) )
|
||||
{
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
if(dlyList->eventID != INVALID_ID) /* Is task in event waiting list? */
|
||||
{
|
||||
RemoveEventWaittingList(dlyList); /* Yes,remove task from list */
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_FLAG_EN > 0
|
||||
if(dlyList->pnode != Co_NULL) /* Is task in flag waiting list? */
|
||||
{
|
||||
RemoveLinkNode(dlyList->pnode); /* Yes,remove task from list */
|
||||
}
|
||||
#endif
|
||||
dlyList->delayTick = INVALID_VALUE; /* Set delay tick value as invalid*/
|
||||
DlyList = dlyList->TCBnext; /* Get next item as the head of DELAY list*/
|
||||
dlyList->TCBnext = Co_NULL;
|
||||
|
||||
InsertToTCBRdyList(dlyList); /* Insert task into READY list */
|
||||
|
||||
dlyList = DlyList; /* Get the first item of DELAY list */
|
||||
if(dlyList != Co_NULL) /* Is DELAY list as Co_NULL? */
|
||||
{
|
||||
dlyList->TCBprev = Co_NULL; /* No,initialize the first item */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Dispose time delay in ISR
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in systick interrupt to dispose time delay
|
||||
* of all task.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void isr_TimeDispose(void)
|
||||
{
|
||||
if(OSSchedLock > 1) /* Is schedule lock? */
|
||||
{
|
||||
IsrReq = Co_TRUE;
|
||||
TimeReq = Co_TRUE; /* Yes,set time request Co_TRUE */
|
||||
}
|
||||
else
|
||||
{
|
||||
TimeDispose(); /* No,call handler */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file time.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief time management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_TASK_WAITTING_EN > 0
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
P_OSTCB DlyList = Co_NULL; /*!< Header pointer to the DELAY list.*/
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert into DELAY list
|
||||
*
|
||||
* @param[in] ptcb Task that want to insert into DELAY list.
|
||||
* @param[in] ticks Delay system ticks.
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to insert task into DELAY list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void InsertDelayList(P_OSTCB ptcb,U32 ticks)
|
||||
{
|
||||
S32 deltaTicks;
|
||||
P_OSTCB dlyNext;
|
||||
|
||||
if(ticks == 0) /* Is delay tick == 0? */
|
||||
return; /* Yes,do nothing,return */
|
||||
if(DlyList == Co_NULL) /* Is no item in DELAY list? */
|
||||
{
|
||||
ptcb->delayTick = ticks; /* Yes,set this as first item */
|
||||
DlyList = ptcb;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No,find correct place ,and insert the task */
|
||||
dlyNext = DlyList;
|
||||
deltaTicks = ticks; /* Get task delay ticks */
|
||||
|
||||
/* Find correct place */
|
||||
while(dlyNext != Co_NULL)
|
||||
{
|
||||
/* Get delta ticks with previous item */
|
||||
deltaTicks -= dlyNext->delayTick;
|
||||
if(deltaTicks < 0) /* Is delta ticks<0? */
|
||||
{
|
||||
/* Yes,get correct place */
|
||||
if(dlyNext->TCBprev != Co_NULL) /* Is head item of DELAY list? */
|
||||
{
|
||||
dlyNext->TCBprev->TCBnext = ptcb; /* No,insert into */
|
||||
ptcb->TCBprev = dlyNext->TCBprev;
|
||||
ptcb->TCBnext = dlyNext;
|
||||
dlyNext->TCBprev = ptcb;
|
||||
}
|
||||
else /* Yes,set task as first item */
|
||||
{
|
||||
ptcb->TCBnext = DlyList;
|
||||
DlyList->TCBprev = ptcb;
|
||||
DlyList = ptcb;
|
||||
}
|
||||
ptcb->delayTick = ptcb->TCBnext->delayTick+deltaTicks;
|
||||
ptcb->TCBnext->delayTick -= ptcb->delayTick;
|
||||
break;
|
||||
}
|
||||
/* Is last item in DELAY list? */
|
||||
else if((deltaTicks >= 0) && (dlyNext->TCBnext == Co_NULL) )
|
||||
{
|
||||
ptcb->TCBprev = dlyNext; /* Yes,insert into */
|
||||
dlyNext->TCBnext = ptcb;
|
||||
ptcb->delayTick = deltaTicks;
|
||||
break;
|
||||
}
|
||||
dlyNext = dlyNext->TCBnext; /* Get the next item in DELAY list */
|
||||
}
|
||||
}
|
||||
|
||||
ptcb->state = TASK_WAITING; /* Set task status as TASK_WAITING */
|
||||
TaskSchedReq = Co_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Remove from the DELAY list
|
||||
* @param[in] ptcb Task that want to remove from the DELAY list.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove task from the DELAY list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void RemoveDelayList(P_OSTCB ptcb)
|
||||
{
|
||||
|
||||
/* Is there only one item in the DELAY list? */
|
||||
if((ptcb->TCBprev == Co_NULL) && ( ptcb->TCBnext == Co_NULL))
|
||||
{
|
||||
DlyList = Co_NULL; /* Yes,set DELAY list as Co_NULL */
|
||||
}
|
||||
else if(ptcb->TCBprev == Co_NULL) /* Is the first item in DELAY list? */
|
||||
{
|
||||
/* Yes,remove task from the DELAY list,and reset the list */
|
||||
DlyList = ptcb->TCBnext;
|
||||
ptcb->TCBnext->delayTick += ptcb->delayTick;
|
||||
ptcb->TCBnext->TCBprev = Co_NULL;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
|
||||
}
|
||||
else if(ptcb->TCBnext == Co_NULL) /* Is the last item in DELAY list? */
|
||||
{
|
||||
ptcb->TCBprev->TCBnext = Co_NULL; /* Yes,remove task form DELAY list */
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
}
|
||||
else /* No, remove task from DELAY list */
|
||||
{
|
||||
ptcb->TCBprev->TCBnext = ptcb->TCBnext;
|
||||
ptcb->TCBnext->TCBprev = ptcb->TCBprev;
|
||||
ptcb->TCBnext->delayTick += ptcb->delayTick;
|
||||
ptcb->TCBnext = Co_NULL;
|
||||
ptcb->TCBprev = Co_NULL;
|
||||
}
|
||||
ptcb->delayTick = INVALID_VALUE; /* Set task delay tick value as invalid */
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get current ticks
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval Return current system tick counter.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to obtain current system tick counter.
|
||||
*******************************************************************************
|
||||
*/
|
||||
U64 CoGetOSTime(void)
|
||||
{
|
||||
return OSTickCnt; /* Get system time(tick) */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delay current task for specify ticks number
|
||||
* @param[in] ticks Specify system tick number which will delay.
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_OK The current task was insert to DELAY list successful,it
|
||||
* will delay specify time.
|
||||
* @par Description
|
||||
* @details This function delay specify ticks for current task.
|
||||
*
|
||||
* @note This function be called in ISR,do nothing and return immediately.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoTickDelay(U32 ticks)
|
||||
{
|
||||
if(OSIntNesting >0) /* Is call in ISR? */
|
||||
{
|
||||
return E_CALL; /* Yes,error return */
|
||||
}
|
||||
|
||||
if(ticks == INVALID_VALUE) /* Is tick==INVALID_VALUE? */
|
||||
{
|
||||
return E_INVALID_PARAMETER; /* Yes,error return */
|
||||
}
|
||||
if(ticks == 0) /* Is tick==0? */
|
||||
{
|
||||
return E_OK; /* Yes,do nothing ,return OK */
|
||||
}
|
||||
if(OSSchedLock != 0) /* Is OS lock? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
InsertDelayList(TCBRunning,ticks); /* Insert task in DELAY list */
|
||||
OsSchedUnlock(); /* Unlock schedule,and call task schedule */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Reset task delay ticks
|
||||
* @param[in] ptcb Task that want to insert into DELAY list.
|
||||
* @param[in] ticks Specify system tick number which will delay .
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_INVALID_ID Invalid task id.
|
||||
* @retval E_NOT_IN_DELAY_LIST Task not in delay list.
|
||||
* @retval E_OK The current task was inserted to DELAY list
|
||||
* successful,it will delay for specify time.
|
||||
* @par Description
|
||||
* @details This function delay specify ticks for current task.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoResetTaskDelayTick(OS_TID taskID,U32 ticks)
|
||||
{
|
||||
P_OSTCB ptcb;
|
||||
|
||||
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(taskID >= CFG_MAX_USER_TASKS + SYS_TASK_NUM)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
ptcb = &TCBTbl[taskID];
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
if(ptcb->stkPtr == Co_NULL)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(ptcb->delayTick == INVALID_VALUE) /* Is tick==INVALID_VALUE? */
|
||||
{
|
||||
return E_NOT_IN_DELAY_LIST; /* Yes,error return */
|
||||
}
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
RemoveDelayList(ptcb); /* Remove task from the DELAY list */
|
||||
|
||||
if(ticks == 0) /* Is delay tick==0? */
|
||||
{
|
||||
InsertToTCBRdyList(ptcb); /* Insert task into the DELAY list */
|
||||
}
|
||||
else
|
||||
{
|
||||
InsertDelayList(ptcb,ticks); /* No,insert task into DELAY list */
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule,and call task schedule */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delay current task for detail time
|
||||
* @param[in] hour Specify the number of hours.
|
||||
* @param[in] minute Specify the number of minutes.
|
||||
* @param[in] sec Specify the number of seconds.
|
||||
* @param[in] millsec Specify the number of millseconds.
|
||||
* @param[out] None
|
||||
* @retval E_CALL Error call in ISR.
|
||||
* @retval E_INVALID_PARAMETER Parameter passed was invalid,delay fail.
|
||||
* @retval E_OK The current task was inserted to DELAY list
|
||||
* successful,it will delay for specify time.
|
||||
* @par Description
|
||||
* @details This function delay specify time for current task.
|
||||
*
|
||||
* @note If this function called in ISR,do nothing and return immediately.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_TIME_DELAY_EN >0
|
||||
StatusType CoTimeDelay(U8 hour,U8 minute,U8 sec,U16 millsec)
|
||||
{
|
||||
U32 ticks;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(OSIntNesting > 0)
|
||||
{
|
||||
return E_CALL;
|
||||
}
|
||||
if((minute > 59)||(sec > 59)||(millsec > 999))
|
||||
return E_INVALID_PARAMETER;
|
||||
#endif
|
||||
if(OSSchedLock != 0) /* Is OS lock? */
|
||||
{
|
||||
return E_OS_IN_LOCK; /* Yes,error return */
|
||||
}
|
||||
|
||||
/* Get tick counter from time */
|
||||
ticks = ((hour*3600) + (minute*60) + (sec)) * (CFG_SYSTICK_FREQ)\
|
||||
+ (millsec*CFG_SYSTICK_FREQ + 500)/1000;
|
||||
|
||||
CoTickDelay(ticks); /* Call tick delay */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Dispose time delay
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to dispose time delay of all task.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void TimeDispose(void)
|
||||
{
|
||||
P_OSTCB dlyList;
|
||||
|
||||
dlyList = DlyList; /* Get first item of DELAY list */
|
||||
while((dlyList != Co_NULL) && (dlyList->delayTick == 0) )
|
||||
{
|
||||
|
||||
#if CFG_EVENT_EN > 0
|
||||
if(dlyList->eventID != INVALID_ID) /* Is task in event waiting list? */
|
||||
{
|
||||
RemoveEventWaittingList(dlyList); /* Yes,remove task from list */
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_FLAG_EN > 0
|
||||
if(dlyList->pnode != Co_NULL) /* Is task in flag waiting list? */
|
||||
{
|
||||
RemoveLinkNode(dlyList->pnode); /* Yes,remove task from list */
|
||||
}
|
||||
#endif
|
||||
dlyList->delayTick = INVALID_VALUE; /* Set delay tick value as invalid*/
|
||||
DlyList = dlyList->TCBnext; /* Get next item as the head of DELAY list*/
|
||||
dlyList->TCBnext = Co_NULL;
|
||||
|
||||
InsertToTCBRdyList(dlyList); /* Insert task into READY list */
|
||||
|
||||
dlyList = DlyList; /* Get the first item of DELAY list */
|
||||
if(dlyList != Co_NULL) /* Is DELAY list as Co_NULL? */
|
||||
{
|
||||
dlyList->TCBprev = Co_NULL; /* No,initialize the first item */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Dispose time delay in ISR
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called in systick interrupt to dispose time delay
|
||||
* of all task.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void isr_TimeDispose(void)
|
||||
{
|
||||
if(OSSchedLock > 1) /* Is schedule lock? */
|
||||
{
|
||||
IsrReq = Co_TRUE;
|
||||
TimeReq = Co_TRUE; /* Yes,set time request Co_TRUE */
|
||||
}
|
||||
else
|
||||
{
|
||||
TimeDispose(); /* No,call handler */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+470
-447
@@ -1,447 +1,470 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file timer.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief timer management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
#if CFG_TMR_EN > 0
|
||||
|
||||
TmrCtrl TmrTbl[CFG_MAX_TMR]= {{0}};/*!< Table which save timer control block.*/
|
||||
P_TmrCtrl TmrList = Co_NULL; /*!< The header of the TmrCtrl list. */
|
||||
U32 TmrIDVessel = 0; /*!< Timer ID container. */
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert a timer into the timer list
|
||||
* @param[in] tmrID Specify timer ID which insertted.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Timer ID passed was invalid,insert fail.
|
||||
* @retval E_OK Insert successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to insert a timer into the timer list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static void InsertTmrList(OS_TCID tmrID)
|
||||
{
|
||||
P_TmrCtrl pTmr;
|
||||
S32 deltaTicks;
|
||||
U32 tmrCnt;
|
||||
tmrCnt = TmrTbl[tmrID].tmrCnt; /* Get timer time */
|
||||
|
||||
if(tmrCnt == 0) /* Is timer time==0? */
|
||||
{
|
||||
return; /* Do nothing,return */
|
||||
}
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
if(TmrList == Co_NULL) /* Is no item in timer list? */
|
||||
{
|
||||
TmrList = &TmrTbl[tmrID]; /* Yes,set this as first item */
|
||||
}
|
||||
else /* No,find correct place ,and insert inserted timer */
|
||||
{
|
||||
pTmr = TmrList;
|
||||
deltaTicks = tmrCnt; /* Get timer tick */
|
||||
|
||||
/* find correct place */
|
||||
while(pTmr != Co_NULL)
|
||||
{
|
||||
deltaTicks -= pTmr->tmrCnt; /* Get ticks with previous item */
|
||||
if(deltaTicks < 0) /* Is delta ticks<0? */
|
||||
{
|
||||
/* Yes,get correct place */
|
||||
if(pTmr->tmrPrev!= Co_NULL)/* Is head item of timer list? */
|
||||
{
|
||||
/* No,insert into */
|
||||
pTmr->tmrPrev->tmrNext = &TmrTbl[tmrID];
|
||||
TmrTbl[tmrID].tmrPrev = pTmr->tmrPrev;
|
||||
TmrTbl[tmrID].tmrNext = pTmr;
|
||||
pTmr->tmrPrev = &TmrTbl[tmrID];
|
||||
}
|
||||
else /* Yes,set task as first item */
|
||||
{
|
||||
TmrTbl[tmrID].tmrNext = TmrList;
|
||||
TmrList->tmrPrev = &TmrTbl[tmrID];
|
||||
TmrList = &TmrTbl[tmrID];
|
||||
}
|
||||
TmrTbl[tmrID].tmrCnt = TmrTbl[tmrID].tmrNext->tmrCnt+deltaTicks;
|
||||
TmrTbl[tmrID].tmrNext->tmrCnt -= TmrTbl[tmrID].tmrCnt;
|
||||
break;
|
||||
}
|
||||
/* Is last item in list? */
|
||||
else if((deltaTicks >= 0) && (pTmr->tmrNext == Co_NULL))
|
||||
{
|
||||
/* Yes,insert into */
|
||||
TmrTbl[tmrID].tmrPrev = pTmr;
|
||||
pTmr->tmrNext = &TmrTbl[tmrID];
|
||||
TmrTbl[tmrID].tmrCnt = deltaTicks;
|
||||
break;
|
||||
}
|
||||
pTmr = pTmr->tmrNext; /* Get the next item in timer list */
|
||||
}
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Remove a timer from the timer list
|
||||
* @param[in] tmrID Specify ID for a timer which removed form timer list.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove a timer from the timer list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static void RemoveTmrList(OS_TCID tmrID)
|
||||
{
|
||||
P_TmrCtrl pTmr;
|
||||
|
||||
pTmr = &TmrTbl[tmrID];
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
|
||||
/* Is there only one item in timer list? */
|
||||
if((pTmr->tmrPrev == Co_NULL) && (pTmr->tmrNext == Co_NULL))
|
||||
{
|
||||
TmrList = Co_NULL; /* Yes,set timer list as Co_NULL */
|
||||
}
|
||||
else if(pTmr->tmrPrev == Co_NULL) /* Is the first item in timer list? */
|
||||
{ /* Yes,remove timer from list,and reset timer list */
|
||||
TmrList = pTmr->tmrNext;
|
||||
TmrList->tmrPrev = Co_NULL;
|
||||
pTmr->tmrNext->tmrCnt += pTmr->tmrCnt;
|
||||
pTmr->tmrNext = Co_NULL;
|
||||
}
|
||||
else if(pTmr->tmrNext == Co_NULL) /* Is the last item in timer list? */
|
||||
{
|
||||
/* Yes,remove timer form list */
|
||||
pTmr->tmrPrev->tmrNext = Co_NULL;
|
||||
pTmr->tmrPrev = Co_NULL;
|
||||
}
|
||||
else /* No, remove timer from list */
|
||||
{
|
||||
pTmr->tmrPrev->tmrNext = pTmr->tmrNext;
|
||||
pTmr->tmrNext->tmrPrev = pTmr->tmrPrev;
|
||||
pTmr->tmrNext->tmrCnt += pTmr->tmrCnt;
|
||||
pTmr->tmrNext = Co_NULL;
|
||||
pTmr->tmrPrev = Co_NULL;
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a timer
|
||||
* @param[in] tmrType Specify timer's type.
|
||||
* @param[in] tmrCnt Specify timer initial counter value.
|
||||
* @param[in] tmrReload Specify timer reload value.
|
||||
* @param[in] func Specify timer callback function entry.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create timer fail.
|
||||
* @retval others Create timer successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a timer.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_TCID CoCreateTmr(U8 tmrType, U32 tmrCnt, U32 tmrReload, vFUNCPtr func)
|
||||
{
|
||||
U8 i;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if((tmrType != TMR_TYPE_ONE_SHOT) && (tmrType != TMR_TYPE_PERIODIC))
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if(func == Co_NULL)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
for(i = 0; i < CFG_MAX_TMR; i++)
|
||||
{
|
||||
if((TmrIDVessel & (1 << i)) == 0) /* Is free timer ID? */
|
||||
{
|
||||
TmrIDVessel |= (1<<i); /* Yes,assign ID to this timer */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
TmrTbl[i].tmrID = i; /* Initialize timer as user set */
|
||||
TmrTbl[i].tmrType = tmrType;
|
||||
TmrTbl[i].tmrState = TMR_STATE_STOPPED;
|
||||
TmrTbl[i].tmrCnt = tmrCnt;
|
||||
TmrTbl[i].tmrReload = tmrReload;
|
||||
TmrTbl[i].tmrCallBack = func;
|
||||
TmrTbl[i].tmrPrev = Co_NULL;
|
||||
TmrTbl[i].tmrNext = Co_NULL;
|
||||
return i; /* Return timer ID */
|
||||
}
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return E_CREATE_FAIL; /* Error return */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Start counter
|
||||
* @param[in] tmrID Specify a timer which startted.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The timer id passed was invalid,can't start timer
|
||||
* @retval E_OK Insert a timer to timer list and start it successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to make a timer start countering.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoStartTmr(OS_TCID tmrID)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( (TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_RUNNING) /* Is timer running? */
|
||||
{
|
||||
return E_OK; /* Yes,do nothing,return OK */
|
||||
}
|
||||
|
||||
/* No,set timer status as TMR_STATE_RUNNING */
|
||||
TmrTbl[tmrID].tmrState = TMR_STATE_RUNNING;
|
||||
InsertTmrList(tmrID); /* Insert this timer into timer list */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Stop countering for a spcify timer
|
||||
* @param[in] tmrID Specify a timer which stopped.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The timer id passed was invalid, stop failure.
|
||||
* @retval E_OK Stop a timer countering successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to stop a timer from counting.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoStopTmr(OS_TCID tmrID)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if((TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_STOPPED)/* Does timer stop running?*/
|
||||
{
|
||||
return E_OK; /* Yes,do nothing,return OK */
|
||||
}
|
||||
RemoveTmrList(tmrID); /* No,remove this timer from timer list */
|
||||
|
||||
/* Set timer status as TMR_STATE_STOPPED */
|
||||
TmrTbl[tmrID].tmrState = TMR_STATE_STOPPED;
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a timer
|
||||
* @param[in] tmrID Specify a timer which deleted.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The timer id passed was invalid,deleted failure.
|
||||
* @retval E_OK Delete a timer successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a timer which created before.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelTmr(OS_TCID tmrID)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( (TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_RUNNING) /* Is timer running? */
|
||||
{
|
||||
RemoveTmrList(tmrID); /* Yes,remove this timer from timer list*/
|
||||
}
|
||||
TmrIDVessel &=~(1<<tmrID); /* Release resource that this timer hold*/
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get current counter of specify timer
|
||||
* @param[in] tmrID Specify timer by ID.
|
||||
* @param[out] E_INVALID_ID Invalid ID was passed and get counter failure.
|
||||
* @param[out] E_OK Get current counter successful.
|
||||
* @retval Current counter of a timer which specify by id.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to obtain current counter of specify timer.
|
||||
*******************************************************************************
|
||||
*/
|
||||
U32 CoGetCurTmrCnt(OS_TCID tmrID,StatusType* perr)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return 0;
|
||||
}
|
||||
if((TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
*perr = E_OK;
|
||||
return TmrTbl[tmrID].tmrCnt; /* Return timer counter */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Setting for a specify timer
|
||||
* @param[in] tmrID Specify timer by ID.
|
||||
* @param[in] tmrCnt Specify timer counter which need to be set.
|
||||
* @param[in] tmrReload Specify timer reload value which need to be set.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The ID passed was invalid,set fail.
|
||||
* @retval E_OK Set timer counter successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to set timer counter and reload value.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoSetTmrCnt(OS_TCID tmrID,U32 tmrCnt,U32 tmrReload)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( (TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
TmrTbl[tmrID].tmrCnt = tmrCnt; /* Reset timer counter and reload value */
|
||||
TmrTbl[tmrID].tmrReload = tmrReload;
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_RUNNING) /* Is timer running? */
|
||||
{
|
||||
RemoveTmrList(tmrID); /* Yes,reorder timer in timer list */
|
||||
InsertTmrList(tmrID);
|
||||
}
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Timer counter dispose
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to dispose timer counter.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void TmrDispose(void)
|
||||
{
|
||||
P_TmrCtrl pTmr;
|
||||
|
||||
pTmr = TmrList; /* Get first item of timer list */
|
||||
while((pTmr != Co_NULL) && (pTmr->tmrCnt == 0) )
|
||||
{
|
||||
if(pTmr->tmrType == TMR_TYPE_ONE_SHOT) /* Is a One-shot timer? */
|
||||
{
|
||||
/* Yes,remove this timer from timer list */
|
||||
RemoveTmrList(pTmr->tmrID);
|
||||
|
||||
/* Set timer status as TMR_STATE_STOPPED */
|
||||
pTmr->tmrState = TMR_STATE_STOPPED;
|
||||
(pTmr->tmrCallBack)(); /* Call timer callback function */
|
||||
}
|
||||
else if(pTmr->tmrType == TMR_TYPE_PERIODIC) /* Is a periodic timer? */
|
||||
{
|
||||
/* Yes,remove this timer from timer list */
|
||||
RemoveTmrList(pTmr->tmrID);
|
||||
pTmr->tmrCnt = pTmr->tmrReload; /* Reset timer tick */
|
||||
InsertTmrList(pTmr->tmrID); /* Insert timer into timer list */
|
||||
(pTmr->tmrCallBack)(); /* Call timer callback function */
|
||||
}
|
||||
pTmr = TmrList; /* Get first item of timer list */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Timer counter dispose in ISR
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to dispose timer counter.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void isr_TmrDispose(void)
|
||||
{
|
||||
if(OSSchedLock > 1) /* Is schedule lock? */
|
||||
{
|
||||
IsrReq = Co_TRUE;
|
||||
TimerReq = Co_TRUE; /* Yes,set timer request true */
|
||||
}
|
||||
else
|
||||
{
|
||||
TmrDispose(); /* No,call handler */
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file timer.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief timer management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
/*---------------------------- Variable Define -------------------------------*/
|
||||
#if CFG_TMR_EN > 0
|
||||
|
||||
TmrCtrl TmrTbl[CFG_MAX_TMR]= {{0}};/*!< Table which save timer control block.*/
|
||||
P_TmrCtrl TmrList = Co_NULL; /*!< The header of the TmrCtrl list. */
|
||||
U32 TmrIDVessel = 0; /*!< Timer ID container. */
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Insert a timer into the timer list
|
||||
* @param[in] tmrID Specify timer ID which insertted.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID Timer ID passed was invalid,insert fail.
|
||||
* @retval E_OK Insert successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to insert a timer into the timer list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static void InsertTmrList(OS_TCID tmrID)
|
||||
{
|
||||
P_TmrCtrl pTmr;
|
||||
S32 deltaTicks;
|
||||
U32 tmrCnt;
|
||||
tmrCnt = TmrTbl[tmrID].tmrCnt; /* Get timer time */
|
||||
|
||||
if(tmrCnt == 0) /* Is timer time==0? */
|
||||
{
|
||||
return; /* Do nothing,return */
|
||||
}
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
if(TmrList == Co_NULL) /* Is no item in timer list? */
|
||||
{
|
||||
TmrList = &TmrTbl[tmrID]; /* Yes,set this as first item */
|
||||
}
|
||||
else /* No,find correct place ,and insert inserted timer */
|
||||
{
|
||||
pTmr = TmrList;
|
||||
deltaTicks = tmrCnt; /* Get timer tick */
|
||||
|
||||
/* find correct place */
|
||||
while(pTmr != Co_NULL)
|
||||
{
|
||||
deltaTicks -= pTmr->tmrCnt; /* Get ticks with previous item */
|
||||
if(deltaTicks < 0) /* Is delta ticks<0? */
|
||||
{
|
||||
/* Yes,get correct place */
|
||||
if(pTmr->tmrPrev!= Co_NULL)/* Is head item of timer list? */
|
||||
{
|
||||
/* No,insert into */
|
||||
pTmr->tmrPrev->tmrNext = &TmrTbl[tmrID];
|
||||
TmrTbl[tmrID].tmrPrev = pTmr->tmrPrev;
|
||||
TmrTbl[tmrID].tmrNext = pTmr;
|
||||
pTmr->tmrPrev = &TmrTbl[tmrID];
|
||||
}
|
||||
else /* Yes,set task as first item */
|
||||
{
|
||||
TmrTbl[tmrID].tmrNext = TmrList;
|
||||
TmrList->tmrPrev = &TmrTbl[tmrID];
|
||||
TmrList = &TmrTbl[tmrID];
|
||||
}
|
||||
TmrTbl[tmrID].tmrCnt = TmrTbl[tmrID].tmrNext->tmrCnt+deltaTicks;
|
||||
TmrTbl[tmrID].tmrNext->tmrCnt -= TmrTbl[tmrID].tmrCnt;
|
||||
break;
|
||||
}
|
||||
/* Is last item in list? */
|
||||
else if((deltaTicks >= 0) && (pTmr->tmrNext == Co_NULL))
|
||||
{
|
||||
/* Yes,insert into */
|
||||
TmrTbl[tmrID].tmrPrev = pTmr;
|
||||
pTmr->tmrNext = &TmrTbl[tmrID];
|
||||
TmrTbl[tmrID].tmrCnt = deltaTicks;
|
||||
break;
|
||||
}
|
||||
pTmr = pTmr->tmrNext; /* Get the next item in timer list */
|
||||
}
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Remove a timer from the timer list
|
||||
* @param[in] tmrID Specify ID for a timer which removed form timer list.
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to remove a timer from the timer list.
|
||||
*******************************************************************************
|
||||
*/
|
||||
static void RemoveTmrList(OS_TCID tmrID)
|
||||
{
|
||||
P_TmrCtrl pTmr;
|
||||
|
||||
pTmr = &TmrTbl[tmrID];
|
||||
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
|
||||
/* Is there only one item in timer list? */
|
||||
if((pTmr->tmrPrev == Co_NULL) && (pTmr->tmrNext == Co_NULL))
|
||||
{
|
||||
TmrList = Co_NULL; /* Yes,set timer list as Co_NULL */
|
||||
}
|
||||
else if(pTmr->tmrPrev == Co_NULL) /* Is the first item in timer list? */
|
||||
{ /* Yes,remove timer from list,and reset timer list */
|
||||
TmrList = pTmr->tmrNext;
|
||||
TmrList->tmrPrev = Co_NULL;
|
||||
pTmr->tmrNext->tmrCnt += pTmr->tmrCnt;
|
||||
pTmr->tmrNext = Co_NULL;
|
||||
}
|
||||
else if(pTmr->tmrNext == Co_NULL) /* Is the last item in timer list? */
|
||||
{
|
||||
/* Yes,remove timer form list */
|
||||
pTmr->tmrPrev->tmrNext = Co_NULL;
|
||||
pTmr->tmrPrev = Co_NULL;
|
||||
}
|
||||
else /* No, remove timer from list */
|
||||
{
|
||||
pTmr->tmrPrev->tmrNext = pTmr->tmrNext;
|
||||
pTmr->tmrNext->tmrPrev = pTmr->tmrPrev;
|
||||
pTmr->tmrNext->tmrCnt += pTmr->tmrCnt;
|
||||
pTmr->tmrNext = Co_NULL;
|
||||
pTmr->tmrPrev = Co_NULL;
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Create a timer
|
||||
* @param[in] tmrType Specify timer's type.
|
||||
* @param[in] tmrCnt Specify timer initial counter value.
|
||||
* @param[in] tmrReload Specify timer reload value.
|
||||
* @param[in] func Specify timer callback function entry.
|
||||
* @param[out] None
|
||||
* @retval E_CREATE_FAIL Create timer fail.
|
||||
* @retval others Create timer successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to create a timer.
|
||||
*******************************************************************************
|
||||
*/
|
||||
OS_TCID CoCreateTmr(U8 tmrType, U32 tmrCnt, U32 tmrReload, vFUNCPtr func)
|
||||
{
|
||||
U8 i;
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if((tmrType != TMR_TYPE_ONE_SHOT) && (tmrType != TMR_TYPE_PERIODIC))
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
if(func == Co_NULL)
|
||||
{
|
||||
return E_CREATE_FAIL;
|
||||
}
|
||||
#endif
|
||||
OsSchedLock(); /* Lock schedule */
|
||||
for(i = 0; i < CFG_MAX_TMR; i++)
|
||||
{
|
||||
if((TmrIDVessel & (1 << i)) == 0) /* Is free timer ID? */
|
||||
{
|
||||
TmrIDVessel |= (1<<i); /* Yes,assign ID to this timer */
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
TmrTbl[i].tmrID = i; /* Initialize timer as user set */
|
||||
TmrTbl[i].tmrType = tmrType;
|
||||
TmrTbl[i].tmrState = TMR_STATE_STOPPED;
|
||||
TmrTbl[i].tmrCnt = tmrCnt;
|
||||
TmrTbl[i].tmrReload = tmrReload;
|
||||
TmrTbl[i].tmrCallBack = func;
|
||||
TmrTbl[i].tmrPrev = Co_NULL;
|
||||
TmrTbl[i].tmrNext = Co_NULL;
|
||||
return i; /* Return timer ID */
|
||||
}
|
||||
}
|
||||
OsSchedUnlock(); /* Unlock schedule */
|
||||
return E_CREATE_FAIL; /* Error return */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Start counter
|
||||
* @param[in] tmrID Specify a timer which startted.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The timer id passed was invalid,can't start timer
|
||||
* @retval E_OK Insert a timer to timer list and start it successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to make a timer start countering.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoStartTmr(OS_TCID tmrID)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( (TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_RUNNING) /* Is timer running? */
|
||||
{
|
||||
return E_OK; /* Yes,do nothing,return OK */
|
||||
}
|
||||
|
||||
/* No,set timer status as TMR_STATE_RUNNING */
|
||||
TmrTbl[tmrID].tmrState = TMR_STATE_RUNNING;
|
||||
InsertTmrList(tmrID); /* Insert this timer into timer list */
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Stop countering for a spcify timer
|
||||
* @param[in] tmrID Specify a timer which stopped.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The timer id passed was invalid, stop failure.
|
||||
* @retval E_OK Stop a timer countering successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to stop a timer from counting.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoStopTmr(OS_TCID tmrID)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if((TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_STOPPED)/* Does timer stop running?*/
|
||||
{
|
||||
return E_OK; /* Yes,do nothing,return OK */
|
||||
}
|
||||
RemoveTmrList(tmrID); /* No,remove this timer from timer list */
|
||||
|
||||
/* Set timer status as TMR_STATE_STOPPED */
|
||||
TmrTbl[tmrID].tmrState = TMR_STATE_STOPPED;
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Delete a timer
|
||||
* @param[in] tmrID Specify a timer which deleted.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The timer id passed was invalid,deleted failure.
|
||||
* @retval E_OK Delete a timer successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to delete a timer which created before.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoDelTmr(OS_TCID tmrID)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( (TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_RUNNING) /* Is timer running? */
|
||||
{
|
||||
RemoveTmrList(tmrID); /* Yes,remove this timer from timer list*/
|
||||
}
|
||||
TmrIDVessel &=~(1<<tmrID); /* Release resource that this timer hold*/
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Get current counter of specify timer
|
||||
* @param[in] tmrID Specify timer by ID.
|
||||
* @param[out] E_INVALID_ID Invalid ID was passed and get counter failure.
|
||||
* @param[out] E_OK Get current counter successful.
|
||||
* @retval Current counter of a timer which specify by id.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to obtain current counter of specify timer.
|
||||
*******************************************************************************
|
||||
*/
|
||||
U32 CoGetCurTmrCnt(OS_TCID tmrID,StatusType* perr)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return 0;
|
||||
}
|
||||
if((TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
*perr = E_INVALID_ID;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
*perr = E_OK;
|
||||
return TmrTbl[tmrID].tmrCnt; /* Return timer counter */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Setting for a specify timer
|
||||
* @param[in] tmrID Specify timer by ID.
|
||||
* @param[in] tmrCnt Specify timer counter which need to be set.
|
||||
* @param[in] tmrReload Specify timer reload value which need to be set.
|
||||
* @param[out] None
|
||||
* @retval E_INVALID_ID The ID passed was invalid,set fail.
|
||||
* @retval E_OK Set timer counter successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to set timer counter and reload value.
|
||||
*******************************************************************************
|
||||
*/
|
||||
StatusType CoSetTmrCnt(OS_TCID tmrID,U32 tmrCnt,U32 tmrReload)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0 /* Check validity of parameter */
|
||||
if(tmrID >= CFG_MAX_TMR)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
if( (TmrIDVessel & (1<<tmrID)) == 0)
|
||||
{
|
||||
return E_INVALID_ID;
|
||||
}
|
||||
#endif
|
||||
TmrTbl[tmrID].tmrCnt = tmrCnt; /* Reset timer counter and reload value */
|
||||
TmrTbl[tmrID].tmrReload = tmrReload;
|
||||
|
||||
if(TmrTbl[tmrID].tmrState == TMR_STATE_RUNNING) /* Is timer running? */
|
||||
{
|
||||
RemoveTmrList(tmrID); /* Yes,reorder timer in timer list */
|
||||
InsertTmrList(tmrID);
|
||||
}
|
||||
return E_OK; /* Return OK */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Timer counter dispose
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to dispose timer counter.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void TmrDispose(void)
|
||||
{
|
||||
P_TmrCtrl pTmr;
|
||||
|
||||
pTmr = TmrList; /* Get first item of timer list */
|
||||
while((pTmr != Co_NULL) && (pTmr->tmrCnt == 0) )
|
||||
{
|
||||
if(pTmr->tmrType == TMR_TYPE_ONE_SHOT) /* Is a One-shot timer? */
|
||||
{
|
||||
/* Yes,remove this timer from timer list */
|
||||
RemoveTmrList(pTmr->tmrID);
|
||||
|
||||
/* Set timer status as TMR_STATE_STOPPED */
|
||||
pTmr->tmrState = TMR_STATE_STOPPED;
|
||||
(pTmr->tmrCallBack)(); /* Call timer callback function */
|
||||
}
|
||||
else if(pTmr->tmrType == TMR_TYPE_PERIODIC) /* Is a periodic timer? */
|
||||
{
|
||||
/* Yes,remove this timer from timer list */
|
||||
RemoveTmrList(pTmr->tmrID);
|
||||
pTmr->tmrCnt = pTmr->tmrReload; /* Reset timer tick */
|
||||
InsertTmrList(pTmr->tmrID); /* Insert timer into timer list */
|
||||
(pTmr->tmrCallBack)(); /* Call timer callback function */
|
||||
}
|
||||
pTmr = TmrList; /* Get first item of timer list */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Timer counter dispose in ISR
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to dispose timer counter.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void isr_TmrDispose(void)
|
||||
{
|
||||
if(OSSchedLock > 1) /* Is schedule lock? */
|
||||
{
|
||||
IsrReq = Co_TRUE;
|
||||
TimerReq = Co_TRUE; /* Yes,set timer request true */
|
||||
}
|
||||
else
|
||||
{
|
||||
TmrDispose(); /* No,call handler */
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
+109
-86
@@ -1,86 +1,109 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file utility.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Utility management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_UTILITY_EN > 0
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Convert tick number to time
|
||||
* @param[in] ticks Specifies the systerm tick numbers that will be converted.
|
||||
* @param[out] hour Hours which converted.
|
||||
* @param[out] minute minutes which converted.
|
||||
* @param[out] sec seconds which converted.
|
||||
* @param[out] millsec millseconds which converted.
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to convert specify ticks to time format.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_TICK_TO_TIME_EN > 0
|
||||
void CoTickToTime(U32 ticks,U8* hour,U8* minute,U8* sec,U16* millsec)
|
||||
{
|
||||
U32 totalTime;
|
||||
|
||||
/* Convert ticks to time*/
|
||||
totalTime = ticks * (1000/CFG_SYSTICK_FREQ);
|
||||
*millsec = totalTime%1000;
|
||||
totalTime = totalTime/1000;
|
||||
*sec = totalTime%60;
|
||||
totalTime = totalTime/60;
|
||||
*minute = totalTime%60;
|
||||
totalTime = totalTime/60;
|
||||
*hour = totalTime;
|
||||
}
|
||||
#endif /* CFG_TICK_TO_TIME_EN */
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Convert time to tick
|
||||
* @param[in] hour Specifies the number of hours.
|
||||
* @param[in] minute Specifies the number of minutes.
|
||||
* @param[in] sec Specifies the number of seconds.
|
||||
* @param[in] millsec Specifies the number of millseconds.
|
||||
* @param[out] ticks Tick numbers that converted.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter be passed and convert fail.
|
||||
* @retval E_OK Convert successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to convert specify time to tick number.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_TIME_TO_TICK_EN > 0
|
||||
StatusType CoTimeToTick(U8 hour,U8 minute,U8 sec,U16 millsec,U32* ticks)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
/* Validate arguments to be within range */
|
||||
if((minute > 59)||(sec > 59)||(millsec > 999))
|
||||
return E_INVALID_PARAMETER;
|
||||
#endif
|
||||
|
||||
/* Convert time to ticks */
|
||||
*ticks = ((hour*3600) + (minute*60) + (sec)) * (CFG_SYSTICK_FREQ)\
|
||||
+ (millsec*CFG_SYSTICK_FREQ + 500)/1000;
|
||||
return E_OK;
|
||||
}
|
||||
#endif /* CFG_TIME_TO_TICK_EN */
|
||||
|
||||
#endif /* CFG_UTILITY_EN */
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file utility.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Utility management implementation code of CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
|
||||
#if CFG_UTILITY_EN > 0
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Convert tick number to time
|
||||
* @param[in] ticks Specifies the systerm tick numbers that will be converted.
|
||||
* @param[out] hour Hours which converted.
|
||||
* @param[out] minute minutes which converted.
|
||||
* @param[out] sec seconds which converted.
|
||||
* @param[out] millsec millseconds which converted.
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to convert specify ticks to time format.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_TICK_TO_TIME_EN > 0
|
||||
void CoTickToTime(U32 ticks,U8* hour,U8* minute,U8* sec,U16* millsec)
|
||||
{
|
||||
U32 totalTime;
|
||||
|
||||
/* Convert ticks to time*/
|
||||
totalTime = ticks * (1000/CFG_SYSTICK_FREQ);
|
||||
*millsec = totalTime%1000;
|
||||
totalTime = totalTime/1000;
|
||||
*sec = totalTime%60;
|
||||
totalTime = totalTime/60;
|
||||
*minute = totalTime%60;
|
||||
totalTime = totalTime/60;
|
||||
*hour = totalTime;
|
||||
}
|
||||
#endif /* CFG_TICK_TO_TIME_EN */
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief Convert time to tick
|
||||
* @param[in] hour Specifies the number of hours.
|
||||
* @param[in] minute Specifies the number of minutes.
|
||||
* @param[in] sec Specifies the number of seconds.
|
||||
* @param[in] millsec Specifies the number of millseconds.
|
||||
* @param[out] ticks Tick numbers that converted.
|
||||
* @retval E_INVALID_PARAMETER Invalid parameter be passed and convert fail.
|
||||
* @retval E_OK Convert successful.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to convert specify time to tick number.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#if CFG_TIME_TO_TICK_EN > 0
|
||||
StatusType CoTimeToTick(U8 hour,U8 minute,U8 sec,U16 millsec,U32* ticks)
|
||||
{
|
||||
#if CFG_PAR_CHECKOUT_EN >0
|
||||
/* Validate arguments to be within range */
|
||||
if((minute > 59)||(sec > 59)||(millsec > 999))
|
||||
return E_INVALID_PARAMETER;
|
||||
#endif
|
||||
|
||||
/* Convert time to ticks */
|
||||
*ticks = ((hour*3600) + (minute*60) + (sec)) * (CFG_SYSTICK_FREQ)\
|
||||
+ (millsec*CFG_SYSTICK_FREQ + 500)/1000;
|
||||
return E_OK;
|
||||
}
|
||||
#endif /* CFG_TIME_TO_TICK_EN */
|
||||
|
||||
#endif /* CFG_UTILITY_EN */
|
||||
|
||||
@@ -1,39 +1,62 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file utility.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Utility function header file
|
||||
* @details This file including some defines and declares related to utility
|
||||
* function.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _UTILITY_H
|
||||
#define _UTILITY_H
|
||||
|
||||
|
||||
/**
|
||||
* @struct Time struct utility.h
|
||||
* @brief Time struct
|
||||
* @details This struct use to manage time
|
||||
*/
|
||||
typedef struct SysTime
|
||||
{
|
||||
U8 sec; /*!< Second */
|
||||
U8 min; /*!< Minute */
|
||||
U8 hour; /*!< Hour */
|
||||
U8 date; /*!< Date */
|
||||
U8 month; /*!< Month */
|
||||
U16 year; /*!< Year */
|
||||
}TIME;
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file utility.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Utility function header file
|
||||
* @details This file including some defines and declares related to utility
|
||||
* function.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _UTILITY_H
|
||||
#define _UTILITY_H
|
||||
|
||||
|
||||
/**
|
||||
* @struct Time struct utility.h
|
||||
* @brief Time struct
|
||||
* @details This struct use to manage time
|
||||
*/
|
||||
typedef struct SysTime
|
||||
{
|
||||
U8 sec; /*!< Second */
|
||||
U8 min; /*!< Minute */
|
||||
U8 hour; /*!< Hour */
|
||||
U8 date; /*!< Date */
|
||||
U8 month; /*!< Month */
|
||||
U16 year; /*!< Year */
|
||||
}TIME;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+332
-295
@@ -1,295 +1,332 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file prot.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Compiler adapter for CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2010 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include "coocox.h"
|
||||
|
||||
|
||||
//******************************************************************************
|
||||
// EQUATES
|
||||
//******************************************************************************
|
||||
U32 NVIC_INT_CTRL = 0xE000ED04; // Interrupt control state register
|
||||
U32 NVIC_PENDSVSET = 0x10000000; // Value to trigger PendSV exception
|
||||
U32 INT_EXIT = 0xFFFFFFFC;
|
||||
|
||||
//******************************************************************************
|
||||
// PUBLIC FUNCTIONS
|
||||
//******************************************************************************
|
||||
extern U8 Inc8(volatile U8 *data) ;
|
||||
extern U8 Dec8(volatile U8 *data) ;
|
||||
extern void IRQ_ENABLE_RESTORE(void);
|
||||
extern void IRQ_DISABLE_SAVE(void);
|
||||
extern void SetEnvironment(OS_STK *pstk) __attribute__ ((naked));
|
||||
extern void SwitchContext(void) __attribute__ ((naked));
|
||||
extern void PendSV_Handler(void) __attribute__ ((naked));
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Plus a byte integers and Saved into memory cell
|
||||
* @param[in] data byte integers.
|
||||
* @param[out] None
|
||||
* @retval Returns Original value.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Plus a byte integers
|
||||
* and Saved into memory cell.
|
||||
******************************************************************************
|
||||
*/
|
||||
U8 Inc8 (volatile U8 *data)
|
||||
{
|
||||
register U8 result = 0;
|
||||
|
||||
__asm volatile
|
||||
(
|
||||
" PUSH {R1} \n"
|
||||
" CPSID I \n"
|
||||
" LDRB R1,[%1] \n"
|
||||
" ADD R1,#1 \n"
|
||||
" STRB R1,[%1] \n"
|
||||
" CPSIE I \n"
|
||||
" SUB R1,#0x1 \n"
|
||||
" MOVS %0,R1 \n"
|
||||
" POP {R1} \n"
|
||||
:"=r"(result)
|
||||
:"r"(data)
|
||||
);
|
||||
return (result);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Decrease a byte integers and Saved into memory cell
|
||||
* @param[in] data byte integers.
|
||||
* @param[out] None
|
||||
* @retval Returns Original value.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Decrease a byte integers
|
||||
* and Saved into memory cell.
|
||||
******************************************************************************
|
||||
*/
|
||||
U8 Dec8 (volatile U8 *data)
|
||||
{
|
||||
register U8 result = 0;
|
||||
__asm volatile
|
||||
(
|
||||
" PUSH {R1} \n"
|
||||
" CPSID I \n"
|
||||
" LDRB R1,[%1] \n"
|
||||
" SUB R1,#1 \n"
|
||||
" STRB R1,[%1] \n"
|
||||
" CPSIE I \n"
|
||||
" MOVS %0,R1 \n"
|
||||
" POP {R1} \n"
|
||||
:"=r"(result)
|
||||
:"r"(data)
|
||||
);
|
||||
return (result);
|
||||
}
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief ENABLE Interrupt
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to ENABLE Interrupt.
|
||||
******************************************************************************
|
||||
*/
|
||||
void IRQ_ENABLE_RESTORE(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" CPSIE I \n"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Close Interrupt
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to close Interrupt.
|
||||
******************************************************************************
|
||||
*/
|
||||
void IRQ_DISABLE_SAVE(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" CPSID I \n"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Set environment for Coocox OS running
|
||||
* @param[in] pstk stack pointer
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Set environment
|
||||
* for Coocox OS running.
|
||||
******************************************************************************
|
||||
*/
|
||||
void SetEnvironment (OS_STK *pstk)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" SUB R0,#28 \n"
|
||||
" MSR PSP,R0 \n"
|
||||
" BX LR \n"
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Do ready work to Switch Context for task change
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Do ready work to
|
||||
* Switch Context for task change
|
||||
******************************************************************************
|
||||
*/
|
||||
void SwitchContext(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" LDR R3,=NVIC_INT_CTRL \n"
|
||||
" LDR R3,[R3] \n"
|
||||
" LDR R2,=NVIC_PENDSVSET \n"
|
||||
" LDR R1,[R2] \n"
|
||||
" STR R1, [R3] \n"
|
||||
" BX LR \n"
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Switch Context for task change
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Switch Context for task change.
|
||||
******************************************************************************
|
||||
*/
|
||||
#if CFG_CHIP_TYPE == 2
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" LDR R3,=TCBRunning \n"
|
||||
" LDR R1,[R3] \n" // R1 == running tcb
|
||||
" LDR R2,=TCBNext \n"
|
||||
" LDR R2,[R2] \n" // R2 == next tcb
|
||||
|
||||
" CMP R1,R2 \n"
|
||||
" BEQ exitPendSV \n"
|
||||
" MRS R0, PSP \n" // Get PSP point (can not use PUSH,in ISR,SP is MSP )
|
||||
|
||||
" SUB R0,R0,#32 \n"
|
||||
" STR R0,[R1] \n" // Save orig PSP
|
||||
// Store r4-r11,r0 -= regCnt * 4,r0 is new stack
|
||||
// top point (addr h->l r11,r10,...,r5,r4)
|
||||
" STMIA R0!,{R4-R7} \n" // Save old context (R4-R7)
|
||||
" MOV R4,R8 \n"
|
||||
" MOV R5,R9 \n"
|
||||
" MOV R6,R10 \n"
|
||||
" MOV R7,R11 \n"
|
||||
" STMIA R0!,{R4-R7} \n" // Save old context (R8-R11)
|
||||
|
||||
" popStk: \n"
|
||||
" STR R2, [R3] \n" // TCBRunning = TCBNext;
|
||||
" LDR R0, [R2] \n" // Get SP of task that be switch into.
|
||||
|
||||
" ADD R0,R0,#16 \n"
|
||||
" LDMIA R0!,{R4-R7} \n" // Restore new Context (R8-R11)
|
||||
" MOV R8,R4 \n"
|
||||
" MOV R9,R5 \n"
|
||||
" MOV R10,R6 \n"
|
||||
" MOV R11,R7 \n"
|
||||
" SUB R0,R0,#32 \n"
|
||||
" LDMIA R0!,{R4-R7} \n" // Restore new Context (R4-R7)
|
||||
" ADD R0,R0,#16 \n"
|
||||
" MSR PSP, R0 \n" // Mov new stack point to PSP
|
||||
|
||||
" exitPendSV: \n"
|
||||
" LDR R3,=OSSchedLock \n"
|
||||
" MOV R0, #0x0 \n"
|
||||
" STRB R0, [R3] \n"
|
||||
|
||||
" LDR R3,=INT_EXIT \n"
|
||||
" LDR R0, [R3] \n"
|
||||
" BX R0 \n" // Exit interrupt
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_CHIP_TYPE == 1
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
////////debug block /////////////////////////
|
||||
__asm volatile
|
||||
(
|
||||
" LDR R3,=TCBRunning \n"
|
||||
" LDR R1,[R3] \n" // R1 == running tcb
|
||||
" LDR R2,=TCBNext \n"
|
||||
" LDR R2,[R2] \n" // R2 == next tcb
|
||||
|
||||
" CMP R1,R2 \n"
|
||||
" BEQ exitPendSV \n"
|
||||
|
||||
" MRS R0, PSP \n" // Get PSP point (can not use PUSH,in ISR,SP is MSP )
|
||||
" STMDB R0!,{R4-R11} \n" // Store r4-r11,r0 -= regCnt * 4,r0 is new stack
|
||||
// top point (addr h->l r11,r10,...,r5,r4)
|
||||
" STR R0,[R1] \n" // Save orig PSP
|
||||
|
||||
" STR R2, [R3] \n" // TCBRunning = TCBNext;
|
||||
" LDR R0, [R2] \n" // Get SP of task that be switch into.
|
||||
" LDMIA R0!,{R4-R11} \n" // POP {R4-R11},R0 += regCnt * 4
|
||||
" MSR PSP, R0 \n" // Mov new stack point to PSP
|
||||
|
||||
|
||||
" exitPendSV: \n"
|
||||
" LDR R3,=OSSchedLock\n"
|
||||
" MOVS R0, #0x0 \n"
|
||||
" STRB R0, [R3] \n"
|
||||
" ORR LR,LR,#0x04 \n" // Ensure exception return uses process stack
|
||||
" BX LR \n" // Exit interrupt
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file prot.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Compiler adapter for CooCox CoOS kernel.
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include "coocox.h"
|
||||
|
||||
|
||||
//******************************************************************************
|
||||
// EQUATES
|
||||
//******************************************************************************
|
||||
U32 NVIC_INT_CTRL = 0xE000ED04; // Interrupt control state register
|
||||
U32 NVIC_PENDSVSET = 0x10000000; // Value to trigger PendSV exception
|
||||
U32 INT_EXIT = 0xFFFFFFFC;
|
||||
|
||||
//******************************************************************************
|
||||
// PUBLIC FUNCTIONS
|
||||
//******************************************************************************
|
||||
extern U8 Inc8(volatile U8 *data) ;
|
||||
extern U8 Dec8(volatile U8 *data) ;
|
||||
extern void IRQ_ENABLE_RESTORE(void);
|
||||
extern void IRQ_DISABLE_SAVE(void);
|
||||
extern void SetEnvironment(OS_STK *pstk) __attribute__ ((naked));
|
||||
extern void SwitchContext(void) __attribute__ ((naked));
|
||||
extern void PendSV_Handler(void) __attribute__ ((naked));
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Plus a byte integers and Saved into memory cell
|
||||
* @param[in] data byte integers.
|
||||
* @param[out] None
|
||||
* @retval Returns Original value.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Plus a byte integers
|
||||
* and Saved into memory cell.
|
||||
******************************************************************************
|
||||
*/
|
||||
U8 Inc8 (volatile U8 *data)
|
||||
{
|
||||
register U8 result = 0;
|
||||
|
||||
__asm volatile
|
||||
(
|
||||
" PUSH {R1} \n"
|
||||
" CPSID I \n"
|
||||
" LDRB R1,[%1] \n"
|
||||
" ADD R1,#1 \n"
|
||||
" STRB R1,[%1] \n"
|
||||
" CPSIE I \n"
|
||||
" SUB R1,#0x1 \n"
|
||||
" MOVS %0,R1 \n"
|
||||
" POP {R1} \n"
|
||||
:"=r"(result)
|
||||
:"r"(data)
|
||||
);
|
||||
return (result);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Decrease a byte integers and Saved into memory cell
|
||||
* @param[in] data byte integers.
|
||||
* @param[out] None
|
||||
* @retval Returns Original value.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Decrease a byte integers
|
||||
* and Saved into memory cell.
|
||||
******************************************************************************
|
||||
*/
|
||||
U8 Dec8 (volatile U8 *data)
|
||||
{
|
||||
register U8 result = 0;
|
||||
__asm volatile
|
||||
(
|
||||
" PUSH {R1} \n"
|
||||
" CPSID I \n"
|
||||
" LDRB R1,[%1] \n"
|
||||
" SUB R1,#1 \n"
|
||||
" STRB R1,[%1] \n"
|
||||
" CPSIE I \n"
|
||||
" MOVS %0,R1 \n"
|
||||
" POP {R1} \n"
|
||||
:"=r"(result)
|
||||
:"r"(data)
|
||||
);
|
||||
return (result);
|
||||
}
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief ENABLE Interrupt
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to ENABLE Interrupt.
|
||||
******************************************************************************
|
||||
*/
|
||||
void IRQ_ENABLE_RESTORE(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" CPSIE I \n"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Close Interrupt
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to close Interrupt.
|
||||
******************************************************************************
|
||||
*/
|
||||
void IRQ_DISABLE_SAVE(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" CPSID I \n"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Set environment for Coocox OS running
|
||||
* @param[in] pstk stack pointer
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Set environment
|
||||
* for Coocox OS running.
|
||||
******************************************************************************
|
||||
*/
|
||||
void SetEnvironment (OS_STK *pstk)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
" SUB R0,#100 \n"
|
||||
#else
|
||||
" SUB R0,#28 \n"
|
||||
#endif
|
||||
" MSR PSP,R0 \n"
|
||||
" BX LR \n"
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Do ready work to Switch Context for task change
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Do ready work to
|
||||
* Switch Context for task change
|
||||
******************************************************************************
|
||||
*/
|
||||
void SwitchContext(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" LDR R3,=NVIC_INT_CTRL \n"
|
||||
" LDR R3,[R3] \n"
|
||||
" LDR R2,=NVIC_PENDSVSET \n"
|
||||
" LDR R1,[R2] \n"
|
||||
" STR R1, [R3] \n"
|
||||
" BX LR \n"
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Switch Context for task change
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to Switch Context for task change.
|
||||
******************************************************************************
|
||||
*/
|
||||
#if CFG_CHIP_TYPE == 2
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" LDR R3,=TCBRunning \n"
|
||||
" LDR R1,[R3] \n" // R1 == running tcb
|
||||
" LDR R2,=TCBNext \n"
|
||||
" LDR R2,[R2] \n" // R2 == next tcb
|
||||
|
||||
" CMP R1,R2 \n"
|
||||
" BEQ exitPendSV \n"
|
||||
" MRS R0, PSP \n" // Get PSP point (can not use PUSH,in ISR,SP is MSP )
|
||||
|
||||
" SUB R0,R0,#32 \n"
|
||||
" STR R0,[R1] \n" // Save orig PSP
|
||||
// Store r4-r11,r0 -= regCnt * 4,r0 is new stack
|
||||
// top point (addr h->l r11,r10,...,r5,r4)
|
||||
" STMIA R0!,{R4-R7} \n" // Save old context (R4-R7)
|
||||
" MOV R4,R8 \n"
|
||||
" MOV R5,R9 \n"
|
||||
" MOV R6,R10 \n"
|
||||
" MOV R7,R11 \n"
|
||||
" STMIA R0!,{R4-R7} \n" // Save old context (R8-R11)
|
||||
|
||||
" popStk: \n"
|
||||
" STR R2, [R3] \n" // TCBRunning = TCBNext;
|
||||
" LDR R0, [R2] \n" // Get SP of task that be switch into.
|
||||
|
||||
" ADD R0,R0,#16 \n"
|
||||
" LDMIA R0!,{R4-R7} \n" // Restore new Context (R8-R11)
|
||||
" MOV R8,R4 \n"
|
||||
" MOV R9,R5 \n"
|
||||
" MOV R10,R6 \n"
|
||||
" MOV R11,R7 \n"
|
||||
" SUB R0,R0,#32 \n"
|
||||
" LDMIA R0!,{R4-R7} \n" // Restore new Context (R4-R7)
|
||||
" ADD R0,R0,#16 \n"
|
||||
" MSR PSP, R0 \n" // Mov new stack point to PSP
|
||||
|
||||
" exitPendSV: \n"
|
||||
" LDR R3,=OSSchedLock \n"
|
||||
" MOV R0, #0x0 \n"
|
||||
" STRB R0, [R3] \n"
|
||||
|
||||
" LDR R3,=INT_EXIT \n"
|
||||
" LDR R0, [R3] \n"
|
||||
" BX R0 \n" // Exit interrupt
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_CHIP_TYPE == 1 || 3 == CFG_CHIP_TYPE
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
////////debug block /////////////////////////
|
||||
__asm volatile
|
||||
(
|
||||
" LDR R3,=TCBRunning \n"
|
||||
" LDR R1,[R3] \n" // R1 == running tcb
|
||||
" LDR R2,=TCBNext \n"
|
||||
" LDR R2,[R2] \n" // R2 == next tcb
|
||||
|
||||
" CMP R1,R2 \n"
|
||||
" BEQ exitPendSV \n"
|
||||
|
||||
" MRS R0, PSP \n" // Get PSP point (can not use PUSH,in ISR,SP is MSP )
|
||||
" STMDB R0!,{R4-R11} \n" // Store r4-r11,r0 -= regCnt * 4,r0 is new stack
|
||||
// top point (addr h->l r11,r10,...,r5,r4)
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
" VSTMDB R0!, {S16-S31} \n" // store remaining FPU registers
|
||||
#endif // CFG_FPU_ENABLE
|
||||
|
||||
" STR R0,[R1] \n" // Save orig PSP
|
||||
|
||||
" STR R2, [R3] \n" // TCBRunning = TCBNext;
|
||||
" LDR R0, [R2] \n" // Get SP of task that be switch into.
|
||||
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
" VLDMIA R0!, {S16-S31} \n" // load remaining FPU registers
|
||||
#endif // CFG_FPU_ENABLE
|
||||
|
||||
" LDMIA R0!,{R4-R11} \n" // POP {R4-R11},R0 += regCnt * 4
|
||||
" MSR PSP, R0 \n" // Mov new stack point to PSP
|
||||
|
||||
" exitPendSV: \n"
|
||||
" LDR R3,=OSSchedLock\n"
|
||||
" MOVS R0, #0x0 \n"
|
||||
" STRB R0, [R3] \n"
|
||||
" ORR LR,LR,#0x04 \n" // Ensure exception return uses process stack
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
" LDR LR,=0xFFFFFFED \n"
|
||||
#endif
|
||||
" BX LR \n" // Exit interrupt
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,50 +1,75 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsArch.h
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief Implement function declare related to Cortex-M3(ARM-v7)
|
||||
* @details This header file including functions or defines related to
|
||||
* Cortex-M3(ARM-v7).
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* INTERNAL FILE,DON'T PUBLIC.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CPU_H
|
||||
#define _CPU_H
|
||||
|
||||
|
||||
#define NVIC_ST_CTRL (*((volatile U32 *)0xE000E010))
|
||||
#define NVIC_ST_RELOAD (*((volatile U32 *)0xE000E014))
|
||||
#define RELOAD_VAL ((U32)(( (U32)CFG_CPU_FREQ) / (U32)CFG_SYSTICK_FREQ) -1)
|
||||
|
||||
/*!< Initial System tick. */
|
||||
#define InitSysTick() NVIC_ST_RELOAD = RELOAD_VAL; \
|
||||
NVIC_ST_CTRL = 0x0007
|
||||
|
||||
#define NVIC_SYS_PRI2 (*((volatile U32 *)0xE000ED1C))
|
||||
#define NVIC_SYS_PRI3 (*((volatile U32 *)0xE000ED20))
|
||||
|
||||
/*!< Initialize PendSV,SVC and SysTick interrupt priority to lowest. */
|
||||
#define InitInt() NVIC_SYS_PRI2 |= 0xFF000000;\
|
||||
NVIC_SYS_PRI3 |= 0xFFFF0000
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern U64 OSTickCnt; /*!< Counter for current system ticks. */
|
||||
|
||||
/*!< Initial context of task being created */
|
||||
extern OS_STK *InitTaskContext(FUNCPtr task,void *param,OS_STK *pstk);
|
||||
extern void SwitchContext(void); /*!< Switch context */
|
||||
extern void SetEnvironment(OS_STK *pstk);/*!< Set environment for run */
|
||||
extern U8 Inc8 (volatile U8 *data);
|
||||
extern U8 Dec8 (volatile U8 *data);
|
||||
extern void IRQ_ENABLE_RESTORE(void);
|
||||
extern void IRQ_DISABLE_SAVE(void);
|
||||
#endif
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file OsArch.h
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief Implement function declare related to Cortex-M3(ARM-v7)
|
||||
* @details This header file including functions or defines related to
|
||||
* Cortex-M3(ARM-v7).
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CPU_H
|
||||
#define _CPU_H
|
||||
|
||||
|
||||
#define NVIC_ST_CTRL (*((volatile U32 *)0xE000E010))
|
||||
#define NVIC_ST_RELOAD (*((volatile U32 *)0xE000E014))
|
||||
#define RELOAD_VAL ((U32)(( (U32)CFG_CPU_FREQ) / (U32)CFG_SYSTICK_FREQ) -1)
|
||||
|
||||
/*!< Initial System tick. */
|
||||
#define InitSysTick() NVIC_ST_RELOAD = RELOAD_VAL; \
|
||||
NVIC_ST_CTRL = 0x0007
|
||||
|
||||
#define NVIC_SYS_PRI2 (*((volatile U32 *)0xE000ED1C))
|
||||
#define NVIC_SYS_PRI3 (*((volatile U32 *)0xE000ED20))
|
||||
|
||||
/*!< Initialize PendSV,SVC and SysTick interrupt priority to lowest. */
|
||||
#define InitInt() NVIC_SYS_PRI2 |= 0xFF000000;\
|
||||
NVIC_SYS_PRI3 |= 0xFFFF0000
|
||||
|
||||
|
||||
/*---------------------------- Variable declare ------------------------------*/
|
||||
extern U64 OSTickCnt; /*!< Counter for current system ticks. */
|
||||
|
||||
/*!< Initial context of task being created */
|
||||
extern OS_STK *InitTaskContext(FUNCPtr task,void *param,OS_STK *pstk);
|
||||
extern void SwitchContext(void); /*!< Switch context */
|
||||
extern void SetEnvironment(OS_STK *pstk);/*!< Set environment for run */
|
||||
extern U8 Inc8 (volatile U8 *data);
|
||||
extern U8 Dec8 (volatile U8 *data);
|
||||
extern void IRQ_ENABLE_RESTORE(void);
|
||||
extern void IRQ_DISABLE_SAVE(void);
|
||||
|
||||
|
||||
#endif /* _CPU_H */
|
||||
|
||||
+126
-96
@@ -1,96 +1,126 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file arch.c
|
||||
* @version V1.1.4
|
||||
* @date 2011.04.20
|
||||
* @brief This file provides InitTaskContext() and SysTick_Handler().
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
* WRITE COPY INFORMATION USE CAPITAL LETTER
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2009 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
U64 OSTickCnt = 0; /*!< Current system tick counter */
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Initial task context
|
||||
* @param[in] task Entry point of task.
|
||||
* @param[in] param The parameter pass to task.
|
||||
* @param[in] pstk The pointer to stack top.
|
||||
* @param[out] None
|
||||
* @retval Returns location of new stack top.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to initialize the stack frame of the
|
||||
* task being created.
|
||||
******************************************************************************
|
||||
*/
|
||||
OS_STK *InitTaskContext(FUNCPtr task,void *param,OS_STK *pstk)
|
||||
{
|
||||
OS_STK *context;
|
||||
context = pstk;
|
||||
*(context--) = (U32)0x01000000L; /* xPSR */
|
||||
*(context--) = (U32)task; /* Entry point of task. */
|
||||
*(context) = (U32)0xFFFFFFFEL;
|
||||
context = context - 5;
|
||||
*(context) = (U32)param; /* R0: argument */
|
||||
context = context - 8;
|
||||
|
||||
return (context); /* Returns location of new stack top. */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief System tick interrupt handler.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This is system tick interrupt headler.
|
||||
* @note CoOS may schedule when exiting this ISR.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
OSSchedLock++; /* Lock scheduler. */
|
||||
OSTickCnt++; /* Increment systerm time. */
|
||||
#if CFG_TASK_WAITTING_EN >0
|
||||
if(DlyList != Co_NULL) /* Have task in delay list? */
|
||||
{
|
||||
if(DlyList->delayTick > 1) /* Delay time > 1? */
|
||||
{
|
||||
DlyList->delayTick--; /* Decrease delay time of the list head. */
|
||||
}
|
||||
else
|
||||
{
|
||||
DlyList->delayTick = 0;
|
||||
isr_TimeDispose(); /* Call hander for delay time list */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
if(TmrList != Co_NULL) /* Have timer in working? */
|
||||
{
|
||||
if(TmrList->tmrCnt > 1) /* Timer time > 1? */
|
||||
{
|
||||
TmrList->tmrCnt--; /* Decrease timer time of the list head. */
|
||||
}
|
||||
else
|
||||
{
|
||||
TmrList->tmrCnt = 0;
|
||||
isr_TmrDispose(); /* Call hander for timer list */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
TaskSchedReq = Co_TRUE;
|
||||
OsSchedUnlock();
|
||||
}
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file arch.c
|
||||
* @version V1.1.6
|
||||
* @date 2014.05.23
|
||||
* @brief This file provides InitTaskContext() and SysTick_Handler().
|
||||
*******************************************************************************
|
||||
* @copy
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2014 CooCox </center></h2>
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*---------------------------- Include ---------------------------------------*/
|
||||
#include <coocox.h>
|
||||
U64 OSTickCnt = 0; /*!< Current system tick counter */
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief Initial task context
|
||||
* @param[in] task Entry point of task.
|
||||
* @param[in] param The parameter pass to task.
|
||||
* @param[in] pstk The pointer to stack top.
|
||||
* @param[out] None
|
||||
* @retval Returns location of new stack top.
|
||||
*
|
||||
* @par Description
|
||||
* @details This function is called to initialize the stack frame of the
|
||||
* task being created.
|
||||
******************************************************************************
|
||||
*/
|
||||
OS_STK *InitTaskContext(FUNCPtr task,void *param,OS_STK *pstk)
|
||||
{
|
||||
OS_STK *context;
|
||||
context = pstk;
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
context = context - 18;
|
||||
#endif
|
||||
*(context--) = (U32)0x01000000L; /* xPSR */
|
||||
*(context--) = (U32)task; /* Entry point of task. */
|
||||
*(context) = (U32)0xFFFFFFFEL;
|
||||
context = context - 5;
|
||||
*(context) = (U32)param; /* R0: argument */
|
||||
context = context - 8;
|
||||
#if CFG_CHIP_TYPE == 3
|
||||
context = context - 16;
|
||||
#endif
|
||||
// *(--context) = 0xfffffffd; /* LR */
|
||||
|
||||
return (context); /* Returns location of new stack top. */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @brief System tick interrupt handler.
|
||||
* @param[in] None
|
||||
* @param[out] None
|
||||
* @retval None
|
||||
*
|
||||
* @par Description
|
||||
* @details This is system tick interrupt headler.
|
||||
* @note CoOS may schedule when exiting this ISR.
|
||||
*******************************************************************************
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
OSSchedLock++; /* Lock scheduler. */
|
||||
OSTickCnt++; /* Increment systerm time. */
|
||||
#if CFG_TASK_WAITTING_EN >0
|
||||
if(DlyList != Co_NULL) /* Have task in delay list? */
|
||||
{
|
||||
if(DlyList->delayTick > 1) /* Delay time > 1? */
|
||||
{
|
||||
DlyList->delayTick--; /* Decrease delay time of the list head. */
|
||||
}
|
||||
else
|
||||
{
|
||||
DlyList->delayTick = 0;
|
||||
isr_TimeDispose(); /* Call hander for delay time list */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_TMR_EN > 0
|
||||
if(TmrList != Co_NULL) /* Have timer in working? */
|
||||
{
|
||||
if(TmrList->tmrCnt > 1) /* Timer time > 1? */
|
||||
{
|
||||
TmrList->tmrCnt--; /* Decrease timer time of the list head. */
|
||||
}
|
||||
else
|
||||
{
|
||||
TmrList->tmrCnt = 0;
|
||||
isr_TmrDispose(); /* Call hander for timer list */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
TaskSchedReq = Co_TRUE;
|
||||
OsSchedUnlock();
|
||||
}
|
||||
|
||||
+40
-17
@@ -720,7 +720,7 @@ ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO))
|
||||
CPPSRC += targets/sky9x/coproc_driver.cpp
|
||||
endif
|
||||
TRGT = arm-none-eabi-
|
||||
MCU = cortex-m3
|
||||
MCU = cortex-m3
|
||||
OPT = s
|
||||
SDCARD = YES
|
||||
BUZZER = NO
|
||||
@@ -733,7 +733,7 @@ ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO))
|
||||
ifeq ($(SPORT_FILE_LOG), YES)
|
||||
CPPDEFS += -DSPORT_FILE_LOG
|
||||
endif
|
||||
INCDIRS += targets/sky9x CoOS/kernel CoOS/portable
|
||||
INCDIRS += targets/sky9x CoOS CoOS/kernel CoOS/portable
|
||||
GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp
|
||||
BOARDSRC = main_arm.cpp targets/sky9x/board_sky9x.cpp
|
||||
EXTRABOARDSRC = targets/sky9x/lcd_driver.cpp
|
||||
@@ -779,6 +779,7 @@ ifeq ($(PCB), TARANIS)
|
||||
LCDSIZE = 212
|
||||
GUIDIRECTORY = Taranis
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
MCU = cortex-m4
|
||||
FLAVOUR = taranis-x9e
|
||||
CPPDEFS = -DREVPLUS -DREV9E
|
||||
ifeq ($(LCD_DUAL_BUFFER), YES)
|
||||
@@ -787,6 +788,7 @@ ifeq ($(PCB), TARANIS)
|
||||
HAPTIC = YES
|
||||
EXTRABOARDSRC += targets/taranis/bluetooth_driver.cpp
|
||||
else ifeq ($(PCBREV), REVPLUS)
|
||||
MCU = cortex-m3
|
||||
FLAVOUR = taranis-plus
|
||||
CPPDEFS = -DREVPLUS
|
||||
ifeq ($(LCD_DUAL_BUFFER), YES)
|
||||
@@ -794,12 +796,15 @@ ifeq ($(PCB), TARANIS)
|
||||
endif
|
||||
HAPTIC = YES
|
||||
else ifeq ($(PCBREV), REV3)
|
||||
MCU = cortex-m3
|
||||
FLAVOUR = taranis
|
||||
CPPDEFS = -DREV3
|
||||
else ifeq ($(PCBREV), REV4a)
|
||||
MCU = cortex-m3
|
||||
FLAVOUR = taranis
|
||||
CPPDEFS = -DREV4a
|
||||
else
|
||||
MCU = cortex-m3
|
||||
FLAVOUR = taranis
|
||||
CPPDEFS = -DREV4
|
||||
endif
|
||||
@@ -829,7 +834,6 @@ ifeq ($(PCB), TARANIS)
|
||||
endif
|
||||
LDSCRIPT = targets/taranis/stm32_flash_bl.ld
|
||||
TRGT = arm-none-eabi-
|
||||
MCU = cortex-m3
|
||||
OPT = s
|
||||
CPPDEFS += -DHSE_VALUE=12000000
|
||||
BITMAPS += $(patsubst %.png,%.lbm,$(wildcard bitmaps/Taranis/*.png)) bitmaps/Taranis/mainmenu.lbm
|
||||
@@ -843,8 +847,13 @@ ifeq ($(PCB), TARANIS)
|
||||
PPM_CENTER_ADJUSTABLE = YES
|
||||
DSM2 = PPM
|
||||
CPPDEFS += -DPCBTARANIS -DCPUARM -DCPUSTM32 -DVIRTUALINPUTS -DLUAINPUTS -DXCURVES -DEEPROM_VARIANT=0 -DAUDIO -DPXX
|
||||
INCDIRS += targets/taranis CoOS/kernel CoOS/portable
|
||||
EXTRAINCDIRS += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/include
|
||||
INCDIRS += targets/taranis CoOS CoOS/kernel CoOS/portable
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
CPPDEFS += -DSTM32F40_41xxx
|
||||
EXTRAINCDIRS += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Include targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc
|
||||
else
|
||||
EXTRAINCDIRS += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/include
|
||||
endif
|
||||
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/inc
|
||||
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/hid/inc
|
||||
GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp
|
||||
@@ -857,17 +866,31 @@ ifeq ($(PCB), TARANIS)
|
||||
CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp
|
||||
CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/uart3_driver.cpp targets/taranis/telemetry_driver.cpp
|
||||
CPPSRC += bmp.cpp gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp loadboot.cpp debug.cpp
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dbgmcu.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dma.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rtc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_pwr.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_usart.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/misc.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c
|
||||
SRC += targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s
|
||||
else
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dbgmcu.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dma.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rtc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_pwr.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_usart.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s
|
||||
endif
|
||||
SRC += targets/taranis/usb_bsp.c targets/taranis/usbd_desc.c
|
||||
SRC += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_core.c
|
||||
SRC += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd.c
|
||||
@@ -1621,7 +1644,7 @@ OBJS = $(TMP:.s=.o)
|
||||
@echo
|
||||
@echo $(MSG_COMPILING) $@
|
||||
$(CC) $(ARMCPPFLAGS) $< -o allsrc.o
|
||||
$(CC) $(OBJS) allsrc.o -mcpu=cortex-m3 -mthumb -nostartfiles -lm -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref,--no-warn-mismatch,--gc-sections $(NEWLIB_NANO_FLAGS) -o $@
|
||||
$(CC) $(OBJS) allsrc.o -mcpu=$(MCU) -mthumb -nostartfiles -lm -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref,--no-warn-mismatch,--gc-sections $(NEWLIB_NANO_FLAGS) -o $@
|
||||
endif
|
||||
|
||||
# Target: clean project.
|
||||
|
||||
@@ -27,7 +27,11 @@ BINX = $(CP) -O binary
|
||||
|
||||
OBJDIR = .
|
||||
|
||||
MCU = cortex-m3
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
MCU = cortex-m4
|
||||
else
|
||||
MCU = cortex-m3
|
||||
endif
|
||||
|
||||
# List all default C defines here, like -D_DEBUG=1
|
||||
DDEFS =
|
||||
@@ -109,8 +113,16 @@ else
|
||||
CPPDEFS += -DHSE_VALUE=12000000
|
||||
CPPDEFS += -DPCBTARANIS
|
||||
FULL_PRJ = $(PROJECT)_ramBoot
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
CPPDEFS += -DSTM32F40_41xxx
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Include
|
||||
else
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/include
|
||||
endif
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/inc
|
||||
EXTRAINCDIRS += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc
|
||||
@@ -141,32 +153,40 @@ endif
|
||||
# Define ASM defines here
|
||||
UADEFS =
|
||||
|
||||
SRC =
|
||||
|
||||
ifeq ($(PCB), TARANIS)
|
||||
SRC = ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c \
|
||||
../targets/taranis/i2c.c \
|
||||
../targets/taranis/delays.c \
|
||||
../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c \
|
||||
../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c \
|
||||
../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c \
|
||||
../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c \
|
||||
../FatFs/ff.c \
|
||||
../FatFs/option/ccsbcs.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_core.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c \
|
||||
../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c \
|
||||
../targets/taranis/usbd_desc.c \
|
||||
../targets/taranis/aspi.c \
|
||||
../targets/taranis/usb_bsp.c \
|
||||
../targets/taranis/usb_driver.c \
|
||||
../targets/taranis/pwr_driver.c \
|
||||
init.c
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
SRC += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c
|
||||
SRC += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c
|
||||
SRC += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c
|
||||
SRC += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c
|
||||
SRC += ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/src/misc.c
|
||||
else
|
||||
SRC += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c
|
||||
SRC += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c
|
||||
SRC += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c
|
||||
SRC += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c
|
||||
SRC += ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c
|
||||
endif
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_core.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c
|
||||
SRC += ../targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c
|
||||
SRC += ../targets/taranis/i2c.c ../targets/taranis/delays.c
|
||||
SRC += ../FatFs/ff.c ../FatFs/option/ccsbcs.c
|
||||
SRC += ../targets/taranis/usbd_desc.c
|
||||
SRC += ../targets/taranis/aspi.c
|
||||
SRC += ../targets/taranis/usb_bsp.c
|
||||
SRC += ../targets/taranis/usb_driver.c
|
||||
SRC += ../targets/taranis/pwr_driver.c
|
||||
SRC += init.c
|
||||
|
||||
CPPSRC = ../targets/taranis/lcd_driver.cpp \
|
||||
../targets/taranis/configure_pins.cpp \
|
||||
@@ -186,7 +206,12 @@ ifeq ($(PCBREV), REV9E)
|
||||
endif
|
||||
|
||||
# List ASM source files here
|
||||
ASRC = ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s
|
||||
|
||||
ifeq ($(PCBREV), REV9E)
|
||||
ASRC = ../targets/taranis/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s
|
||||
else
|
||||
ASRC = ../targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s
|
||||
endif
|
||||
|
||||
else
|
||||
|
||||
|
||||
@@ -355,17 +355,22 @@ void menuChannelsView(uint8_t event);
|
||||
|
||||
#define KEY_MOVE_UP KEY_PLUS
|
||||
#define KEY_MOVE_DOWN KEY_MINUS
|
||||
|
||||
#if defined(REV9E)
|
||||
#define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_MINUS)
|
||||
#define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_PLUS)
|
||||
#define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_MINUS)
|
||||
#define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_PLUS)
|
||||
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_RIGHT
|
||||
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_LEFT
|
||||
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_RIGHT
|
||||
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_LEFT
|
||||
#else
|
||||
#define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_PLUS)
|
||||
#define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_MINUS)
|
||||
#define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_PLUS)
|
||||
#define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_MINUS)
|
||||
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_LEFT
|
||||
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_RIGHT
|
||||
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_LEFT
|
||||
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_RIGHT
|
||||
#endif
|
||||
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_LEFT
|
||||
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_RIGHT
|
||||
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_LEFT
|
||||
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_RIGHT
|
||||
|
||||
#define REPEAT_LAST_CURSOR_MOVE() { if (CURSOR_MOVED_LEFT(event) || CURSOR_MOVED_RIGHT(event)) putEvent(event); else m_posHorz = 0; }
|
||||
#define MOVE_CURSOR_FROM_HERE() if (m_posHorz > 0) REPEAT_LAST_CURSOR_MOVE()
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
#include "AT91SAM3S4.h"
|
||||
#elif defined(PCBTARANIS) && defined(REV9E)
|
||||
#include "stm32f4xx.h"
|
||||
#include "stm32f4xx_gpio.h"
|
||||
#elif defined(PCBTARANIS)
|
||||
#include "stm32f2xx.h"
|
||||
#include "stm32f2xx_gpio.h"
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f2xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
|
||||
|
||||
/** @addtogroup STM32F2xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+6
-4
@@ -12,15 +12,15 @@
|
||||
* is using in the C source code, usually in main.c. This file contains:
|
||||
* - Configuration section that allows to select:
|
||||
* - The device used in the target application
|
||||
* - To use or not the peripheral’s drivers in application code(i.e.
|
||||
* code will be based on direct access to peripheral’s registers
|
||||
* - To use or not the peripheral�s drivers in application code(i.e.
|
||||
* code will be based on direct access to peripheral�s registers
|
||||
* rather than drivers API), this option is controlled by
|
||||
* "#define USE_STDPERIPH_DRIVER"
|
||||
* - To change few application-specific parameters such as the HSE
|
||||
* crystal frequency
|
||||
* - Data structures and the address mapping for all peripherals
|
||||
* - Peripheral's registers declarations and bits definition
|
||||
* - Macros to access peripheral’s registers hardware
|
||||
* - Macros to access peripheral�s registers hardware
|
||||
*
|
||||
******************************************************************************
|
||||
* @attention
|
||||
@@ -53,6 +53,8 @@
|
||||
#ifndef __STM32F4xx_H
|
||||
#define __STM32F4xx_H
|
||||
|
||||
#define assert_param(xx)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
@@ -467,7 +469,7 @@ typedef enum IRQn
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
|
||||
#include "../../../../Include/core_cm4.h" /* Cortex-M4 processor and core peripherals */
|
||||
#include "system_stm32f4xx.h"
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
-438
@@ -1,438 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f40xx.s
|
||||
* @author MCD Application Team
|
||||
* @version V1.3.0
|
||||
* @date 08-November-2013
|
||||
* @brief STM32F401xx Devices vector table for RIDE7 toolchain.
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Configure the clock system
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor first
|
||||
* starts execution following a reset event. Only the absolutely
|
||||
* necessary set is performed, after which the application
|
||||
* supplied main() routine is called.
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M3. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* External Interrupts */
|
||||
.word WWDG_IRQHandler /* Window WatchDog */
|
||||
.word PVD_IRQHandler /* PVD through EXTI Line detection */
|
||||
.word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
|
||||
.word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
|
||||
.word FLASH_IRQHandler /* FLASH */
|
||||
.word RCC_IRQHandler /* RCC */
|
||||
.word EXTI0_IRQHandler /* EXTI Line0 */
|
||||
.word EXTI1_IRQHandler /* EXTI Line1 */
|
||||
.word EXTI2_IRQHandler /* EXTI Line2 */
|
||||
.word EXTI3_IRQHandler /* EXTI Line3 */
|
||||
.word EXTI4_IRQHandler /* EXTI Line4 */
|
||||
.word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
|
||||
.word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
|
||||
.word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
|
||||
.word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
|
||||
.word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
|
||||
.word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
|
||||
.word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
|
||||
.word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word EXTI9_5_IRQHandler /* External Line[9:5]s */
|
||||
.word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
|
||||
.word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
|
||||
.word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
|
||||
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
|
||||
.word TIM2_IRQHandler /* TIM2 */
|
||||
.word TIM3_IRQHandler /* TIM3 */
|
||||
.word TIM4_IRQHandler /* TIM4 */
|
||||
.word I2C1_EV_IRQHandler /* I2C1 Event */
|
||||
.word I2C1_ER_IRQHandler /* I2C1 Error */
|
||||
.word I2C2_EV_IRQHandler /* I2C2 Event */
|
||||
.word I2C2_ER_IRQHandler /* I2C2 Error */
|
||||
.word SPI1_IRQHandler /* SPI1 */
|
||||
.word SPI2_IRQHandler /* SPI2 */
|
||||
.word USART1_IRQHandler /* USART1 */
|
||||
.word USART2_IRQHandler /* USART2 */
|
||||
.word 0 /* Reserved */
|
||||
.word EXTI15_10_IRQHandler /* External Line[15:10]s */
|
||||
.word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
|
||||
.word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
|
||||
.word 0 /* Reserved */
|
||||
.word SDIO_IRQHandler /* SDIO */
|
||||
.word TIM5_IRQHandler /* TIM5 */
|
||||
.word SPI3_IRQHandler /* SPI3 */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
|
||||
.word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
|
||||
.word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
|
||||
.word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
|
||||
.word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word OTG_FS_IRQHandler /* USB OTG FS */
|
||||
.word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
|
||||
.word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
|
||||
.word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
|
||||
.word USART6_IRQHandler /* USART6 */
|
||||
.word I2C3_EV_IRQHandler /* I2C3 event */
|
||||
.word I2C3_ER_IRQHandler /* I2C3 error */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word FPU_IRQHandler /* FPU */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word SPI4_IRQHandler /* SPI4 */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak MemManage_Handler
|
||||
.thumb_set MemManage_Handler,Default_Handler
|
||||
|
||||
.weak BusFault_Handler
|
||||
.thumb_set BusFault_Handler,Default_Handler
|
||||
|
||||
.weak UsageFault_Handler
|
||||
.thumb_set UsageFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak DebugMon_Handler
|
||||
.thumb_set DebugMon_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak WWDG_IRQHandler
|
||||
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||
|
||||
.weak PVD_IRQHandler
|
||||
.thumb_set PVD_IRQHandler,Default_Handler
|
||||
|
||||
.weak TAMP_STAMP_IRQHandler
|
||||
.thumb_set TAMP_STAMP_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_WKUP_IRQHandler
|
||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak FLASH_IRQHandler
|
||||
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||
|
||||
.weak RCC_IRQHandler
|
||||
.thumb_set RCC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI0_IRQHandler
|
||||
.thumb_set EXTI0_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI1_IRQHandler
|
||||
.thumb_set EXTI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI2_IRQHandler
|
||||
.thumb_set EXTI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI3_IRQHandler
|
||||
.thumb_set EXTI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI4_IRQHandler
|
||||
.thumb_set EXTI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream0_IRQHandler
|
||||
.thumb_set DMA1_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream1_IRQHandler
|
||||
.thumb_set DMA1_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream2_IRQHandler
|
||||
.thumb_set DMA1_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream3_IRQHandler
|
||||
.thumb_set DMA1_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream4_IRQHandler
|
||||
.thumb_set DMA1_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream5_IRQHandler
|
||||
.thumb_set DMA1_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream6_IRQHandler
|
||||
.thumb_set DMA1_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak ADC_IRQHandler
|
||||
.thumb_set ADC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI9_5_IRQHandler
|
||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_BRK_TIM9_IRQHandler
|
||||
.thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_UP_TIM10_IRQHandler
|
||||
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_TRG_COM_TIM11_IRQHandler
|
||||
.thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_CC_IRQHandler
|
||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM2_IRQHandler
|
||||
.thumb_set TIM2_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM3_IRQHandler
|
||||
.thumb_set TIM3_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM4_IRQHandler
|
||||
.thumb_set TIM4_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_EV_IRQHandler
|
||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_ER_IRQHandler
|
||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_EV_IRQHandler
|
||||
.thumb_set I2C2_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_ER_IRQHandler
|
||||
.thumb_set I2C2_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI1_IRQHandler
|
||||
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI2_IRQHandler
|
||||
.thumb_set SPI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART1_IRQHandler
|
||||
.thumb_set USART1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART2_IRQHandler
|
||||
.thumb_set USART2_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI15_10_IRQHandler
|
||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_Alarm_IRQHandler
|
||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_WKUP_IRQHandler
|
||||
.thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream7_IRQHandler
|
||||
.thumb_set DMA1_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak SDIO_IRQHandler
|
||||
.thumb_set SDIO_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM5_IRQHandler
|
||||
.thumb_set TIM5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI3_IRQHandler
|
||||
.thumb_set SPI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream0_IRQHandler
|
||||
.thumb_set DMA2_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream1_IRQHandler
|
||||
.thumb_set DMA2_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream2_IRQHandler
|
||||
.thumb_set DMA2_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream3_IRQHandler
|
||||
.thumb_set DMA2_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream4_IRQHandler
|
||||
.thumb_set DMA2_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_IRQHandler
|
||||
.thumb_set OTG_FS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream5_IRQHandler
|
||||
.thumb_set DMA2_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream6_IRQHandler
|
||||
.thumb_set DMA2_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream7_IRQHandler
|
||||
.thumb_set DMA2_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART6_IRQHandler
|
||||
.thumb_set USART6_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_EV_IRQHandler
|
||||
.thumb_set I2C3_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_ER_IRQHandler
|
||||
.thumb_set I2C3_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak FPU_IRQHandler
|
||||
.thumb_set FPU_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI4_IRQHandler
|
||||
.thumb_set SPI4_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
+3
-1
@@ -100,7 +100,9 @@ LoopFillZerobss:
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
bl SystemInit
|
||||
/* Call C++ constructors for static objects */
|
||||
bl __libc_init_array
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
bx lr
|
||||
|
||||
-516
@@ -1,516 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f40xx.s
|
||||
* @author MCD Application Team
|
||||
* @version V1.3.0
|
||||
* @date 08-November-2013
|
||||
* @brief STM32F40xxx/41xxx Devices vector table for RIDE7 toolchain.
|
||||
* Same as startup_stm32f40xx.s and maintained for legacy purpose
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Configure the clock system and the external SRAM mounted on
|
||||
* STM324xG-EVAL board to be used as data memory (optional,
|
||||
* to be enabled by user)
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor first
|
||||
* starts execution following a reset event. Only the absolutely
|
||||
* necessary set is performed, after which the application
|
||||
* supplied main() routine is called.
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M3. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* External Interrupts */
|
||||
.word WWDG_IRQHandler /* Window WatchDog */
|
||||
.word PVD_IRQHandler /* PVD through EXTI Line detection */
|
||||
.word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
|
||||
.word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
|
||||
.word FLASH_IRQHandler /* FLASH */
|
||||
.word RCC_IRQHandler /* RCC */
|
||||
.word EXTI0_IRQHandler /* EXTI Line0 */
|
||||
.word EXTI1_IRQHandler /* EXTI Line1 */
|
||||
.word EXTI2_IRQHandler /* EXTI Line2 */
|
||||
.word EXTI3_IRQHandler /* EXTI Line3 */
|
||||
.word EXTI4_IRQHandler /* EXTI Line4 */
|
||||
.word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
|
||||
.word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
|
||||
.word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
|
||||
.word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
|
||||
.word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
|
||||
.word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
|
||||
.word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
|
||||
.word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
|
||||
.word CAN1_TX_IRQHandler /* CAN1 TX */
|
||||
.word CAN1_RX0_IRQHandler /* CAN1 RX0 */
|
||||
.word CAN1_RX1_IRQHandler /* CAN1 RX1 */
|
||||
.word CAN1_SCE_IRQHandler /* CAN1 SCE */
|
||||
.word EXTI9_5_IRQHandler /* External Line[9:5]s */
|
||||
.word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
|
||||
.word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
|
||||
.word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
|
||||
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
|
||||
.word TIM2_IRQHandler /* TIM2 */
|
||||
.word TIM3_IRQHandler /* TIM3 */
|
||||
.word TIM4_IRQHandler /* TIM4 */
|
||||
.word I2C1_EV_IRQHandler /* I2C1 Event */
|
||||
.word I2C1_ER_IRQHandler /* I2C1 Error */
|
||||
.word I2C2_EV_IRQHandler /* I2C2 Event */
|
||||
.word I2C2_ER_IRQHandler /* I2C2 Error */
|
||||
.word SPI1_IRQHandler /* SPI1 */
|
||||
.word SPI2_IRQHandler /* SPI2 */
|
||||
.word USART1_IRQHandler /* USART1 */
|
||||
.word USART2_IRQHandler /* USART2 */
|
||||
.word USART3_IRQHandler /* USART3 */
|
||||
.word EXTI15_10_IRQHandler /* External Line[15:10]s */
|
||||
.word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
|
||||
.word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
|
||||
.word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
|
||||
.word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
|
||||
.word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
|
||||
.word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
|
||||
.word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
|
||||
.word FSMC_IRQHandler /* FSMC */
|
||||
.word SDIO_IRQHandler /* SDIO */
|
||||
.word TIM5_IRQHandler /* TIM5 */
|
||||
.word SPI3_IRQHandler /* SPI3 */
|
||||
.word UART4_IRQHandler /* UART4 */
|
||||
.word UART5_IRQHandler /* UART5 */
|
||||
.word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
|
||||
.word TIM7_IRQHandler /* TIM7 */
|
||||
.word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
|
||||
.word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
|
||||
.word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
|
||||
.word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
|
||||
.word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
|
||||
.word ETH_IRQHandler /* Ethernet */
|
||||
.word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */
|
||||
.word CAN2_TX_IRQHandler /* CAN2 TX */
|
||||
.word CAN2_RX0_IRQHandler /* CAN2 RX0 */
|
||||
.word CAN2_RX1_IRQHandler /* CAN2 RX1 */
|
||||
.word CAN2_SCE_IRQHandler /* CAN2 SCE */
|
||||
.word OTG_FS_IRQHandler /* USB OTG FS */
|
||||
.word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
|
||||
.word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
|
||||
.word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
|
||||
.word USART6_IRQHandler /* USART6 */
|
||||
.word I2C3_EV_IRQHandler /* I2C3 event */
|
||||
.word I2C3_ER_IRQHandler /* I2C3 error */
|
||||
.word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
|
||||
.word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
|
||||
.word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
|
||||
.word OTG_HS_IRQHandler /* USB OTG HS */
|
||||
.word DCMI_IRQHandler /* DCMI */
|
||||
.word CRYP_IRQHandler /* CRYP crypto */
|
||||
.word HASH_RNG_IRQHandler /* Hash and Rng */
|
||||
.word FPU_IRQHandler /* FPU */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak MemManage_Handler
|
||||
.thumb_set MemManage_Handler,Default_Handler
|
||||
|
||||
.weak BusFault_Handler
|
||||
.thumb_set BusFault_Handler,Default_Handler
|
||||
|
||||
.weak UsageFault_Handler
|
||||
.thumb_set UsageFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak DebugMon_Handler
|
||||
.thumb_set DebugMon_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak WWDG_IRQHandler
|
||||
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||
|
||||
.weak PVD_IRQHandler
|
||||
.thumb_set PVD_IRQHandler,Default_Handler
|
||||
|
||||
.weak TAMP_STAMP_IRQHandler
|
||||
.thumb_set TAMP_STAMP_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_WKUP_IRQHandler
|
||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak FLASH_IRQHandler
|
||||
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||
|
||||
.weak RCC_IRQHandler
|
||||
.thumb_set RCC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI0_IRQHandler
|
||||
.thumb_set EXTI0_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI1_IRQHandler
|
||||
.thumb_set EXTI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI2_IRQHandler
|
||||
.thumb_set EXTI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI3_IRQHandler
|
||||
.thumb_set EXTI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI4_IRQHandler
|
||||
.thumb_set EXTI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream0_IRQHandler
|
||||
.thumb_set DMA1_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream1_IRQHandler
|
||||
.thumb_set DMA1_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream2_IRQHandler
|
||||
.thumb_set DMA1_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream3_IRQHandler
|
||||
.thumb_set DMA1_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream4_IRQHandler
|
||||
.thumb_set DMA1_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream5_IRQHandler
|
||||
.thumb_set DMA1_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream6_IRQHandler
|
||||
.thumb_set DMA1_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak ADC_IRQHandler
|
||||
.thumb_set ADC_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_TX_IRQHandler
|
||||
.thumb_set CAN1_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX0_IRQHandler
|
||||
.thumb_set CAN1_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX1_IRQHandler
|
||||
.thumb_set CAN1_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_SCE_IRQHandler
|
||||
.thumb_set CAN1_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI9_5_IRQHandler
|
||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_BRK_TIM9_IRQHandler
|
||||
.thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_UP_TIM10_IRQHandler
|
||||
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_TRG_COM_TIM11_IRQHandler
|
||||
.thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_CC_IRQHandler
|
||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM2_IRQHandler
|
||||
.thumb_set TIM2_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM3_IRQHandler
|
||||
.thumb_set TIM3_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM4_IRQHandler
|
||||
.thumb_set TIM4_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_EV_IRQHandler
|
||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_ER_IRQHandler
|
||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_EV_IRQHandler
|
||||
.thumb_set I2C2_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_ER_IRQHandler
|
||||
.thumb_set I2C2_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI1_IRQHandler
|
||||
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI2_IRQHandler
|
||||
.thumb_set SPI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART1_IRQHandler
|
||||
.thumb_set USART1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART2_IRQHandler
|
||||
.thumb_set USART2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART3_IRQHandler
|
||||
.thumb_set USART3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI15_10_IRQHandler
|
||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_Alarm_IRQHandler
|
||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_WKUP_IRQHandler
|
||||
.thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_BRK_TIM12_IRQHandler
|
||||
.thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_UP_TIM13_IRQHandler
|
||||
.thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_TRG_COM_TIM14_IRQHandler
|
||||
.thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_CC_IRQHandler
|
||||
.thumb_set TIM8_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream7_IRQHandler
|
||||
.thumb_set DMA1_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak FSMC_IRQHandler
|
||||
.thumb_set FSMC_IRQHandler,Default_Handler
|
||||
|
||||
.weak SDIO_IRQHandler
|
||||
.thumb_set SDIO_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM5_IRQHandler
|
||||
.thumb_set TIM5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI3_IRQHandler
|
||||
.thumb_set SPI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART4_IRQHandler
|
||||
.thumb_set UART4_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART5_IRQHandler
|
||||
.thumb_set UART5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM6_DAC_IRQHandler
|
||||
.thumb_set TIM6_DAC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM7_IRQHandler
|
||||
.thumb_set TIM7_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream0_IRQHandler
|
||||
.thumb_set DMA2_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream1_IRQHandler
|
||||
.thumb_set DMA2_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream2_IRQHandler
|
||||
.thumb_set DMA2_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream3_IRQHandler
|
||||
.thumb_set DMA2_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream4_IRQHandler
|
||||
.thumb_set DMA2_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_IRQHandler
|
||||
.thumb_set ETH_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_WKUP_IRQHandler
|
||||
.thumb_set ETH_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_TX_IRQHandler
|
||||
.thumb_set CAN2_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX0_IRQHandler
|
||||
.thumb_set CAN2_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX1_IRQHandler
|
||||
.thumb_set CAN2_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_SCE_IRQHandler
|
||||
.thumb_set CAN2_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_IRQHandler
|
||||
.thumb_set OTG_FS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream5_IRQHandler
|
||||
.thumb_set DMA2_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream6_IRQHandler
|
||||
.thumb_set DMA2_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream7_IRQHandler
|
||||
.thumb_set DMA2_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART6_IRQHandler
|
||||
.thumb_set USART6_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_EV_IRQHandler
|
||||
.thumb_set I2C3_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_ER_IRQHandler
|
||||
.thumb_set I2C3_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_OUT_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_IN_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_WKUP_IRQHandler
|
||||
.thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_IRQHandler
|
||||
.thumb_set OTG_HS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DCMI_IRQHandler
|
||||
.thumb_set DCMI_IRQHandler,Default_Handler
|
||||
|
||||
.weak CRYP_IRQHandler
|
||||
.thumb_set CRYP_IRQHandler,Default_Handler
|
||||
|
||||
.weak HASH_RNG_IRQHandler
|
||||
.thumb_set HASH_RNG_IRQHandler,Default_Handler
|
||||
|
||||
.weak FPU_IRQHandler
|
||||
.thumb_set FPU_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
-551
@@ -1,551 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f427_437xx.s
|
||||
* @author MCD Application Team
|
||||
* @version V1.3.0
|
||||
* @date 08-November-2013
|
||||
* @brief STM32F427xx/437xx Devices vector table for RIDE7 toolchain.
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Configure the clock system and the external SRAM mounted on
|
||||
* STM324x7I-EVAL board to be used as data memory (optional,
|
||||
* to be enabled by user)
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor first
|
||||
* starts execution following a reset event. Only the absolutely
|
||||
* necessary set is performed, after which the application
|
||||
* supplied main() routine is called.
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M3. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* External Interrupts */
|
||||
.word WWDG_IRQHandler /* Window WatchDog */
|
||||
.word PVD_IRQHandler /* PVD through EXTI Line detection */
|
||||
.word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
|
||||
.word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
|
||||
.word FLASH_IRQHandler /* FLASH */
|
||||
.word RCC_IRQHandler /* RCC */
|
||||
.word EXTI0_IRQHandler /* EXTI Line0 */
|
||||
.word EXTI1_IRQHandler /* EXTI Line1 */
|
||||
.word EXTI2_IRQHandler /* EXTI Line2 */
|
||||
.word EXTI3_IRQHandler /* EXTI Line3 */
|
||||
.word EXTI4_IRQHandler /* EXTI Line4 */
|
||||
.word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
|
||||
.word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
|
||||
.word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
|
||||
.word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
|
||||
.word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
|
||||
.word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
|
||||
.word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
|
||||
.word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
|
||||
.word CAN1_TX_IRQHandler /* CAN1 TX */
|
||||
.word CAN1_RX0_IRQHandler /* CAN1 RX0 */
|
||||
.word CAN1_RX1_IRQHandler /* CAN1 RX1 */
|
||||
.word CAN1_SCE_IRQHandler /* CAN1 SCE */
|
||||
.word EXTI9_5_IRQHandler /* External Line[9:5]s */
|
||||
.word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
|
||||
.word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
|
||||
.word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
|
||||
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
|
||||
.word TIM2_IRQHandler /* TIM2 */
|
||||
.word TIM3_IRQHandler /* TIM3 */
|
||||
.word TIM4_IRQHandler /* TIM4 */
|
||||
.word I2C1_EV_IRQHandler /* I2C1 Event */
|
||||
.word I2C1_ER_IRQHandler /* I2C1 Error */
|
||||
.word I2C2_EV_IRQHandler /* I2C2 Event */
|
||||
.word I2C2_ER_IRQHandler /* I2C2 Error */
|
||||
.word SPI1_IRQHandler /* SPI1 */
|
||||
.word SPI2_IRQHandler /* SPI2 */
|
||||
.word USART1_IRQHandler /* USART1 */
|
||||
.word USART2_IRQHandler /* USART2 */
|
||||
.word USART3_IRQHandler /* USART3 */
|
||||
.word EXTI15_10_IRQHandler /* External Line[15:10]s */
|
||||
.word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
|
||||
.word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
|
||||
.word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
|
||||
.word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
|
||||
.word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
|
||||
.word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
|
||||
.word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
|
||||
.word FSMC_IRQHandler /* FSMC */
|
||||
.word SDIO_IRQHandler /* SDIO */
|
||||
.word TIM5_IRQHandler /* TIM5 */
|
||||
.word SPI3_IRQHandler /* SPI3 */
|
||||
.word UART4_IRQHandler /* UART4 */
|
||||
.word UART5_IRQHandler /* UART5 */
|
||||
.word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
|
||||
.word TIM7_IRQHandler /* TIM7 */
|
||||
.word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
|
||||
.word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
|
||||
.word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
|
||||
.word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
|
||||
.word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
|
||||
.word ETH_IRQHandler /* Ethernet */
|
||||
.word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */
|
||||
.word CAN2_TX_IRQHandler /* CAN2 TX */
|
||||
.word CAN2_RX0_IRQHandler /* CAN2 RX0 */
|
||||
.word CAN2_RX1_IRQHandler /* CAN2 RX1 */
|
||||
.word CAN2_SCE_IRQHandler /* CAN2 SCE */
|
||||
.word OTG_FS_IRQHandler /* USB OTG FS */
|
||||
.word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
|
||||
.word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
|
||||
.word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
|
||||
.word USART6_IRQHandler /* USART6 */
|
||||
.word I2C3_EV_IRQHandler /* I2C3 event */
|
||||
.word I2C3_ER_IRQHandler /* I2C3 error */
|
||||
.word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
|
||||
.word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
|
||||
.word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
|
||||
.word OTG_HS_IRQHandler /* USB OTG HS */
|
||||
.word DCMI_IRQHandler /* DCMI */
|
||||
.word CRYP_IRQHandler /* CRYP crypto */
|
||||
.word HASH_RNG_IRQHandler /* Hash and Rng */
|
||||
.word FPU_IRQHandler /* FPU */
|
||||
.word UART7_IRQHandler /* UART7 */
|
||||
.word UART8_IRQHandler /* UART8 */
|
||||
.word SPI4_IRQHandler /* SPI4 */
|
||||
.word SPI5_IRQHandler /* SPI5 */
|
||||
.word SPI6_IRQHandler /* SPI6 */
|
||||
.word SAI1_IRQHandler /* SAI1 */
|
||||
.word LTDC_IRQHandler /* LTDC */
|
||||
.word LTDC_ER_IRQHandler /* LTDC error */
|
||||
.word DMA2D_IRQHandler /* DMA2D */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak MemManage_Handler
|
||||
.thumb_set MemManage_Handler,Default_Handler
|
||||
|
||||
.weak BusFault_Handler
|
||||
.thumb_set BusFault_Handler,Default_Handler
|
||||
|
||||
.weak UsageFault_Handler
|
||||
.thumb_set UsageFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak DebugMon_Handler
|
||||
.thumb_set DebugMon_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak WWDG_IRQHandler
|
||||
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||
|
||||
.weak PVD_IRQHandler
|
||||
.thumb_set PVD_IRQHandler,Default_Handler
|
||||
|
||||
.weak TAMP_STAMP_IRQHandler
|
||||
.thumb_set TAMP_STAMP_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_WKUP_IRQHandler
|
||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak FLASH_IRQHandler
|
||||
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||
|
||||
.weak RCC_IRQHandler
|
||||
.thumb_set RCC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI0_IRQHandler
|
||||
.thumb_set EXTI0_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI1_IRQHandler
|
||||
.thumb_set EXTI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI2_IRQHandler
|
||||
.thumb_set EXTI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI3_IRQHandler
|
||||
.thumb_set EXTI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI4_IRQHandler
|
||||
.thumb_set EXTI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream0_IRQHandler
|
||||
.thumb_set DMA1_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream1_IRQHandler
|
||||
.thumb_set DMA1_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream2_IRQHandler
|
||||
.thumb_set DMA1_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream3_IRQHandler
|
||||
.thumb_set DMA1_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream4_IRQHandler
|
||||
.thumb_set DMA1_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream5_IRQHandler
|
||||
.thumb_set DMA1_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream6_IRQHandler
|
||||
.thumb_set DMA1_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak ADC_IRQHandler
|
||||
.thumb_set ADC_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_TX_IRQHandler
|
||||
.thumb_set CAN1_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX0_IRQHandler
|
||||
.thumb_set CAN1_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX1_IRQHandler
|
||||
.thumb_set CAN1_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_SCE_IRQHandler
|
||||
.thumb_set CAN1_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI9_5_IRQHandler
|
||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_BRK_TIM9_IRQHandler
|
||||
.thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_UP_TIM10_IRQHandler
|
||||
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_TRG_COM_TIM11_IRQHandler
|
||||
.thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_CC_IRQHandler
|
||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM2_IRQHandler
|
||||
.thumb_set TIM2_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM3_IRQHandler
|
||||
.thumb_set TIM3_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM4_IRQHandler
|
||||
.thumb_set TIM4_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_EV_IRQHandler
|
||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_ER_IRQHandler
|
||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_EV_IRQHandler
|
||||
.thumb_set I2C2_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_ER_IRQHandler
|
||||
.thumb_set I2C2_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI1_IRQHandler
|
||||
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI2_IRQHandler
|
||||
.thumb_set SPI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART1_IRQHandler
|
||||
.thumb_set USART1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART2_IRQHandler
|
||||
.thumb_set USART2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART3_IRQHandler
|
||||
.thumb_set USART3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI15_10_IRQHandler
|
||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_Alarm_IRQHandler
|
||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_WKUP_IRQHandler
|
||||
.thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_BRK_TIM12_IRQHandler
|
||||
.thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_UP_TIM13_IRQHandler
|
||||
.thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_TRG_COM_TIM14_IRQHandler
|
||||
.thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_CC_IRQHandler
|
||||
.thumb_set TIM8_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream7_IRQHandler
|
||||
.thumb_set DMA1_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak FSMC_IRQHandler
|
||||
.thumb_set FSMC_IRQHandler,Default_Handler
|
||||
|
||||
.weak SDIO_IRQHandler
|
||||
.thumb_set SDIO_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM5_IRQHandler
|
||||
.thumb_set TIM5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI3_IRQHandler
|
||||
.thumb_set SPI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART4_IRQHandler
|
||||
.thumb_set UART4_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART5_IRQHandler
|
||||
.thumb_set UART5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM6_DAC_IRQHandler
|
||||
.thumb_set TIM6_DAC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM7_IRQHandler
|
||||
.thumb_set TIM7_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream0_IRQHandler
|
||||
.thumb_set DMA2_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream1_IRQHandler
|
||||
.thumb_set DMA2_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream2_IRQHandler
|
||||
.thumb_set DMA2_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream3_IRQHandler
|
||||
.thumb_set DMA2_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream4_IRQHandler
|
||||
.thumb_set DMA2_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_IRQHandler
|
||||
.thumb_set ETH_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_WKUP_IRQHandler
|
||||
.thumb_set ETH_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_TX_IRQHandler
|
||||
.thumb_set CAN2_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX0_IRQHandler
|
||||
.thumb_set CAN2_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX1_IRQHandler
|
||||
.thumb_set CAN2_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_SCE_IRQHandler
|
||||
.thumb_set CAN2_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_IRQHandler
|
||||
.thumb_set OTG_FS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream5_IRQHandler
|
||||
.thumb_set DMA2_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream6_IRQHandler
|
||||
.thumb_set DMA2_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream7_IRQHandler
|
||||
.thumb_set DMA2_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART6_IRQHandler
|
||||
.thumb_set USART6_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_EV_IRQHandler
|
||||
.thumb_set I2C3_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_ER_IRQHandler
|
||||
.thumb_set I2C3_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_OUT_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_IN_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_WKUP_IRQHandler
|
||||
.thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_IRQHandler
|
||||
.thumb_set OTG_HS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DCMI_IRQHandler
|
||||
.thumb_set DCMI_IRQHandler,Default_Handler
|
||||
|
||||
.weak CRYP_IRQHandler
|
||||
.thumb_set CRYP_IRQHandler,Default_Handler
|
||||
|
||||
.weak HASH_RNG_IRQHandler
|
||||
.thumb_set HASH_RNG_IRQHandler,Default_Handler
|
||||
|
||||
.weak FPU_IRQHandler
|
||||
.thumb_set FPU_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART7_IRQHandler
|
||||
.thumb_set UART7_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART8_IRQHandler
|
||||
.thumb_set UART8_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI4_IRQHandler
|
||||
.thumb_set SPI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI5_IRQHandler
|
||||
.thumb_set SPI5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI6_IRQHandler
|
||||
.thumb_set SPI6_IRQHandler,Default_Handler
|
||||
|
||||
.weak SAI1_IRQHandler
|
||||
.thumb_set SAI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak LTDC_IRQHandler
|
||||
.thumb_set LTDC_IRQHandler,Default_Handler
|
||||
|
||||
.weak LTDC_ER_IRQHandler
|
||||
.thumb_set LTDC_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2D_IRQHandler
|
||||
.thumb_set DMA2D_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
-552
@@ -1,552 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f427x.s
|
||||
* @author MCD Application Team
|
||||
* @version V1.3.0
|
||||
* @date 08-November-2013
|
||||
* @brief STM32F427xx/437xx Devices vector table for RIDE7 toolchain.
|
||||
* Same as startup_stm32f427_437xx.s and maintained for legacy purpose
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Configure the clock system and the external SRAM mounted on
|
||||
* STM324x7I-EVAL board to be used as data memory
|
||||
* (optional, to be enabled by user)
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor first
|
||||
* starts execution following a reset event. Only the absolutely
|
||||
* necessary set is performed, after which the application
|
||||
* supplied main() routine is called.
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M3. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* External Interrupts */
|
||||
.word WWDG_IRQHandler /* Window WatchDog */
|
||||
.word PVD_IRQHandler /* PVD through EXTI Line detection */
|
||||
.word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
|
||||
.word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
|
||||
.word FLASH_IRQHandler /* FLASH */
|
||||
.word RCC_IRQHandler /* RCC */
|
||||
.word EXTI0_IRQHandler /* EXTI Line0 */
|
||||
.word EXTI1_IRQHandler /* EXTI Line1 */
|
||||
.word EXTI2_IRQHandler /* EXTI Line2 */
|
||||
.word EXTI3_IRQHandler /* EXTI Line3 */
|
||||
.word EXTI4_IRQHandler /* EXTI Line4 */
|
||||
.word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
|
||||
.word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
|
||||
.word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
|
||||
.word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
|
||||
.word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
|
||||
.word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
|
||||
.word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
|
||||
.word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
|
||||
.word CAN1_TX_IRQHandler /* CAN1 TX */
|
||||
.word CAN1_RX0_IRQHandler /* CAN1 RX0 */
|
||||
.word CAN1_RX1_IRQHandler /* CAN1 RX1 */
|
||||
.word CAN1_SCE_IRQHandler /* CAN1 SCE */
|
||||
.word EXTI9_5_IRQHandler /* External Line[9:5]s */
|
||||
.word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
|
||||
.word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
|
||||
.word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
|
||||
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
|
||||
.word TIM2_IRQHandler /* TIM2 */
|
||||
.word TIM3_IRQHandler /* TIM3 */
|
||||
.word TIM4_IRQHandler /* TIM4 */
|
||||
.word I2C1_EV_IRQHandler /* I2C1 Event */
|
||||
.word I2C1_ER_IRQHandler /* I2C1 Error */
|
||||
.word I2C2_EV_IRQHandler /* I2C2 Event */
|
||||
.word I2C2_ER_IRQHandler /* I2C2 Error */
|
||||
.word SPI1_IRQHandler /* SPI1 */
|
||||
.word SPI2_IRQHandler /* SPI2 */
|
||||
.word USART1_IRQHandler /* USART1 */
|
||||
.word USART2_IRQHandler /* USART2 */
|
||||
.word USART3_IRQHandler /* USART3 */
|
||||
.word EXTI15_10_IRQHandler /* External Line[15:10]s */
|
||||
.word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
|
||||
.word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
|
||||
.word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
|
||||
.word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
|
||||
.word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
|
||||
.word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
|
||||
.word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
|
||||
.word FSMC_IRQHandler /* FSMC */
|
||||
.word SDIO_IRQHandler /* SDIO */
|
||||
.word TIM5_IRQHandler /* TIM5 */
|
||||
.word SPI3_IRQHandler /* SPI3 */
|
||||
.word UART4_IRQHandler /* UART4 */
|
||||
.word UART5_IRQHandler /* UART5 */
|
||||
.word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
|
||||
.word TIM7_IRQHandler /* TIM7 */
|
||||
.word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
|
||||
.word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
|
||||
.word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
|
||||
.word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
|
||||
.word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
|
||||
.word ETH_IRQHandler /* Ethernet */
|
||||
.word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */
|
||||
.word CAN2_TX_IRQHandler /* CAN2 TX */
|
||||
.word CAN2_RX0_IRQHandler /* CAN2 RX0 */
|
||||
.word CAN2_RX1_IRQHandler /* CAN2 RX1 */
|
||||
.word CAN2_SCE_IRQHandler /* CAN2 SCE */
|
||||
.word OTG_FS_IRQHandler /* USB OTG FS */
|
||||
.word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
|
||||
.word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
|
||||
.word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
|
||||
.word USART6_IRQHandler /* USART6 */
|
||||
.word I2C3_EV_IRQHandler /* I2C3 event */
|
||||
.word I2C3_ER_IRQHandler /* I2C3 error */
|
||||
.word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
|
||||
.word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
|
||||
.word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
|
||||
.word OTG_HS_IRQHandler /* USB OTG HS */
|
||||
.word DCMI_IRQHandler /* DCMI */
|
||||
.word CRYP_IRQHandler /* CRYP crypto */
|
||||
.word HASH_RNG_IRQHandler /* Hash and Rng */
|
||||
.word FPU_IRQHandler /* FPU */
|
||||
.word UART7_IRQHandler /* UART7 */
|
||||
.word UART8_IRQHandler /* UART8 */
|
||||
.word SPI4_IRQHandler /* SPI4 */
|
||||
.word SPI5_IRQHandler /* SPI5 */
|
||||
.word SPI6_IRQHandler /* SPI6 */
|
||||
.word SAI1_IRQHandler /* SAI1 */
|
||||
.word LTDC_IRQHandler /* LTDC */
|
||||
.word LTDC_ER_IRQHandler /* LTDC error */
|
||||
.word DMA2D_IRQHandler /* DMA2D */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak MemManage_Handler
|
||||
.thumb_set MemManage_Handler,Default_Handler
|
||||
|
||||
.weak BusFault_Handler
|
||||
.thumb_set BusFault_Handler,Default_Handler
|
||||
|
||||
.weak UsageFault_Handler
|
||||
.thumb_set UsageFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak DebugMon_Handler
|
||||
.thumb_set DebugMon_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak WWDG_IRQHandler
|
||||
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||
|
||||
.weak PVD_IRQHandler
|
||||
.thumb_set PVD_IRQHandler,Default_Handler
|
||||
|
||||
.weak TAMP_STAMP_IRQHandler
|
||||
.thumb_set TAMP_STAMP_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_WKUP_IRQHandler
|
||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak FLASH_IRQHandler
|
||||
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||
|
||||
.weak RCC_IRQHandler
|
||||
.thumb_set RCC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI0_IRQHandler
|
||||
.thumb_set EXTI0_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI1_IRQHandler
|
||||
.thumb_set EXTI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI2_IRQHandler
|
||||
.thumb_set EXTI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI3_IRQHandler
|
||||
.thumb_set EXTI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI4_IRQHandler
|
||||
.thumb_set EXTI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream0_IRQHandler
|
||||
.thumb_set DMA1_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream1_IRQHandler
|
||||
.thumb_set DMA1_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream2_IRQHandler
|
||||
.thumb_set DMA1_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream3_IRQHandler
|
||||
.thumb_set DMA1_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream4_IRQHandler
|
||||
.thumb_set DMA1_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream5_IRQHandler
|
||||
.thumb_set DMA1_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream6_IRQHandler
|
||||
.thumb_set DMA1_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak ADC_IRQHandler
|
||||
.thumb_set ADC_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_TX_IRQHandler
|
||||
.thumb_set CAN1_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX0_IRQHandler
|
||||
.thumb_set CAN1_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX1_IRQHandler
|
||||
.thumb_set CAN1_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_SCE_IRQHandler
|
||||
.thumb_set CAN1_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI9_5_IRQHandler
|
||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_BRK_TIM9_IRQHandler
|
||||
.thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_UP_TIM10_IRQHandler
|
||||
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_TRG_COM_TIM11_IRQHandler
|
||||
.thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_CC_IRQHandler
|
||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM2_IRQHandler
|
||||
.thumb_set TIM2_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM3_IRQHandler
|
||||
.thumb_set TIM3_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM4_IRQHandler
|
||||
.thumb_set TIM4_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_EV_IRQHandler
|
||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_ER_IRQHandler
|
||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_EV_IRQHandler
|
||||
.thumb_set I2C2_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_ER_IRQHandler
|
||||
.thumb_set I2C2_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI1_IRQHandler
|
||||
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI2_IRQHandler
|
||||
.thumb_set SPI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART1_IRQHandler
|
||||
.thumb_set USART1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART2_IRQHandler
|
||||
.thumb_set USART2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART3_IRQHandler
|
||||
.thumb_set USART3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI15_10_IRQHandler
|
||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_Alarm_IRQHandler
|
||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_WKUP_IRQHandler
|
||||
.thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_BRK_TIM12_IRQHandler
|
||||
.thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_UP_TIM13_IRQHandler
|
||||
.thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_TRG_COM_TIM14_IRQHandler
|
||||
.thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_CC_IRQHandler
|
||||
.thumb_set TIM8_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream7_IRQHandler
|
||||
.thumb_set DMA1_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak FSMC_IRQHandler
|
||||
.thumb_set FSMC_IRQHandler,Default_Handler
|
||||
|
||||
.weak SDIO_IRQHandler
|
||||
.thumb_set SDIO_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM5_IRQHandler
|
||||
.thumb_set TIM5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI3_IRQHandler
|
||||
.thumb_set SPI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART4_IRQHandler
|
||||
.thumb_set UART4_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART5_IRQHandler
|
||||
.thumb_set UART5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM6_DAC_IRQHandler
|
||||
.thumb_set TIM6_DAC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM7_IRQHandler
|
||||
.thumb_set TIM7_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream0_IRQHandler
|
||||
.thumb_set DMA2_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream1_IRQHandler
|
||||
.thumb_set DMA2_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream2_IRQHandler
|
||||
.thumb_set DMA2_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream3_IRQHandler
|
||||
.thumb_set DMA2_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream4_IRQHandler
|
||||
.thumb_set DMA2_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_IRQHandler
|
||||
.thumb_set ETH_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_WKUP_IRQHandler
|
||||
.thumb_set ETH_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_TX_IRQHandler
|
||||
.thumb_set CAN2_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX0_IRQHandler
|
||||
.thumb_set CAN2_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX1_IRQHandler
|
||||
.thumb_set CAN2_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_SCE_IRQHandler
|
||||
.thumb_set CAN2_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_IRQHandler
|
||||
.thumb_set OTG_FS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream5_IRQHandler
|
||||
.thumb_set DMA2_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream6_IRQHandler
|
||||
.thumb_set DMA2_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream7_IRQHandler
|
||||
.thumb_set DMA2_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART6_IRQHandler
|
||||
.thumb_set USART6_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_EV_IRQHandler
|
||||
.thumb_set I2C3_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_ER_IRQHandler
|
||||
.thumb_set I2C3_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_OUT_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_IN_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_WKUP_IRQHandler
|
||||
.thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_IRQHandler
|
||||
.thumb_set OTG_HS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DCMI_IRQHandler
|
||||
.thumb_set DCMI_IRQHandler,Default_Handler
|
||||
|
||||
.weak CRYP_IRQHandler
|
||||
.thumb_set CRYP_IRQHandler,Default_Handler
|
||||
|
||||
.weak HASH_RNG_IRQHandler
|
||||
.thumb_set HASH_RNG_IRQHandler,Default_Handler
|
||||
|
||||
.weak FPU_IRQHandler
|
||||
.thumb_set FPU_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART7_IRQHandler
|
||||
.thumb_set UART7_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART8_IRQHandler
|
||||
.thumb_set UART8_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI4_IRQHandler
|
||||
.thumb_set SPI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI5_IRQHandler
|
||||
.thumb_set SPI5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI6_IRQHandler
|
||||
.thumb_set SPI6_IRQHandler,Default_Handler
|
||||
|
||||
.weak SAI1_IRQHandler
|
||||
.thumb_set SAI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak LTDC_IRQHandler
|
||||
.thumb_set LTDC_IRQHandler,Default_Handler
|
||||
|
||||
.weak LTDC_ER_IRQHandler
|
||||
.thumb_set LTDC_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2D_IRQHandler
|
||||
.thumb_set DMA2D_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
-551
@@ -1,551 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f429_439xx.s
|
||||
* @author MCD Application Team
|
||||
* @version V1.3.0
|
||||
* @date 08-November-2013
|
||||
* @brief STM32F429xx/439xx Devices vector table for RIDE7 toolchain.
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Configure the clock system and the external SRAM mounted on
|
||||
* STM324x9I-EVAL board to be used as data memory (optional,
|
||||
* to be enabled by user)
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor first
|
||||
* starts execution following a reset event. Only the absolutely
|
||||
* necessary set is performed, after which the application
|
||||
* supplied main() routine is called.
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M3. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* External Interrupts */
|
||||
.word WWDG_IRQHandler /* Window WatchDog */
|
||||
.word PVD_IRQHandler /* PVD through EXTI Line detection */
|
||||
.word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
|
||||
.word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
|
||||
.word FLASH_IRQHandler /* FLASH */
|
||||
.word RCC_IRQHandler /* RCC */
|
||||
.word EXTI0_IRQHandler /* EXTI Line0 */
|
||||
.word EXTI1_IRQHandler /* EXTI Line1 */
|
||||
.word EXTI2_IRQHandler /* EXTI Line2 */
|
||||
.word EXTI3_IRQHandler /* EXTI Line3 */
|
||||
.word EXTI4_IRQHandler /* EXTI Line4 */
|
||||
.word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
|
||||
.word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
|
||||
.word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
|
||||
.word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
|
||||
.word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
|
||||
.word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
|
||||
.word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
|
||||
.word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
|
||||
.word CAN1_TX_IRQHandler /* CAN1 TX */
|
||||
.word CAN1_RX0_IRQHandler /* CAN1 RX0 */
|
||||
.word CAN1_RX1_IRQHandler /* CAN1 RX1 */
|
||||
.word CAN1_SCE_IRQHandler /* CAN1 SCE */
|
||||
.word EXTI9_5_IRQHandler /* External Line[9:5]s */
|
||||
.word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
|
||||
.word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
|
||||
.word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
|
||||
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
|
||||
.word TIM2_IRQHandler /* TIM2 */
|
||||
.word TIM3_IRQHandler /* TIM3 */
|
||||
.word TIM4_IRQHandler /* TIM4 */
|
||||
.word I2C1_EV_IRQHandler /* I2C1 Event */
|
||||
.word I2C1_ER_IRQHandler /* I2C1 Error */
|
||||
.word I2C2_EV_IRQHandler /* I2C2 Event */
|
||||
.word I2C2_ER_IRQHandler /* I2C2 Error */
|
||||
.word SPI1_IRQHandler /* SPI1 */
|
||||
.word SPI2_IRQHandler /* SPI2 */
|
||||
.word USART1_IRQHandler /* USART1 */
|
||||
.word USART2_IRQHandler /* USART2 */
|
||||
.word USART3_IRQHandler /* USART3 */
|
||||
.word EXTI15_10_IRQHandler /* External Line[15:10]s */
|
||||
.word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
|
||||
.word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
|
||||
.word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
|
||||
.word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
|
||||
.word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
|
||||
.word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
|
||||
.word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
|
||||
.word FSMC_IRQHandler /* FSMC */
|
||||
.word SDIO_IRQHandler /* SDIO */
|
||||
.word TIM5_IRQHandler /* TIM5 */
|
||||
.word SPI3_IRQHandler /* SPI3 */
|
||||
.word UART4_IRQHandler /* UART4 */
|
||||
.word UART5_IRQHandler /* UART5 */
|
||||
.word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
|
||||
.word TIM7_IRQHandler /* TIM7 */
|
||||
.word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
|
||||
.word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
|
||||
.word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
|
||||
.word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
|
||||
.word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
|
||||
.word ETH_IRQHandler /* Ethernet */
|
||||
.word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */
|
||||
.word CAN2_TX_IRQHandler /* CAN2 TX */
|
||||
.word CAN2_RX0_IRQHandler /* CAN2 RX0 */
|
||||
.word CAN2_RX1_IRQHandler /* CAN2 RX1 */
|
||||
.word CAN2_SCE_IRQHandler /* CAN2 SCE */
|
||||
.word OTG_FS_IRQHandler /* USB OTG FS */
|
||||
.word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
|
||||
.word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
|
||||
.word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
|
||||
.word USART6_IRQHandler /* USART6 */
|
||||
.word I2C3_EV_IRQHandler /* I2C3 event */
|
||||
.word I2C3_ER_IRQHandler /* I2C3 error */
|
||||
.word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
|
||||
.word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
|
||||
.word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
|
||||
.word OTG_HS_IRQHandler /* USB OTG HS */
|
||||
.word DCMI_IRQHandler /* DCMI */
|
||||
.word CRYP_IRQHandler /* CRYP crypto */
|
||||
.word HASH_RNG_IRQHandler /* Hash and Rng */
|
||||
.word FPU_IRQHandler /* FPU */
|
||||
.word UART7_IRQHandler /* UART7 */
|
||||
.word UART8_IRQHandler /* UART8 */
|
||||
.word SPI4_IRQHandler /* SPI4 */
|
||||
.word SPI5_IRQHandler /* SPI5 */
|
||||
.word SPI6_IRQHandler /* SPI6 */
|
||||
.word SAI1_IRQHandler /* SAI1 */
|
||||
.word LTDC_IRQHandler /* LTDC */
|
||||
.word LTDC_ER_IRQHandler /* LTDC error */
|
||||
.word DMA2D_IRQHandler /* DMA2D */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak MemManage_Handler
|
||||
.thumb_set MemManage_Handler,Default_Handler
|
||||
|
||||
.weak BusFault_Handler
|
||||
.thumb_set BusFault_Handler,Default_Handler
|
||||
|
||||
.weak UsageFault_Handler
|
||||
.thumb_set UsageFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak DebugMon_Handler
|
||||
.thumb_set DebugMon_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak WWDG_IRQHandler
|
||||
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||
|
||||
.weak PVD_IRQHandler
|
||||
.thumb_set PVD_IRQHandler,Default_Handler
|
||||
|
||||
.weak TAMP_STAMP_IRQHandler
|
||||
.thumb_set TAMP_STAMP_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_WKUP_IRQHandler
|
||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak FLASH_IRQHandler
|
||||
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||
|
||||
.weak RCC_IRQHandler
|
||||
.thumb_set RCC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI0_IRQHandler
|
||||
.thumb_set EXTI0_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI1_IRQHandler
|
||||
.thumb_set EXTI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI2_IRQHandler
|
||||
.thumb_set EXTI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI3_IRQHandler
|
||||
.thumb_set EXTI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI4_IRQHandler
|
||||
.thumb_set EXTI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream0_IRQHandler
|
||||
.thumb_set DMA1_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream1_IRQHandler
|
||||
.thumb_set DMA1_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream2_IRQHandler
|
||||
.thumb_set DMA1_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream3_IRQHandler
|
||||
.thumb_set DMA1_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream4_IRQHandler
|
||||
.thumb_set DMA1_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream5_IRQHandler
|
||||
.thumb_set DMA1_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream6_IRQHandler
|
||||
.thumb_set DMA1_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak ADC_IRQHandler
|
||||
.thumb_set ADC_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_TX_IRQHandler
|
||||
.thumb_set CAN1_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX0_IRQHandler
|
||||
.thumb_set CAN1_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_RX1_IRQHandler
|
||||
.thumb_set CAN1_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN1_SCE_IRQHandler
|
||||
.thumb_set CAN1_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI9_5_IRQHandler
|
||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_BRK_TIM9_IRQHandler
|
||||
.thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_UP_TIM10_IRQHandler
|
||||
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_TRG_COM_TIM11_IRQHandler
|
||||
.thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_CC_IRQHandler
|
||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM2_IRQHandler
|
||||
.thumb_set TIM2_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM3_IRQHandler
|
||||
.thumb_set TIM3_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM4_IRQHandler
|
||||
.thumb_set TIM4_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_EV_IRQHandler
|
||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_ER_IRQHandler
|
||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_EV_IRQHandler
|
||||
.thumb_set I2C2_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C2_ER_IRQHandler
|
||||
.thumb_set I2C2_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI1_IRQHandler
|
||||
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI2_IRQHandler
|
||||
.thumb_set SPI2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART1_IRQHandler
|
||||
.thumb_set USART1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART2_IRQHandler
|
||||
.thumb_set USART2_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART3_IRQHandler
|
||||
.thumb_set USART3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI15_10_IRQHandler
|
||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_Alarm_IRQHandler
|
||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_WKUP_IRQHandler
|
||||
.thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_BRK_TIM12_IRQHandler
|
||||
.thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_UP_TIM13_IRQHandler
|
||||
.thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_TRG_COM_TIM14_IRQHandler
|
||||
.thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM8_CC_IRQHandler
|
||||
.thumb_set TIM8_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Stream7_IRQHandler
|
||||
.thumb_set DMA1_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak FSMC_IRQHandler
|
||||
.thumb_set FSMC_IRQHandler,Default_Handler
|
||||
|
||||
.weak SDIO_IRQHandler
|
||||
.thumb_set SDIO_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM5_IRQHandler
|
||||
.thumb_set TIM5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI3_IRQHandler
|
||||
.thumb_set SPI3_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART4_IRQHandler
|
||||
.thumb_set UART4_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART5_IRQHandler
|
||||
.thumb_set UART5_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM6_DAC_IRQHandler
|
||||
.thumb_set TIM6_DAC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM7_IRQHandler
|
||||
.thumb_set TIM7_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream0_IRQHandler
|
||||
.thumb_set DMA2_Stream0_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream1_IRQHandler
|
||||
.thumb_set DMA2_Stream1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream2_IRQHandler
|
||||
.thumb_set DMA2_Stream2_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream3_IRQHandler
|
||||
.thumb_set DMA2_Stream3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream4_IRQHandler
|
||||
.thumb_set DMA2_Stream4_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_IRQHandler
|
||||
.thumb_set ETH_IRQHandler,Default_Handler
|
||||
|
||||
.weak ETH_WKUP_IRQHandler
|
||||
.thumb_set ETH_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_TX_IRQHandler
|
||||
.thumb_set CAN2_TX_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX0_IRQHandler
|
||||
.thumb_set CAN2_RX0_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_RX1_IRQHandler
|
||||
.thumb_set CAN2_RX1_IRQHandler,Default_Handler
|
||||
|
||||
.weak CAN2_SCE_IRQHandler
|
||||
.thumb_set CAN2_SCE_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_FS_IRQHandler
|
||||
.thumb_set OTG_FS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream5_IRQHandler
|
||||
.thumb_set DMA2_Stream5_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream6_IRQHandler
|
||||
.thumb_set DMA2_Stream6_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2_Stream7_IRQHandler
|
||||
.thumb_set DMA2_Stream7_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART6_IRQHandler
|
||||
.thumb_set USART6_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_EV_IRQHandler
|
||||
.thumb_set I2C3_EV_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C3_ER_IRQHandler
|
||||
.thumb_set I2C3_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_OUT_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_EP1_IN_IRQHandler
|
||||
.thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_WKUP_IRQHandler
|
||||
.thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
|
||||
|
||||
.weak OTG_HS_IRQHandler
|
||||
.thumb_set OTG_HS_IRQHandler,Default_Handler
|
||||
|
||||
.weak DCMI_IRQHandler
|
||||
.thumb_set DCMI_IRQHandler,Default_Handler
|
||||
|
||||
.weak CRYP_IRQHandler
|
||||
.thumb_set CRYP_IRQHandler,Default_Handler
|
||||
|
||||
.weak HASH_RNG_IRQHandler
|
||||
.thumb_set HASH_RNG_IRQHandler,Default_Handler
|
||||
|
||||
.weak FPU_IRQHandler
|
||||
.thumb_set FPU_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART7_IRQHandler
|
||||
.thumb_set UART7_IRQHandler,Default_Handler
|
||||
|
||||
.weak UART8_IRQHandler
|
||||
.thumb_set UART8_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI4_IRQHandler
|
||||
.thumb_set SPI4_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI5_IRQHandler
|
||||
.thumb_set SPI5_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI6_IRQHandler
|
||||
.thumb_set SPI6_IRQHandler,Default_Handler
|
||||
|
||||
.weak SAI1_IRQHandler
|
||||
.thumb_set SAI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak LTDC_IRQHandler
|
||||
.thumb_set LTDC_IRQHandler,Default_Handler
|
||||
|
||||
.weak LTDC_ER_IRQHandler
|
||||
.thumb_set LTDC_ER_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA2D_IRQHandler
|
||||
.thumb_set DMA2D_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
+7
-5
@@ -259,7 +259,7 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../Include/stm32f4xx.h"
|
||||
|
||||
/**
|
||||
* @}
|
||||
@@ -293,9 +293,9 @@
|
||||
through STLINK MCO pin of STM32F103 microcontroller. The frequency cannot be changed
|
||||
and is fixed at 8 MHz.
|
||||
Hardware configuration needed for Nucleo Board:
|
||||
– SB54, SB55 OFF
|
||||
– R35 removed
|
||||
– SB16, SB50 ON */
|
||||
� SB54, SB55 OFF
|
||||
� R35 removed
|
||||
� SB16, SB50 ON */
|
||||
/* #define USE_HSE_BYPASS */
|
||||
|
||||
#if defined (USE_HSE_BYPASS)
|
||||
@@ -451,7 +451,9 @@ void SystemInit(void)
|
||||
#ifdef VECT_TAB_SRAM
|
||||
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
|
||||
#else
|
||||
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
|
||||
// SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
|
||||
extern uint32_t g_pfnVectors ;
|
||||
SCB->VTOR = (uint32_t) &g_pfnVectors ; /* Vector Table Relocation in Internal FLASH */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -166,9 +166,9 @@
|
||||
#endif
|
||||
|
||||
#include <stdint.h> /* standard types definitions */
|
||||
#include <core_cmInstr.h> /* Core Instruction Access */
|
||||
#include <core_cmFunc.h> /* Core Function Access */
|
||||
#include <core_cm4_simd.h> /* Compiler specific SIMD Intrinsics */
|
||||
#include "core_cmInstr.h" /* Core Instruction Access */
|
||||
#include "core_cmFunc.h" /* Core Function Access */
|
||||
#include "core_cm4_simd.h" /* Compiler specific SIMD Intrinsics */
|
||||
|
||||
#endif /* __CORE_CM4_H_GENERIC */
|
||||
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32f4xx.h"
|
||||
#include "../../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
|
||||
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
* @{
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "./STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
|
||||
|
||||
#define __no_operation __NOP
|
||||
|
||||
#define LCD_NCS_HIGH() GPIO_LCD_NCS->BSRRL = PIN_LCD_NCS
|
||||
|
||||
@@ -142,9 +142,11 @@ void audioEnd()
|
||||
#if !defined(SIMU)
|
||||
extern "C" void TIM6_DAC_IRQHandler()
|
||||
{
|
||||
DAC->CR &= ~DAC_CR_DMAEN1 ; // Stop DMA requests
|
||||
DAC->CR &= ~DAC_CR_DMAEN1 ; // Stop DMA requests
|
||||
#if !defined(REV9E)
|
||||
DAC->CR &= ~DAC_CR_DMAUDRIE1 ; // Stop underrun interrupt
|
||||
DAC->SR = DAC_SR_DMAUDR1 ; // Write 1 to clear flag
|
||||
#endif
|
||||
DAC->SR = DAC_SR_DMAUDR1 ; // Write 1 to clear flag
|
||||
}
|
||||
|
||||
extern "C" void DMA1_Stream5_IRQHandler()
|
||||
|
||||
@@ -41,7 +41,6 @@ extern "C" {
|
||||
#endif
|
||||
#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_dcd_int.h"
|
||||
#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dbgmcu.h"
|
||||
#if defined(__cplusplus) && !defined(SIMU)
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -43,15 +43,31 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rcc.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_gpio.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_spi.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rtc.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_pwr.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dma.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_usart.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/misc.h"
|
||||
#if defined(REV9E)
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rcc.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_gpio.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_spi.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rtc.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_pwr.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_usart.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_flash.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dbgmcu.h"
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/misc.h"
|
||||
#else
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rcc.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_gpio.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_spi.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rtc.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_pwr.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dma.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_usart.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_flash.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dbgmcu.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/misc.h"
|
||||
#endif
|
||||
|
||||
#if !defined(SIMU)
|
||||
#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_core.h"
|
||||
@@ -157,11 +173,8 @@ uint32_t isBootloaderStart(const void * buffer);
|
||||
void init_no_pulses(uint32_t port);
|
||||
void disable_no_pulses(uint32_t port);
|
||||
void init_ppm( uint32_t module_index );
|
||||
void disable_ppm( uint32_t module_index );
|
||||
void set_external_ppm_parameters(uint32_t idleTime, uint32_t delay, uint32_t positive);
|
||||
#if defined(TARANIS_INTERNAL_PPM)
|
||||
void set_internal_ppm_parameters(uint32_t idleTime, uint32_t delay, uint32_t positive);
|
||||
#endif
|
||||
void disable_ppm( uint32_t module_index );
|
||||
void init_pxx( uint32_t module_index );
|
||||
void disable_pxx( uint32_t module_index );
|
||||
void init_dsm2( uint32_t module_index );
|
||||
@@ -170,13 +183,13 @@ void disable_dsm2( uint32_t module_index );
|
||||
// Trainer driver
|
||||
void init_trainer_ppm(void);
|
||||
void stop_trainer_ppm(void);
|
||||
void set_trainer_ppm_parameters(uint32_t idleTime, uint32_t delay, uint32_t positive);
|
||||
void init_trainer_capture(void);
|
||||
void stop_trainer_capture(void);
|
||||
void init_cppm_on_heartbeat_capture(void);
|
||||
void stop_cppm_on_heartbeat_capture(void);
|
||||
void init_sbus_on_heartbeat_capture(void);
|
||||
void stop_sbus_on_heartbeat_capture(void);
|
||||
void set_trainer_ppm_parameters(uint32_t idleTime, uint32_t delay, uint32_t positive);
|
||||
|
||||
// Keys driver
|
||||
void keysInit(void);
|
||||
@@ -238,7 +251,7 @@ void turnBacklightOff(void);
|
||||
#define setBacklight(xx) turnBacklightOn(xx, g_eeGeneral.backlightColor)
|
||||
#define __BACKLIGHT_ON turnBacklightOn(g_eeGeneral.backlightBright, g_eeGeneral.backlightColor)
|
||||
#define __BACKLIGHT_OFF turnBacklightOff()
|
||||
#define IS_BACKLIGHT_ON() (TIM4->CCR4 != 0) || (TIM4->CCR2 != 0)
|
||||
#define IS_BACKLIGHT_ON() (TIM_BL->CCR4 != 0) || (TIM_BL->CCR2 != 0)
|
||||
#else
|
||||
#define setBacklight(xx) TIM10->CCR1 = 100-xx
|
||||
#define __BACKLIGHT_ON TIM10->CCR1 = 100-g_eeGeneral.backlightBright
|
||||
@@ -294,7 +307,7 @@ void uart3SbusInit(void);
|
||||
void uart3Stop(void);
|
||||
|
||||
// BT driver
|
||||
int bt_open();
|
||||
int bt_open(void);
|
||||
int bt_write(const void *buffer, int len);
|
||||
int bt_read(void *buffer, int len);
|
||||
|
||||
|
||||
@@ -36,16 +36,6 @@
|
||||
|
||||
#include "../../opentx.h"
|
||||
|
||||
#if defined(__cplusplus) && !defined(SIMU)
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_dcd_int.h"
|
||||
#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dbgmcu.h"
|
||||
#if defined(__cplusplus) && !defined(SIMU)
|
||||
}
|
||||
#endif
|
||||
|
||||
void configure_pins( uint32_t pins, uint16_t config )
|
||||
{
|
||||
uint32_t address ;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "../../opentx.h"
|
||||
#include "stm32f2xx_flash.h"
|
||||
|
||||
//After reset, write is not allowed in the Flash control register (FLASH_CR) to protect the
|
||||
//Flash memory against possible unwanted operations due, for example, to electric
|
||||
|
||||
@@ -324,14 +324,25 @@
|
||||
#define PIN_FS_DP GPIO_Pin_12 // PA.12
|
||||
|
||||
// BackLight
|
||||
#if defined (REVPLUS)
|
||||
#define RCC_AHB1Periph_GPIOBL RCC_AHB1Periph_GPIOD
|
||||
#define GPIO_Pin_BL GPIO_Pin_15 // PD.15
|
||||
#define Pin_BL_AF GPIO_AF_TIM4
|
||||
#if defined(REV9E)
|
||||
#define TIM_BL TIM9
|
||||
#define GPIOBL GPIOE
|
||||
#define RCC_AHB1Periph_GPIOBL RCC_AHB1Periph_GPIOE
|
||||
#define Pin_BL_AF GPIO_AF_TIM9
|
||||
#define GPIO_Pin_BL GPIO_Pin_6 // PE.06
|
||||
#define GPIO_PinSource_BL GPIO_PinSource6
|
||||
#define Pin_BLW_AF GPIO_AF_TIM9
|
||||
#define GPIO_Pin_BLW GPIO_Pin_5 // PE.05
|
||||
#define GPIO_PinSource_BLW GPIO_PinSource5
|
||||
#elif defined (REVPLUS)
|
||||
#define TIM_BL TIM4
|
||||
#define GPIOBL GPIOD
|
||||
#define RCC_AHB1Periph_GPIOBL RCC_AHB1Periph_GPIOD
|
||||
#define Pin_BL_AF GPIO_AF_TIM4
|
||||
#define GPIO_Pin_BL GPIO_Pin_15 // PD.15
|
||||
#define GPIO_PinSource_BL GPIO_PinSource15
|
||||
#define GPIO_Pin_BLW GPIO_Pin_13 // PD.13
|
||||
#define Pin_BLW_AF GPIO_AF_TIM4
|
||||
#define GPIO_Pin_BLW GPIO_Pin_13 // PD.13
|
||||
#define GPIO_PinSource_BLW GPIO_PinSource13
|
||||
#else
|
||||
#define RCC_AHB1Periph_GPIOBL RCC_AHB1Periph_GPIOB
|
||||
@@ -353,7 +364,7 @@
|
||||
#define PIN_LCD_CLK GPIO_Pin_10 // PC.10
|
||||
#define PIN_LCD_NCS GPIO_Pin_15 // PA.15
|
||||
#define PIN_LCD_A0 GPIO_Pin_11 // PC.11
|
||||
#define PIN_LCD_RST GPIO_Pin_12 // PD.12
|
||||
#define PIN_LCD_RST GPIO_Pin_15 // TOTO PD.12
|
||||
#else
|
||||
#define RCC_AHB1Periph_LCD RCC_AHB1Periph_GPIOD
|
||||
#define GPIO_LCD_SPI GPIOD
|
||||
|
||||
@@ -271,8 +271,26 @@ static void LCD_BL_Config()
|
||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOBL, ENABLE);
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
#if defined(REVPLUS)
|
||||
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
|
||||
#if defined(REV9E)
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_BL|GPIO_Pin_BLW;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(GPIOBL, &GPIO_InitStructure);
|
||||
GPIO_PinAFConfig(GPIOBL, GPIO_PinSource_BL, Pin_BL_AF);
|
||||
GPIO_PinAFConfig(GPIOBL, GPIO_PinSource_BLW, Pin_BL_AF);
|
||||
RCC->APB2ENR |= RCC_APB2ENR_TIM9EN ; // Enable clock
|
||||
TIM9->ARR = 100 ;
|
||||
TIM9->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 50000 - 1; // 20us * 100 = 2ms => 500Hz
|
||||
TIM9->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 ; // PWM
|
||||
TIM9->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 ; // PWM
|
||||
TIM9->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E ;
|
||||
TIM9->CCR2 = 0 ;
|
||||
TIM9->CCR4 = 80 ;
|
||||
TIM9->EGR = 0 ;
|
||||
TIM9->CR1 = TIM_CR1_CEN ; // Counter enable
|
||||
#elif defined(REVPLUS)
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_BL|GPIO_Pin_BLW;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
@@ -430,16 +448,16 @@ void lcdSetRefVolt(uint8_t val)
|
||||
AspiCmd(val+CONTRAST_OFS); //0--255
|
||||
}
|
||||
|
||||
#if defined(REVPLUS)
|
||||
#if defined(REV9E) || defined(REVPLUS)
|
||||
void turnBacklightOn(uint8_t level, uint8_t color)
|
||||
{
|
||||
TIM4->CCR4 = ((100-level)*(20-color))/20;
|
||||
TIM4->CCR2 = ((100-level)*color)/20;
|
||||
TIM_BL->CCR4 = ((100-level)*(20-color))/20;
|
||||
TIM_BL->CCR2 = ((100-level)*color)/20;
|
||||
}
|
||||
|
||||
void turnBacklightOff(void)
|
||||
{
|
||||
TIM4->CCR4 = 0;
|
||||
TIM4->CCR2 = 0;
|
||||
TIM_BL->CCR4 = 0;
|
||||
TIM_BL->CCR2 = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -37,6 +37,15 @@
|
||||
#include "board_taranis.h"
|
||||
#include "../../pwr.h"
|
||||
|
||||
#ifdef REV9E
|
||||
#define POWER_STATE_OFF 0
|
||||
#define POWER_STATE_START 1
|
||||
#define POWER_STATE_RUNNING 2
|
||||
#define POWER_STATE_STOPPING 3
|
||||
#define POWER_STATE_STOPPED 4
|
||||
uint8_t PowerState = POWER_STATE_OFF ;
|
||||
#endif
|
||||
|
||||
void pwrInit()
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
@@ -104,6 +113,36 @@ uint32_t pwrCheck()
|
||||
{
|
||||
#if defined(SIMU)
|
||||
return e_power_on;
|
||||
#elif defined(REV9E)
|
||||
uint32_t switchValue = GPIO_ReadInputDataBit(GPIOPWR, PIN_PWR_STATUS) == Bit_RESET;
|
||||
switch ( PowerState )
|
||||
{
|
||||
case POWER_STATE_OFF :
|
||||
PowerState = POWER_STATE_START ;
|
||||
return e_power_on ;
|
||||
|
||||
case POWER_STATE_START :
|
||||
if ( !switchValue ) {
|
||||
PowerState = POWER_STATE_RUNNING ;
|
||||
}
|
||||
return e_power_on ;
|
||||
|
||||
case POWER_STATE_RUNNING :
|
||||
if ( switchValue ) {
|
||||
PowerState = POWER_STATE_STOPPING ;
|
||||
// return e_power_on;
|
||||
}
|
||||
return e_power_on ;
|
||||
|
||||
case POWER_STATE_STOPPING :
|
||||
if ( !switchValue ) {
|
||||
PowerState = POWER_STATE_STOPPED ;
|
||||
}
|
||||
return e_power_off ;
|
||||
|
||||
case POWER_STATE_STOPPED :
|
||||
return e_power_off ;
|
||||
}
|
||||
#else
|
||||
if (GPIO_ReadInputDataBit(GPIOPWR, PIN_PWR_STATUS) == Bit_RESET)
|
||||
return e_power_on;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
void rotencInit()
|
||||
{
|
||||
configure_pins( 0x0060, PIN_INPUT | PIN_PULLUP | PIN_PORTE ) ;
|
||||
configure_pins( GPIO_Pin_12|GPIO_Pin_13, PIN_INPUT | PIN_PULLUP | PIN_PORTD ) ;
|
||||
}
|
||||
|
||||
void rotencEnd()
|
||||
@@ -51,18 +51,18 @@ void checkRotaryEncoder()
|
||||
{
|
||||
register uint32_t dummy ;
|
||||
|
||||
dummy = GPIOE->IDR ; // Read Rotary encoder ( PE6, PE5 )
|
||||
dummy >>= 5 ;
|
||||
dummy = GPIOD->IDR ; // Read Rotary encoder ( PE6, PE5 )
|
||||
dummy >>= 12 ;
|
||||
dummy &= 0x03 ; // pick out the two bits
|
||||
if ( dummy != ( Rotary_position & 0x03 ) )
|
||||
{
|
||||
if ( ( Rotary_position & 0x01 ) ^ ( ( dummy & 0x02) >> 1 ) )
|
||||
{
|
||||
++x9de_rotenc;
|
||||
--x9de_rotenc;
|
||||
}
|
||||
else
|
||||
{
|
||||
--x9de_rotenc;
|
||||
++x9de_rotenc;
|
||||
}
|
||||
Rotary_position &= ~0x03 ;
|
||||
Rotary_position |= dummy ;
|
||||
|
||||
@@ -27,9 +27,8 @@
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rcc.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_gpio.h"
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/misc.h"
|
||||
|
||||
#include "board_taranis.h"
|
||||
#include "usb_bsp.h"
|
||||
#include "usbd_conf.h"
|
||||
|
||||
|
||||
@@ -29,8 +29,11 @@
|
||||
#ifndef __USB_CONF__H__
|
||||
#define __USB_CONF__H__
|
||||
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
|
||||
|
||||
#if defined(REV9E)
|
||||
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h"
|
||||
#else
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
|
||||
#endif
|
||||
|
||||
/* USB Core and PHY interface configuration.
|
||||
Tip: To avoid modifying these defines each time you need to change the USB
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#if defined(__cplusplus) && !defined(SIMU)
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/misc.h"
|
||||
|
||||
#include "usbd_msc_mem.h"
|
||||
#include "usb_conf.h"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user