Files
banban/ql-kernel/threadx/common/include/quec_rtos.h
T

546 lines
17 KiB
C

/**
******************************************************************************
* @file quec_rtos.h
* @author Chavis.Chen
* @version V1.0.0
* @date 26-Sep-2018
* @brief This file contains the common definitions, macros and functions to
* be shared throughout the project.
******************************************************************************
*
* The MIT License
* Copyright (c) 2018 QUECTEL Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************
*/
#ifndef _QUEC_RTOS_H
#define _QUEC_RTOS_H
#include "osa.h"
#include "osa_old_api.h"
#include "linklist.h"
#include "quec_rtos_config.h"
#include "quec_cust_feature.h"
#define QUEC_OS_TASK_PRIORITY 95
#define QUEC_APP_TASK_PRIORITY 100
typedef uint32 quec_tcb_id_t;
typedef linklist_handler_t QuecTCBLinklist_t;
typedef OSTaskRef quec_task_t;
typedef OSSemaRef quec_sem_t;
typedef OSMutexRef quec_mutex_t;
typedef OSMsgQRef quec_queue_t;
typedef OSMailboxQRef quec_mailbox_t;
typedef OSFlagRef quec_flag_t;
typedef OSTimerRef quec_timer_t;
typedef OSATimerStatus quec_timer_status_t;
typedef struct
{
quec_tcb_id_t id;
quec_task_t taskRef;
void* stackPtr;
uint32 stackSize;
uint8 priority;
char * taskName;
void ( * taskStart )( void * );
void * argv;
} quec_tcb_t;
typedef struct
{
quec_task_t taskRef;
quec_queue_t queueRef;
} task_delete_worker_t;
typedef struct
{
bool is_delete_itself;
quec_task_t taskRef;
} task_delete_obj_t;
typedef struct
{
quec_task_t taskRef;
QuecOSStatus result;
} task_delete_result_t;
typedef void (* task_delete_work_cb_t)(task_delete_result_t * task_delete_result);
#define QUEC_WAIT_FOREVER OS_SUSPEND
#define QUEC_NO_WAIT OS_NO_SUSPEND
typedef enum
{
QUEC_FLAG_AND = OSA_FLAG_AND,
QUEC_FLAG_AND_CLEAR = OSA_FLAG_AND_CLEAR,
QUEC_FLAG_OR = OSA_FLAG_OR,
QUEC_FLAG_OR_CLEAR = OSA_FLAG_OR_CLEAR
} quec_flag_op_e;
typedef enum
{
QUEC_TMR_STA_ENABLED = OSA_ENABLED,
QUEC_TMR_STA_DISABLED = OSA_DISABLED,
} quec_tmr_sta_e;
typedef enum
{
QUEC_TASK_NAME_APP_START,
QUEC_TASK_NAME_HTTP_SEND,
QUEC_TASK_NAME_HTTP_RECV_PRE,
QUEC_TASK_NAME_HTTP_RECV,
QUEC_TASK_NAME_HTTP_DESTROY,
QUEC_TASK_NAME_HTTP_TIMER_EVENT,
QUEC_TASK_NAME_HTTP_SERVICE,
QUEC_TASK_NAME_FILE,
QUEC_TASK_NAME_FTP_FOTA,
QUEC_TASK_NAME_FOTA_FEED,
QUEC_TASK_NAME_FOTA_RECV,
QUEC_TASK_NAME_FOTA_WRITE,
QUEC_TASK_NAME_FOTA_UPDATE,
QUEC_TASK_NAME_NETCARD,
QUEC_TASK_NAME_NET_IF_BIND,
QUEC_TASK_NAME_PDP_ACT,
QUEC_TASK_NAME_SLEEP,
QUEC_TASK_NAME_RECOVERY,
QUEC_TASK_NAME_TASK_DELETE,
QUEC_TASK_NAME_SIO_DDS,
QUEC_TASK_NAME_URC_PRE,
QUEC_TASK_NAME_URC,
QUEC_TASK_NAME_RI,
QUEC_TASK_NAME_TCP_WORK,
QUEC_TASK_NAME_TCP_AT,
QUEC_TASK_NAME_SOCKET_WORK,
QUEC_TASK_NAME_FTP_WORK,
QUEC_TASK_NAME_IOT_WORK,
QUEC_TASK_NAME_AUDIO,
QUEC_TASK_NAME_QIACT,
QUEC_TASK_NAME_RX_CMUX,
QUEC_TASK_NAME_TX_CMUX,
QUEC_TASK_NAME_MQTTCNF,
QUEC_TASK_NAME_MQTTAT,
QUEC_TASK_NAME_MQTIME,
QUEC_TASK_NAME_SLEEP_DEBUG,
QUEC_TASK_NAME_POWERCTL,
QUEC_TASK_NAME_NC_KALIVE,
QUEC_TASK_NAME_KALIVE_SEND,
QUEC_TASK_NAME_FTP_CNF_WORK,
QUEC_TASK_NAME_LWM2MCNF,
QUEC_TASK_NAME_LWM2MAT,
QUEC_TASK_NAME_LWM2IME,
QUEC_TASK_NAME_TEMP,
QUEC_TASK_NAME_LOCATOR_WORK,
QUEC_TASK_NAME_USIM_DETECT,
QUEC_TASK_NAME_MSG_HANDLE,
QUEC_TASK_NAME_LED,
QUEC_TASK_NAME_MMSEND,
QUEC_TASK_NAME_TCPUDPAPP,
QUEC_TASK_NAME_ALBS,
QUEC_TASK_NAME_ALDYNREG,
QUEC_TASK_NAME_QUECTHING,
QUEC_TASK_NAME_SMTP_WORK,
QUEC_TASK_NAME_TC_IOT,
QUEC_TASK_NAME_TC_IOT_HTTP,
QUEC_TASK_NAME_TC_IOT_RECONNECT,
QUEC_TASK_NAME_TC_IOT_RE_SUB,
QUEC_TASK_NAME_AT_SOCKET,
QUEC_TASK_NAME_QUECFOTA,
QUEC_TASK_NAME_QLWIP,
QUEC_TASK_NAME_IPCAPPCNF,
QUEC_TASK_NAME_AT_IPCAPP,
QUEC_TASK_NAME_NETMODE,
QUEC_TASK_NAME_PG_KEEPALIVE,
QUEC_TASK_NAME_ALLIED_NETMODE,
QUEC_TASK_NAME_QHB,
QUEC_TASK_NAME_QHBRECV,
QUEC_TASK_NAME_QGPIOCTRL,
QUEC_TASK_NAME_MECMGL,
QUEC_OPEN_MAIN,
#ifdef QUEC_IMS_XML_SUPPORT
QUEC_TASK_IMS_CONFIG_INIT,
#endif
QUEC_TASK_NAME_MAX,
}quec_task_name_e;
/*========================================================================
* Quectel Task Management
*========================================================================*/
extern char * quec_task_name[QUEC_TASK_NAME_MAX];
extern QuecOSStatus quec_rtos_init( void );
QuecOSStatus quec_rtos_task_create
(
quec_task_t * taskRef, /* OS task reference */
uint32 stackSize, /* number of bytes in task stack area */
uint8 priority, /* task priority 0 - 31 */
char * taskName, /* task name */
void ( * taskStart)(void*), /* pointer to task entry point */
void* argv, /* task entry argument pointer */
...
);
extern QuecOSStatus quec_rtos_task_delete
(
quec_task_t taskRef /* OS task reference */
);
extern QuecOSStatus quec_rtos_task_delete_worker_start(void);
extern QuecOSStatus quec_rtos_task_delete_ex
(
quec_task_t taskRef /* OS task reference */
);
extern QuecOSStatus quec_rtos_task_suspend
(
quec_task_t taskRef /* OS task reference */
);
extern QuecOSStatus quec_rtos_task_resume
(
quec_task_t taskRef /* OS task reference */
);
extern QuecOSStatus quec_rtos_task_change_priority
(
quec_task_t taskRef, /* OS task reference */
uint8 new_priority, /* OS task new priority for in */
uint8 *old_priority /* OS task old priority for out */
);
extern QuecOSStatus quec_rtos_task_get_priority
(
quec_task_t taskRef, /* OS task reference */
uint8 * priority_ptr /* OS task priority for out */
);
extern void quec_rtos_task_yield(void);
extern QuecOSStatus quec_rtos_task_get_current_ref
(
quec_task_t * taskRef /* OS task reference */
);
extern void quec_rtos_task_sleep_ms
(
uint32 ms /* OS task sleep time for ms */
);
extern void quec_rtos_task_sleep_s
(
uint32 s /* OS task sleep time for s */
);
extern QuecOSStatus quec_rtos_task_sched_lock(void);
extern QuecOSStatus quec_rtos_task_sched_unlock(void);
extern QuecOSStatus quec_rtos_hisr_get_priority
(
quec_task_t taskRef, /* OS task reference */
uint8 *priority_ptr /* OS task priority for out */
);
extern QuecOSStatus quec_rtos_hisr_get_current_ref
(
quec_task_t* taskRef /* OS task reference */
);
/*========================================================================
* Quectel Semaphore Management
*========================================================================*/
extern QuecOSStatus quec_rtos_semaphore_create
(
quec_sem_t *semaRef, /* OS semaphore reference */
uint32 initialCount /* initial count of the semaphore */
);
extern QuecOSStatus quec_rtos_semaphore_wait
(
quec_sem_t semaRef, /* OS semaphore reference */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_semaphore_release
(
quec_sem_t semaRef /* OS semaphore reference */
);
extern QuecOSStatus quec_rtos_semaphore_get_cnt
(
quec_sem_t semaRef, /* OS semaphore reference */
uint32 * cnt_ptr /* out-parm to save the cnt of semaphore */
);
extern QuecOSStatus quec_rtos_semaphore_delete
(
quec_sem_t semaRef /* OS semaphore reference */
);
/*========================================================================
* Quectel Mutex Management
*========================================================================*/
extern QuecOSStatus quec_rtos_mutex_create
(
quec_mutex_t *mutexRef /* OS mutex reference */
);
extern QuecOSStatus quec_rtos_mutex_lock
(
quec_mutex_t mutexRef, /* OS mutex reference */
uint32 timeout /* mutex wait timeout */
);
extern QuecOSStatus quec_rtos_mutex_try_lock
(
quec_mutex_t mutexRef /* OS mutex reference */
);
extern QuecOSStatus quec_rtos_mutex_unlock
(
quec_mutex_t mutexRef /* OS mutex reference */
);
extern QuecOSStatus quec_rtos_mutex_delete
(
quec_mutex_t mutexRef /* OS mutex reference */
);
/*========================================================================
* Quectel Queue Management
*========================================================================*/
extern QuecOSStatus quec_rtos_queue_create
(
quec_queue_t *msgQRef, /* OS message queue reference */
uint32 maxSize, /* max message size the queue supports */
uint32 maxNumber /* max # of messages in the queue */
);
extern QuecOSStatus quec_rtos_queue_wait
(
quec_queue_t msgQRef, /* message queue reference */
uint8 *recvMsg, /* pointer to the message received */
uint32 size, /* size of the message */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_queue_release
(
quec_queue_t msgQRef, /* message queue reference */
uint32 size, /* size of the message */
uint8 *msgPtr, /* start address of the data to be sent */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_queue_front_release
(
quec_queue_t msgQRef, /* message queue reference */
uint32 size, /* size of the message */
uint8 *msgPtr, /* start address of the data to be sent */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_queue_get_cnt
(
quec_queue_t msgQRef, /* message queue reference */
uint32 *cnt_ptr /* out-parm to save the cnt of message queue */
);
extern QuecOSStatus quec_rtos_queue_delete
(
quec_queue_t msgQRef /* message queue reference */
);
/*========================================================================
* Quectel Mailbox Management
*========================================================================*/
extern QuecOSStatus quec_rtos_mailbox_create
(
quec_mailbox_t *mboxQRef, /* OS mailbox queue reference */
uint32 maxNumber /* max # of messages in the queue */
);
extern QuecOSStatus quec_rtos_mailbox_wait
(
quec_mailbox_t mboxQRef, /* OS mailbox queue reference */
void **recvMsg, /* pointer to the message received */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_mailbox_release
(
quec_mailbox_t mboxQRef, /* OS mailbox queue reference */
uint8 *msgPtr, /* start address of the data to be sent */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_mailbox_get_cnt
(
quec_mailbox_t mboxQRef, /* OS mailbox queue reference */
uint32 *cnt_ptr /* out-parm to save the cnt of mailbox */
);
extern QuecOSStatus quec_rtos_mailbox_delete
(
quec_mailbox_t mboxQRef /* OS mailbox queue reference */
);
/*========================================================================
* Quectel Flag Management
*========================================================================*/
extern QuecOSStatus quec_rtos_flag_create
(
quec_flag_t *flagRef /* OS flag reference */
);
extern QuecOSStatus quec_rtos_flag_wait
(
quec_flag_t flagRef, /* OS flag reference */
uint32 mask, /* flag mask to wait for */
quec_flag_op_e operation, /* QUEC_FLAG_AND, QUEC_FLAG_AND_CLEAR, */
/* QUEC_FLAG_OR, QUEC_FLAG_OR_CLEAR */
uint32 *flags, /* Current value of all flags */
uint32 timeout /* QUEC_WAIT_FOREVER, QUEC_NO_WAIT, or timeout */
);
extern QuecOSStatus quec_rtos_flag_release
(
quec_flag_t flagRef, /* OS flag reference */
uint32 mask, /* flag mask to wait for */
uint32 operation /* QUEC_FLAG_AND, QUEC_FLAG_AND_CLEAR, */
/* QUEC_FLAG_OR, QUEC_FLAG_OR_CLEAR */
);
extern QuecOSStatus quec_rtos_flag_delete
(
quec_flag_t flagRef /* OS flag reference */
);
/*========================================================================
* Quectel Timer Management
*========================================================================*/
extern QuecOSStatus quec_rtos_timer_create
(
quec_timer_t * timerRef /* OS supplied timer reference */
);
extern QuecOSStatus quec_rtos_timer_start
(
quec_timer_t timerRef, /* OS supplied timer reference */
uint32 initialTime, /* initial expiration time in ms */
bool cyclicalEn, /* wether to enable the cyclical mode or not */
void (*callBackRoutine)(UINT32), /* timer call-back routine */
uint32 timerArgc /* argument to be passed to call-back on expiration */
);
extern QuecOSStatus quec_rtos_timer_stop
(
quec_timer_t timerRef /* OS supplied timer reference */
);
extern QuecOSStatus quec_task_timer_create
(
quec_timer_t * timerRef /* OS supplied timer reference */
);
extern QuecOSStatus quec_task_timer_start
(
quec_timer_t timerRef, /* OS supplied timer reference */
uint32 initialTime, /* initial expiration time in ms */
bool cyclicalEn, /* wether to enable the cyclical mode or not */
void (*callBackRoutine)(UINT32), /* timer call-back routine */
uint32 timerArgc /* argument to be passed to call-back on expiration */
);
extern QuecOSStatus quec_task_timer_stop
(
quec_timer_t timerRef /* OS supplied timer reference */
);
extern QuecOSStatus quec_rtos_timer_get_status
(
quec_timer_t timerRef, /* OS supplied timer reference */
quec_timer_status_t *timerStatus /* OS timer status: QUEC_TMR_STA_ENABLED, QUEC_TMR_STA_DISABLED */
);
extern QuecOSStatus quec_rtos_timer_delete
(
quec_timer_t timerRef /* OS supplied timer reference */
);
extern QuecOSStatus quec_task_timer_delete
(
quec_timer_t timerRef /* OS supplied timer reference */
);
extern int quec_get_task_stack_info
(
OSTaskRef task_handle,
char** taskName,
unsigned long* stackSize,
unsigned long* stackInuse,
unsigned long* stackPeak
);
extern uint64 quec_rtos_get_systime(void);
extern char *quec_get_current_task_name(void);
void quec_rtos_task_switch_in_cb_reg(void *cb);
void quec_icu_switch_in_cb_reg(void *cb);
void quec_ostimer_switch_in_cb_reg(void *cb);
void * quec_get_current_task_ptr(void);
#define quec_rtos_running_time_measure_prepare() uint64 quec_systime_start = 0
#define quec_rtos_running_time_measure_start() do{quec_systime_start = quec_rtos_get_systime();}while(0)
#define quec_rtos_running_time_measure_stop(during) do{during = (quec_rtos_get_systime() - quec_systime_start);}while(0)
#endif