mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-06 03:41:41 +08:00
845
System/os_timing.c
Normal file
845
System/os_timing.c
Normal file
File diff suppressed because it is too large
Load Diff
86
System/os_var.c
Normal file
86
System/os_var.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_var.c
|
||||
* @brief 系统全局变量定义
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_redef.h"
|
||||
|
||||
/* The Soft-RTC */
|
||||
#if SYSCFG_SOFTRTC == __ENABLED__
|
||||
s_u8_t _SYS_MEM_ s_rtc[2][7] = {sInitRealTime, sInitRealTime};
|
||||
volatile s_bool_t s_rtc_binary = false;
|
||||
s_u8_t _SYS_MEM_ s_month2day = 28;
|
||||
const s_u8_t _CONST_MEM_ s_month0day[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
volatile s_every_ts _SYS_MEM_ s_sign_every = {0, 0, 0, 0, 0, 0};
|
||||
#endif
|
||||
/* The Task */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_return = true;
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_scheduling = false;
|
||||
volatile s_u8_t _SYS_MEM_ s_taskcri_counter = 0;
|
||||
s_sharing_t _SYS_MEM_ s_tick_counter = 0;
|
||||
s_taskhand_tsp _SYS_MEM_ s_task_starter = NULL;
|
||||
s_tasknode_tsp _SYS_MEM_ s_task_current = NULL;
|
||||
s_tasknode_tsp _SYS_MEM_ s_taskpri_tail = NULL;
|
||||
s_ecode_t _SYS_MEM_ s_startup_code = OS_ECODE_NOERROR;
|
||||
s_delay_t s_delay_loader[OS_TASKTOTAL + 1];
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
s_u8_t _SYS_MEM_ s_task_status0 = OS_STATUS_DELETED;
|
||||
#endif
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
s_bool_t s_sign_timeout[OS_TASKTOTAL + 1];
|
||||
#endif
|
||||
#if SYSCFG_TIMESHARINGMODE == 2
|
||||
const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY] = {SYSCFG_CUSTOMTIMESHARING};
|
||||
#endif
|
||||
/* The Timing Interrupt-Task/Hook */
|
||||
#if OS_TIMINTTOTAL
|
||||
s_bool_t s_timint_hookortask[OS_TIMINTTOTAL];
|
||||
s_bool_t s_timint_autoreload[OS_TIMINTTOTAL];
|
||||
s_timint_t s_timint_reload[OS_TIMINTTOTAL];
|
||||
s_timint_t s_timint_loader[OS_TIMINTTOTAL];
|
||||
s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL];
|
||||
#endif
|
||||
/* The Timing Query-Task/Hook */
|
||||
#if OS_TIMQRYTOTAL
|
||||
s_bool_t s_timqry_hookortask[OS_TIMQRYTOTAL];
|
||||
s_bool_t s_timqry_autoreload[OS_TIMQRYTOTAL];
|
||||
s_timqry_t s_timqry_reload[OS_TIMQRYTOTAL];
|
||||
s_timqry_t s_timqry_loader[OS_TIMQRYTOTAL];
|
||||
s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL];
|
||||
#endif
|
||||
/* The Global Variable Accessor */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_updatecopy = false;
|
||||
/* The Message Mailbox Accessor */
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
s_mbox_tsp _SYS_MEM_ s_mbox_accessor = NULL;
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_write_mbox_accessor = false;
|
||||
#endif
|
||||
#endif
|
||||
/* The Task Message */
|
||||
#if SYSCFG_TASKMSG == __ENABLED__
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_send_taskmsg = false;
|
||||
#endif
|
||||
/* The Debug Interface */
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_alarm_ts s_alarm = {0, 0, 0, 0};
|
||||
s_fault_ts s_fault = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE];
|
||||
char _XDATA_MEM_ * s_debug_recvptr = s_debug_recvbuff;
|
||||
volatile s_u8_t s_debug_sendtype = 0;
|
||||
char _XDATA_MEM_ * s_debug_sendptr;
|
||||
char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE];
|
||||
char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE];
|
||||
volatile s_bool_t s_taskmgr_binary = SYSCFG_TASKMGRAUTOSTART;
|
||||
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
|
||||
s_u32_t s_tick_counter1 = 0;
|
||||
s_u32_t s_tick_counter2 = 0;
|
||||
#endif
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
m_pc_t s_pc = 0;
|
||||
#endif
|
||||
#endif
|
||||
92
System/os_var.h
Normal file
92
System/os_var.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_var.h
|
||||
* @brief 系统全局变量声明
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OS_VAR_H
|
||||
#define __OS_VAR_H
|
||||
#include "os_redef.h"
|
||||
|
||||
/* The Soft-RTC */
|
||||
#if SYSCFG_SOFTRTC == __ENABLED__
|
||||
extern s_u8_t _SYS_MEM_ s_rtc[2][7];
|
||||
extern volatile s_bool_t s_rtc_binary;
|
||||
extern s_u8_t _SYS_MEM_ s_month2day;
|
||||
extern const s_u8_t _CONST_MEM_ s_month0day[13];
|
||||
extern volatile s_every_ts _SYS_MEM_ s_sign_every;
|
||||
#endif
|
||||
/* The Task */
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_return;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_scheduling;
|
||||
extern volatile s_u8_t _SYS_MEM_ s_taskcri_counter;
|
||||
extern s_sharing_t _SYS_MEM_ s_tick_counter;
|
||||
extern s_taskhand_tsp _SYS_MEM_ s_task_starter;
|
||||
extern s_tasknode_tsp _SYS_MEM_ s_task_current;
|
||||
extern s_tasknode_tsp _SYS_MEM_ s_taskpri_tail;
|
||||
extern s_ecode_t _SYS_MEM_ s_startup_code;
|
||||
extern s_delay_t s_delay_loader[OS_TASKTOTAL + 1];
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
extern s_u8_t _SYS_MEM_ s_task_status0;
|
||||
#endif
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
extern s_bool_t s_sign_timeout[OS_TASKTOTAL + 1];
|
||||
#endif
|
||||
#if SYSCFG_TIMESHARINGMODE == 2
|
||||
extern const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY];
|
||||
#endif
|
||||
/* The Timing Interrupt-Task/Hook */
|
||||
#if OS_TIMINTTOTAL
|
||||
extern s_bool_t s_timint_hookortask[OS_TIMINTTOTAL];
|
||||
extern s_bool_t s_timint_autoreload[OS_TIMINTTOTAL];
|
||||
extern s_timint_t s_timint_reload[OS_TIMINTTOTAL];
|
||||
extern s_timint_t s_timint_loader[OS_TIMINTTOTAL];
|
||||
extern s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL];
|
||||
#endif
|
||||
/* The Timing Query-Task/Hook */
|
||||
#if OS_TIMQRYTOTAL
|
||||
extern s_bool_t s_timqry_hookortask[OS_TIMQRYTOTAL];
|
||||
extern s_bool_t s_timqry_autoreload[OS_TIMQRYTOTAL];
|
||||
extern s_timqry_t s_timqry_reload[OS_TIMQRYTOTAL];
|
||||
extern s_timqry_t s_timqry_loader[OS_TIMQRYTOTAL];
|
||||
extern s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL];
|
||||
#endif
|
||||
/* The Global Variable Accessor */
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_updatecopy;
|
||||
/* The Message Mailbox Accessor */
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
extern s_mbox_tsp _SYS_MEM_ s_mbox_accessor;
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_write_mbox_accessor;
|
||||
#endif
|
||||
#endif
|
||||
/* The Task Message */
|
||||
#if SYSCFG_TASKMSG == __ENABLED__
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_send_taskmsg;
|
||||
#endif
|
||||
/* The Debug Interface */
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
extern s_alarm_ts s_alarm;
|
||||
extern s_fault_ts s_fault;
|
||||
extern char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE];
|
||||
extern char _XDATA_MEM_ * s_debug_recvptr;
|
||||
extern volatile s_u8_t s_debug_sendtype;
|
||||
extern char _XDATA_MEM_ * s_debug_sendptr;
|
||||
extern char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE];
|
||||
extern char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE];
|
||||
extern volatile s_bool_t s_taskmgr_binary;
|
||||
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
|
||||
extern s_u32_t s_tick_counter1;
|
||||
extern s_u32_t s_tick_counter2;
|
||||
#endif
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
extern m_pc_t s_pc;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_Handler[OS_SVID_END])(void _OBJ_MEM_ *);
|
||||
|
||||
#endif
|
||||
240
System/sv_create.h
Normal file
240
System/sv_create.h
Normal file
@@ -0,0 +1,240 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_create.h
|
||||
* @brief 创建服务(用于创建各种内核对象)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_CREATE_H
|
||||
#define __SV_CREATE_H
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 声明任务
|
||||
*/
|
||||
|
||||
/* 无私信 */
|
||||
#define sCSV_ExternTask(name) \
|
||||
extern s_taskhand_ts u_taskhand_##name; \
|
||||
void name(void)
|
||||
|
||||
/* 有私信 */
|
||||
#define sCSV_ExternTask_Msg(name) \
|
||||
extern s_taskhand_ts u_taskhand_##name; \
|
||||
void name(MCUCFG_TASKMSG_VAR,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 创建任务
|
||||
*/
|
||||
|
||||
/* 创建一般任务 */
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
#if SYSCFG_TASKCREATEMODE == __STATIC__
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
|
||||
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, u_taskstack_##name, tss, #name, {0}, MCUCFG_BASICSTACKSIZE, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
|
||||
#elif SYSCFG_TASKCREATEMODE == __BALANCE__
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, NULL, tss, #name, {0}, MCUCFG_BASICSTACKSIZE, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name, false}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
|
||||
#elif SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
|
||||
s_taskhand_ts u_taskhand_##name = {0, tss, pri, (s_voidvoid_tfp)name, #name, srt, NULL}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
|
||||
#endif
|
||||
#else
|
||||
#if SYSCFG_TASKCREATEMODE == __STATIC__
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
|
||||
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, u_taskstack_##name, tss, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
|
||||
#elif SYSCFG_TASKCREATEMODE == __BALANCE__
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, NULL, tss, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
|
||||
#elif SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
|
||||
s_taskhand_ts u_taskhand_##name = {0, tss, pri, (s_voidvoid_tfp)name, srt, NULL}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* 创建定时中断任务 */
|
||||
#define sCSV_CreateTask_TimInt(tmid, arl, name, pri, tss, srt, ntm) \
|
||||
s_taskhand_ts u_taskhand_##name; \
|
||||
const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {&u_taskhand_##name, (s_voidvoid_tfp)0, arl}; \
|
||||
sCSV_CreateTask(name, pri, tss, srt, ntm)
|
||||
|
||||
/* 创建定时查询任务 */
|
||||
#define sCSV_CreateTask_TimQry(tmid, event, arl, name, pri, tss, srt, ntm) \
|
||||
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING \
|
||||
{ \
|
||||
return (event ? true : false); \
|
||||
} \
|
||||
s_taskhand_ts u_taskhand_##name; \
|
||||
const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {&u_taskhand_##name, (s_voidvoid_tfp)0, (s_boolvoid_tfp)u_timqryevent_##tmid, arl}; \
|
||||
sCSV_CreateTask(name, pri, tss, srt, ntm)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 创建钩子
|
||||
*/
|
||||
|
||||
/* 创建定时中断钩子 */
|
||||
#define sCSV_CreateHook_TimInt(tmid, arl, name) \
|
||||
void name(void); \
|
||||
const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {(s_taskhand_tsp)0, (s_voidvoid_tfp)name, arl}; \
|
||||
void name(void) MCUCFG_USING
|
||||
|
||||
/* 创建定时查询钩子 */
|
||||
#define sCSV_CreateHook_TimQry(tmid, event, arl, name) \
|
||||
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING \
|
||||
{ \
|
||||
return (event ? true : false); \
|
||||
} \
|
||||
void name(void); \
|
||||
const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {(s_taskhand_tsp)0, (s_voidvoid_tfp)name, (s_boolvoid_tfp)u_timqryevent_##tmid, arl}; \
|
||||
void name(void) MCUCFG_USING
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/* 声明 */
|
||||
#define sCSV_ExternBin(name) \
|
||||
extern volatile s_bool_t name
|
||||
|
||||
/* 创建 */
|
||||
#define sCSV_CreateBin(name) \
|
||||
volatile s_bool_t name
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 互斥信号量
|
||||
*/
|
||||
|
||||
/* 声明 */
|
||||
#define sCSV_ExternMut(name) \
|
||||
extern s_mutex_ts name
|
||||
|
||||
/* 创建 */
|
||||
#define sCSV_CreateMut(name) \
|
||||
s_mutex_ts name = {false, NULL, 0}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
|
||||
/* 声明 */
|
||||
#define sCSV_ExternSem(name) \
|
||||
extern s_sem_ts name
|
||||
|
||||
/* 创建 */
|
||||
#define sCSV_CreateSem(name, init, max) \
|
||||
s_sem_ts name = {init, max}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
|
||||
/* 声明信箱 */
|
||||
#define sCSV_ExternFetion(name) \
|
||||
extern volatile m_fetion_t name
|
||||
|
||||
/* 创建信箱 */
|
||||
#define sCSV_CreateFetion(name) \
|
||||
volatile m_fetion_t name = false
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱
|
||||
*/
|
||||
|
||||
/* 声明邮箱 */
|
||||
#define sCSV_ExternMailbox(name, type) \
|
||||
extern type name; \
|
||||
sCSV_ExternBin(name##_gnmf)
|
||||
|
||||
/* 创建邮箱 */
|
||||
#define sCSV_CreateMailbox(name, type) \
|
||||
type name; \
|
||||
sCSV_CreateBin(name##_gnmf) = false
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
|
||||
/* 声明静态消息队列 */
|
||||
#define sCSV_ExternMsgQueue_Static(name) \
|
||||
extern s_msgqueue_static_ts name
|
||||
|
||||
/* 声明动态消息队列 */
|
||||
#define sCSV_ExternMsgQueue_Dynamic(name) \
|
||||
extern s_msgqueue_dynamic_ts name
|
||||
|
||||
/* 创建静态消息队列 */
|
||||
#define sCSV_CreateMsgQueue_Static(name, mode, len) \
|
||||
void *u_msgqueue_##name[len]; \
|
||||
s_msgqueue_static_ts name = {0, __STATIC__, mode, len, true, u_msgqueue_##name, u_msgqueue_##name + len - 1, u_msgqueue_##name}
|
||||
|
||||
/* 创建动态消息队列 */
|
||||
#define sCSV_CreateMsgQueue_Dynamic(name, mode, len) \
|
||||
s_msgqueue_dynamic_ts name = {0, __DYNAMIC__, mode, len, true, NULL, NULL}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 事件标志组
|
||||
*/
|
||||
|
||||
/* 声明 */
|
||||
#define sCSV_ExternFlagGroup(name, bits) \
|
||||
typedef struct{bits} u_##name##_ts; \
|
||||
extern volatile u_##name##_ts name
|
||||
|
||||
/* 创建 */
|
||||
#define sCSV_CreateFlagGroup(name) \
|
||||
volatile u_##name##_ts name
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 线程内存
|
||||
*/
|
||||
|
||||
/* 创建线程内存池 */
|
||||
#define sCSV_CreateMempool \
|
||||
s_thrmem_ts u_thrmem = {NULL, NULL, 0}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
172
System/sv_int_loc.c
Normal file
172
System/sv_int_loc.c
Normal file
@@ -0,0 +1,172 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_loc.c
|
||||
* @brief 中断本地服务(仅在用户中断中调用,并在本地执行)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_var.h"
|
||||
#include "os_api.h"
|
||||
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
#pragma NOAREGS
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量(获取)
|
||||
*/
|
||||
|
||||
s_bool_t si_take_binary(s_bool_t _OBJ_MEM_ *bin)
|
||||
{
|
||||
if(*bin){
|
||||
*bin = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信(接收飞信)
|
||||
*/
|
||||
#if SYSCFG_FETION == __ENABLED__
|
||||
|
||||
m_fetion_t si_recv_fetion(m_fetion_t _OBJ_MEM_ *ft)
|
||||
{
|
||||
m_fetion_t fetion = *ft;
|
||||
*ft = false;
|
||||
return fetion;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱(接收邮件)
|
||||
*/
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
|
||||
s_bool_t si_can_read_gmbox(void _OBJ_MEM_ *gm)
|
||||
{
|
||||
if(s_sign_write_mbox_accessor
|
||||
|| s_mbox_accessor == NULL || s_mbox_accessor->gm != gm){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
|
||||
s_bool_t si_can_read_lmbox(void)
|
||||
{
|
||||
if(!s_mbox_accessor->lf) return false;
|
||||
s_mbox_accessor->lf = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void *si_get_lmbox(void)
|
||||
{
|
||||
return s_mbox_accessor->lm;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
s_bool_t si_recv_mail(void *lm, void *gm, size_t size, s_bool_t *gf) MCUCFG_251_REENTRANT
|
||||
{
|
||||
if(s_mbox_accessor == NULL || s_mbox_accessor->gm != gm){
|
||||
if(*gf){
|
||||
*gf = false;
|
||||
s_memcpy(lm, gm, size);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
else if(s_mbox_accessor->lf){
|
||||
s_mbox_accessor->lf = false;
|
||||
s_memcpy(lm, s_mbox_accessor->lm, size);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列(接收消息)
|
||||
*/
|
||||
#if SYSCFG_MSGQUEUE == __ENABLED__
|
||||
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
|
||||
s_bool_t si_can_access_msgqueue(s_msgqueue_tsp queue)
|
||||
{
|
||||
if(!queue->mutex) goto __RET_FALSE;
|
||||
queue->mutex = false;
|
||||
if(queue->type == __DYNAMIC__){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.error_recvmsg_int = true;
|
||||
#endif
|
||||
goto __FREE_MUTEX;
|
||||
}
|
||||
if(!queue->counter) goto __FREE_MUTEX;
|
||||
return true;
|
||||
|
||||
__FREE_MUTEX:
|
||||
queue->mutex = true;
|
||||
|
||||
__RET_FALSE:
|
||||
return false;
|
||||
}
|
||||
|
||||
static void *_recv_msg_(s_bool_t _OBJ_MEM_ *mut, void *msg)
|
||||
{
|
||||
*mut = true;
|
||||
return msg;
|
||||
}
|
||||
|
||||
void *si_recv_msg(s_msgqueue_tsp queue)
|
||||
{
|
||||
void *msg;
|
||||
sRecvMsg_Static(msg);
|
||||
return _recv_msg_((s_bool_t *)&queue->mutex, msg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void *si_recv_msg(s_msgqueue_tsp queue)
|
||||
{
|
||||
void *msg = NULL;
|
||||
if(!queue->mutex) return NULL;
|
||||
queue->mutex = false;
|
||||
if(queue->type == __DYNAMIC__){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.error_recvmsg_int = true;
|
||||
#endif
|
||||
}
|
||||
else if(!queue->counter);
|
||||
else{
|
||||
sRecvMsg_Static(msg);
|
||||
}
|
||||
queue->mutex = true;
|
||||
return msg;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
128
System/sv_int_loc.h
Normal file
128
System/sv_int_loc.h
Normal file
@@ -0,0 +1,128 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_loc.h
|
||||
* @brief 中断本地服务(仅在用户中断中调用,并在本地执行)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_INT_LOC_H
|
||||
#define __SV_INT_LOC_H
|
||||
|
||||
s_bool_t si_take_binary(s_bool_t _OBJ_MEM_ *bin);
|
||||
m_fetion_t si_recv_fetion(m_fetion_t _OBJ_MEM_ *ft);
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
s_bool_t si_can_read_gmbox(void _OBJ_MEM_ *gm);
|
||||
s_bool_t si_can_read_lmbox(void);
|
||||
void *si_get_lmbox(void);
|
||||
s_bool_t si_can_access_msgqueue(s_msgqueue_tsp queue);
|
||||
#else
|
||||
s_bool_t si_recv_mail(void *lm, void *gm, size_t size, s_bool_t *gf) MCUCFG_251_REENTRANT;
|
||||
#endif
|
||||
void *si_recv_msg (s_msgqueue_tsp queue);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量(获取)
|
||||
*/
|
||||
|
||||
#define sISV_TakeBin(bin) \
|
||||
si_take_binary((s_bool_t *)&bin)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信(接收飞信)
|
||||
*/
|
||||
|
||||
#define sISV_RecvFetion(tbox) \
|
||||
( \
|
||||
tbox ? si_recv_fetion((m_fetion_t *)&tbox) : false \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱(接收邮件)
|
||||
*/
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
|
||||
#define sISV_RecvMail(mail, mbox) \
|
||||
( \
|
||||
si_can_read_gmbox(&mbox) \
|
||||
? mbox##_gnmf \
|
||||
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
|
||||
? mbox##_gnmf-- \
|
||||
: mbox##_gnmf-- \
|
||||
: false \
|
||||
: false \
|
||||
)
|
||||
|
||||
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
#define sISV_RecvMail(mail, mbox) \
|
||||
( \
|
||||
si_can_read_gmbox(&mbox) \
|
||||
? mbox##_gnmf \
|
||||
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
|
||||
? mbox##_gnmf-- \
|
||||
: mbox##_gnmf-- \
|
||||
: false \
|
||||
: si_can_read_lmbox() \
|
||||
? s_memcpy(mail, si_get_lmbox(), sizeof(mbox)) || true \
|
||||
? true \
|
||||
: true \
|
||||
: false \
|
||||
)
|
||||
|
||||
#endif
|
||||
#else
|
||||
#define sISV_RecvMail(mail, mbox) \
|
||||
si_recv_mail(mail, &mbox, sizeof(mbox), &mbox##_gnmf)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列(接收消息)
|
||||
*/
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
#define sISV_RecvMsg(que) \
|
||||
( \
|
||||
si_can_access_msgqueue(que) ? si_recv_msg(que) : NULL \
|
||||
)
|
||||
#else
|
||||
#define sISV_RecvMsg(que) \
|
||||
si_recv_msg(que)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 事件标志组
|
||||
*/
|
||||
|
||||
/* 查询标志组 */
|
||||
#define sISV_QueryFlagGroup(group) \
|
||||
( \
|
||||
sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \
|
||||
: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
|
||||
: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
|
||||
: false \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 软件RTC
|
||||
*/
|
||||
|
||||
/* 获取时间 */
|
||||
#define sISV_GetTime(t) \
|
||||
s_memcpy(t, !iWhichGVar_Read ? s_rtc[0] : s_rtc[1], sizeof(s_rtc[0]))
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
283
System/sv_int_pend.c
Normal file
283
System/sv_int_pend.c
Normal file
@@ -0,0 +1,283 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_pend.c
|
||||
* @brief 中断挂起服务 - 执行函数(仅在PendSV中调用并执行)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
|
||||
/* 恢复任务 */
|
||||
static void _resume_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL) return;
|
||||
#endif
|
||||
if(node->status & OS_STATUS_SUSPENDED){
|
||||
node->status &= (~OS_STATUS_SUSPENDED & 0xFF);
|
||||
if(!s_sign_scheduling){
|
||||
if(node->status <= OS_STATUS_FLOATING && node->pri > s_task_current->pri){
|
||||
s_sign_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 挂起任务 */
|
||||
static void _suspend_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL) return;
|
||||
#endif
|
||||
if(node->status < OS_STATUS_SUSPENDED){
|
||||
node->status |= OS_STATUS_SUSPENDED;
|
||||
if(!s_sign_scheduling){
|
||||
if(node == s_task_current){
|
||||
s_sign_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 删除任务 */
|
||||
static void _delete_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL) return;
|
||||
#endif
|
||||
if(node->status < OS_STATUS_DELETED){
|
||||
node->status = OS_STATUS_DELETED;
|
||||
if(!s_sign_scheduling){
|
||||
if(node == s_task_current){
|
||||
s_sign_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 设置任务优先级 */
|
||||
static void _set_taskpri_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp node = ((sp_taskpri_tsp)sv)->node;
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL) return;
|
||||
#endif
|
||||
if(node->status < OS_STATUS_STOPPED){
|
||||
s_u8_t pri = ((sp_taskpri_tsp)sv)->pri;
|
||||
if(node->pri != pri){
|
||||
node->pri = pri;
|
||||
sSetTaskPri(node);
|
||||
if(!s_sign_scheduling){
|
||||
if(pri > s_task_current->pri && node->status <= OS_STATUS_FLOATING){
|
||||
s_sign_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 设置阻塞(时间)*/
|
||||
static void _set_block_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp node = ((sp_blocktime_tsp)sv)->node;
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL) return;
|
||||
#endif
|
||||
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
|
||||
s_delay_loader[node->tid] = ((sp_blocktime_tsp)sv)->tick;
|
||||
if(!((sp_blocktime_tsp)sv)->tick){
|
||||
node->status = OS_STATUS_READY;
|
||||
if(!s_sign_scheduling){
|
||||
if(node->pri > s_task_current->pri){
|
||||
s_sign_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 清除阻塞(状态)*/
|
||||
static void _clear_block_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL) return;
|
||||
#endif
|
||||
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
|
||||
s_delay_loader[node->tid] = 0;
|
||||
node->status = OS_STATUS_READY;
|
||||
if(!s_sign_scheduling){
|
||||
if(node->pri > s_task_current->pri){
|
||||
s_sign_scheduling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 定时中断 */
|
||||
#if OS_TIMINTTOTAL
|
||||
static void _timint_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_timint_loader[((sp_timint_tsp)sv)->tmid]
|
||||
= s_timint_reload[((sp_timint_tsp)sv)->tmid]
|
||||
= ((sp_timint_tsp)sv)->tick;
|
||||
}
|
||||
#else
|
||||
#define _timint_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 定时查询 */
|
||||
#if OS_TIMQRYTOTAL
|
||||
static void _timqry_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_timqry_loader[((sp_timqry_tsp)sv)->tmid]
|
||||
= s_timqry_reload[((sp_timqry_tsp)sv)->tmid]
|
||||
= ((sp_timqry_tsp)sv)->tick;
|
||||
}
|
||||
#else
|
||||
#define _timqry_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 上锁/给予二值信号量 */
|
||||
#if SYSCFG_BINARY == __ENABLED__
|
||||
static void _binary_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
*((sp_binary_tsp)sv)->bin = ((sp_binary_tsp)sv)->value;
|
||||
}
|
||||
#else
|
||||
#define _binary_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 给予计数信号量 */
|
||||
#if SYSCFG_SEMAPHORE == __ENABLED__
|
||||
static void _give_sem_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
if(((sp_sem_tsp)sv)->sem->counter < ((sp_sem_tsp)sv)->sem->maximum){
|
||||
((sp_sem_tsp)sv)->sem->counter++;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _give_sem_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 全局变量写访问 */
|
||||
static void _gvar_write_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
((sp_gvar_tsp)sv)->size
|
||||
? s_memcpy(((sp_gvar_tsp)sv)->gp, ((sp_gvar_tsp)sv)->lp, ((sp_gvar_tsp)sv)->size)
|
||||
: s_strcpy((char *)((sp_gvar_tsp)sv)->gp, (char *)((sp_gvar_tsp)sv)->lp);
|
||||
}
|
||||
|
||||
/* 挂起服务调用 */
|
||||
static void _pendsvc_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
(*((sp_pendsvc_tsp)sv)->fp)();
|
||||
}
|
||||
|
||||
/* 发送飞信 */
|
||||
#if SYSCFG_FETION == __ENABLED__
|
||||
static void _send_fetion_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
*((sp_fetion_tsp)sv)->tbox = ((sp_fetion_tsp)sv)->fetion;
|
||||
}
|
||||
#else
|
||||
#define _send_fetion_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 发送邮件 */
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
static void _send_mail_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
si_mbox_tsp accessor = ((sp_mbox_tsp)sv)->accessor;
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
accessor->lf = true;
|
||||
#endif
|
||||
sWrite_MBoxAccessor((s_mbox_tsp)accessor);
|
||||
s_memcpy(accessor->gm, accessor->lm, accessor->size);
|
||||
sWrite_MBoxAccessor(NULL);
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
|
||||
*accessor->gf = true;
|
||||
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
*accessor->gf = accessor->lf;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
#define _send_mail_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 发送消息 */
|
||||
#if SYSCFG_MSGQUEUE == __ENABLED__
|
||||
static void _send_msg_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_msgqueue_tsp queue = ((sp_msg_tsp)sv)->queue;
|
||||
queue->mutex = false;
|
||||
if(queue->counter == queue->len){
|
||||
queue->mutex = true;
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_alarm.overflow_msgqueue = true;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
if(queue->type == __DYNAMIC__){
|
||||
s_msgnode_tsp node = NULL;
|
||||
node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts));
|
||||
if(node == NULL){
|
||||
queue->mutex = true;
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.mallocfailed_msgnode = true;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
sSendMsg_Dynamic(((sp_msg_tsp)sv)->msg);
|
||||
}
|
||||
else{
|
||||
sSendMsg_Static(((sp_msg_tsp)sv)->msg);
|
||||
}
|
||||
queue->mutex = true;
|
||||
}
|
||||
#else
|
||||
#define _send_msg_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
/* 写标志组 */
|
||||
#if SYSCFG_FLAGGROUP == __ENABLED__
|
||||
static void _group_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
switch(((sp_group_tsp)sv)->size){
|
||||
case +1: *(s_u8_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break;
|
||||
case +2: *(s_u16_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break;
|
||||
case +4: *(s_u32_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break;
|
||||
case -1: *(s_u8_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break;
|
||||
case -2: *(s_u16_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break;
|
||||
case -4: *(s_u32_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _group_ (s_voidvptr_tfp)NULL
|
||||
#endif
|
||||
|
||||
typedef void (_CODE_MEM_ *s_voidvptr_tfp)(void _OBJ_MEM_ *);
|
||||
void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_Handler[OS_SVID_END])(void _OBJ_MEM_ *) =
|
||||
{
|
||||
_resume_task_,
|
||||
_suspend_task_,
|
||||
_delete_task_,
|
||||
_set_taskpri_,
|
||||
_set_block_,
|
||||
_clear_block_,
|
||||
_timint_,
|
||||
_timqry_,
|
||||
_binary_,
|
||||
_give_sem_,
|
||||
_gvar_write_,
|
||||
_pendsvc_,
|
||||
_send_fetion_,
|
||||
_send_mail_,
|
||||
_send_msg_,
|
||||
_group_
|
||||
};
|
||||
232
System/sv_int_pend.h
Normal file
232
System/sv_int_pend.h
Normal file
@@ -0,0 +1,232 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_pend.h
|
||||
* @brief 中断挂起服务 - 调用宏(仅在用户中断中调用)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_INT_PEND_H
|
||||
#define __SV_INT_PEND_H
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 任务
|
||||
*/
|
||||
|
||||
#if SYSCFG_TASKCREATEMODE == __STATIC__ \
|
||||
|| SYSCFG_TASKCREATEMODE == __BALANCE__
|
||||
#define sPSV_0x01(load) load
|
||||
#define sPSV_0x02(load) do{}while(false)
|
||||
|
||||
#elif SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
#define sPSV_0x01(load) NULL
|
||||
#define sPSV_0x02(load) u_psv.node = load
|
||||
|
||||
#endif
|
||||
|
||||
/* 恢复任务 */
|
||||
#define sPSV_ResumeTask(load) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_RESUMETASK, sPSV_0x01(load)}; \
|
||||
sPSV_0x02(load); \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 挂起任务 */
|
||||
#define sPSV_SuspendTask(load) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_SUSPENDTASK, sPSV_0x01(load)}; \
|
||||
sPSV_0x02(load); \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 删除任务 */
|
||||
#define sPSV_DeleteTask(load) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_DELETETASK, sPSV_0x01(load)}; \
|
||||
sPSV_0x02(load); \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 设置任务优先级 */
|
||||
#define sPSV_SetTaskPri(load, pri) \
|
||||
do{ \
|
||||
static sp_taskpri_ts u_psv = {OS_SVID_SETTASKPRI, sPSV_0x01(load), pri}; \
|
||||
sPSV_0x02(load); \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 设置阻塞(时间)*/
|
||||
#define sPSV_SetBlock(load, tc) \
|
||||
do{ \
|
||||
static sp_blocktime_ts u_psv = {OS_SVID_SETBLOCK, sPSV_0x01(load), tc}; \
|
||||
sPSV_0x02(load); \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 清除阻塞(状态)*/
|
||||
#define sPSV_ClearBlock(load) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_CELARBLOCK, sPSV_0x01(load)}; \
|
||||
sPSV_0x02(load); \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 定时
|
||||
*/
|
||||
|
||||
/* 定时中断 */
|
||||
#define sPSV_TimInt(tmid, tc) \
|
||||
do{ \
|
||||
static sp_timint_ts u_psv = {OS_SVID_TIMINT, tmid, tc}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 定时查询 */
|
||||
#define sPSV_TimQry(tmid, tc) \
|
||||
do{ \
|
||||
static sp_timqry_ts u_psv = {OS_SVID_TIMQRY, tmid, tc}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/* 上锁/给予 */
|
||||
#define sPSV_WriteBin(bin, val) \
|
||||
do{ \
|
||||
static sp_binary_ts u_psv = {OS_SVID_BINARY, (bool *)&bin, val}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
|
||||
/* 给予 */
|
||||
#define sPSV_GiveSem(sem) \
|
||||
do{ \
|
||||
static sp_sem_ts u_psv = {OS_SVID_GIVESEM, &sem}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 全局变量
|
||||
*/
|
||||
|
||||
/* 全局变量写访问 */
|
||||
#define sPSV_WriteGVar(gp, lp, size) \
|
||||
do{ \
|
||||
static sp_gvar_ts u_psv = {OS_SVID_GVARWRITE, gp, lp, size}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 挂起服务调用 */
|
||||
#define sPSV_PendSVC(fp) \
|
||||
do{ \
|
||||
static sp_pendsvc_ts u_psv = {OS_SVID_PENDSVC, fp}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
|
||||
/* 发送飞信 */
|
||||
#define sPSV_SendFetion(tbox, tion) \
|
||||
do{ \
|
||||
static sp_fetion_ts u_psv = {OS_SVID_SENDFETION, (m_fetion_t *)&tbox, 0}; \
|
||||
u_psv.fetion = tion; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱
|
||||
*/
|
||||
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
|
||||
#define sPSV_0x03
|
||||
|
||||
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
#define sPSV_0x03 false,
|
||||
|
||||
#endif
|
||||
|
||||
/* 发送邮件 */
|
||||
#define sPSV_SendMail(mbox, mail) \
|
||||
do{ \
|
||||
static si_mbox_ts u_acc = {&mbox, mail, sPSV_0x03 &mbox##_gnmf, sizeof(mbox)}; \
|
||||
static sp_mbox_ts u_psv = {OS_SVID_SENDMAIL, &u_acc}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
|
||||
/* 发送消息 */
|
||||
#define sPSV_SendMsg(que, msg) \
|
||||
do{ \
|
||||
static sp_msg_ts u_psv = {OS_SVID_SENDMSG, que, msg}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 事件标志组
|
||||
*/
|
||||
|
||||
/* 清除标志组 */
|
||||
#define sPSV_ClearFlagGroup(group) \
|
||||
do{ \
|
||||
static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&group, -sizeof(group), ~0}; \
|
||||
mPendSV_Load; \
|
||||
}while(false)
|
||||
|
||||
/* 写多标志位 */
|
||||
#define sPSV_WriteFlagBits(group, sign, nbit) \
|
||||
do{ \
|
||||
static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&group, sign##sizeof(group), 0}; \
|
||||
u_##group##_ts lv; \
|
||||
miWriteFlagBits; \
|
||||
sizeof(lv) == 1 ? *(s_u8_t *)&lv = false : OS_NOPx1; \
|
||||
sizeof(lv) == 2 ? *(s_u16_t *)&lv = false : OS_NOPx1; \
|
||||
sizeof(lv) == 4 ? *(s_u32_t *)&lv = false : OS_NOPx1; \
|
||||
siWriteFlagBits_##nbit(
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 软件RTC
|
||||
*/
|
||||
|
||||
/* 设置时间 */
|
||||
#define sPSV_SetTime(t) \
|
||||
do{ \
|
||||
iWriteGAry(s_rtc[0], t, sizeof(s_rtc[0])); \
|
||||
iGiveBin(s_rtc_binary); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
789
System/sv_task.c
Normal file
789
System/sv_task.c
Normal file
File diff suppressed because it is too large
Load Diff
380
System/sv_task.h
Normal file
380
System/sv_task.h
Normal file
@@ -0,0 +1,380 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_task.h
|
||||
* @brief 任务服务(仅在任务中调用)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_TASK_H
|
||||
#define __SV_TASK_H
|
||||
|
||||
void su_enter_critical (void);
|
||||
void su_exit_critical (void);
|
||||
void su_task_scheduling(void);
|
||||
void *su_return_voidptr (void *p);
|
||||
s_ecode_t su_startup_task (s_taskhand_tsp hand, s_u8_t status);
|
||||
s_ecode_t su_suspend_task (s_tasknode_tsp node);
|
||||
s_ecode_t su_resume_task (s_tasknode_tsp node);
|
||||
s_ecode_t su_resume_suspend (s_tasknode_tsp node);
|
||||
s_ecode_t su_delete_task (s_tasknode_tsp node);
|
||||
s_ecode_t su_set_taskpri (s_tasknode_tsp node, s_u8_t pri);
|
||||
s_ecode_t su_set_block (s_tasknode_tsp node, s_delay_t tick);
|
||||
s_ecode_t su_clear_block (s_tasknode_tsp node);
|
||||
void su_delay (s_delay_t tick);
|
||||
s_bool_t su_take_mutex (s_mutex_tsp mut, s_delay_t tick);
|
||||
void su_back_mutex (s_mutex_tsp mut);
|
||||
s_bool_t su_wait_binary (s_bool_t _OBJ_MEM_ *bin, s_delay_t tick);
|
||||
s_bool_t su_take_binary (s_bool_t _OBJ_MEM_ *bin, s_delay_t tick);
|
||||
s_bool_t su_take_semaphore (s_sem_tsp sem, s_delay_t tick);
|
||||
void su_give_semaphore (s_sem_tsp sem);
|
||||
m_fetion_t su_recv_fetion (m_fetion_t _OBJ_MEM_ *ft, s_delay_t tick);
|
||||
s_bool_t su_recv_taskmsg (m_taskmsg_t _OBJ_MEM_ *nmf, s_delay_t tick);
|
||||
s_bool_t su_recv_mail (s_bool_t _OBJ_MEM_ *gf, s_delay_t tick);
|
||||
void su_send_mail (void _OBJ_MEM_ *gm, void *lm, size_t size, s_bool_t _OBJ_MEM_ *gf);
|
||||
void *su_recv_msg (s_msgqueue_tsp queue, s_delay_t tick);
|
||||
s_ecode_t su_send_msg (s_msgqueue_tsp queue, void *msg);
|
||||
s_bool_t su_query_group (void _OBJ_MEM_ *p, s_u8_t size);
|
||||
s_bool_t su_wait_group (void _OBJ_MEM_ *p, s_u8_t size, s_delay_t tick);
|
||||
|
||||
s_bool_t su_init_mempool (s_thrmem_tsp p, size_t size);
|
||||
void _MALLOC_MEM_ *su_talloc (s_thrmem_tsp p, size_t size);
|
||||
void _MALLOC_MEM_ *su_xalloc (void _MALLOC_MEM_ *p);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 任务
|
||||
*/
|
||||
|
||||
/* 启动任务 */
|
||||
#define sUSV_StartTask(hand, status) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_startup_task(hand, !status ? OS_STATUS_READY : OS_STATUS_SUSPENDED) : false \
|
||||
)
|
||||
|
||||
/* 挂起任务 */
|
||||
#define sUSV_SuspendTask(node) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_suspend_task(node) : false \
|
||||
)
|
||||
|
||||
/* 恢复任务 */
|
||||
#define sUSV_ResumeTask(node) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_resume_task(node) : false \
|
||||
)
|
||||
|
||||
/* 恢复指定任务并挂起自身任务 */
|
||||
#define sUSV_ResumeSuspend(node) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_resume_suspend(node) : false \
|
||||
)
|
||||
|
||||
/* 删除任务 */
|
||||
#define sUSV_DeleteTask(node) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_delete_task(node) : false \
|
||||
)
|
||||
|
||||
/* 设置任务优先级 */
|
||||
#define sUSV_SetTaskPri(node, pri) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_set_taskpri(node, pri) : false \
|
||||
)
|
||||
|
||||
/* 设置阻塞(时间)*/
|
||||
#define sUSV_SetBlock(node, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_set_block(node, tc) : false \
|
||||
)
|
||||
|
||||
/* 清除阻塞(状态)*/
|
||||
#define sUSV_ClearBlock(node) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_clear_block(node) : false \
|
||||
)
|
||||
|
||||
/* 自身任务延时 */
|
||||
#define sUSV_Delay(tc) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
su_delay(tc); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 定时
|
||||
*/
|
||||
|
||||
/* 定时中断 */
|
||||
#define sUSV_TimInt(tmid, tc) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
s_timint_loader[tmid] = s_timint_reload[tmid] = tc; \
|
||||
uExitCritical; \
|
||||
}while(false)
|
||||
|
||||
/* 定时查询 */
|
||||
#define sUSV_TimQry(tmid, tc) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc; \
|
||||
uExitCritical; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 互斥信号量
|
||||
*/
|
||||
|
||||
/* 获取 */
|
||||
#define sUSV_TakeMut(mut, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_take_mutex(&mut, tc) : false \
|
||||
)
|
||||
|
||||
/* 归还 */
|
||||
#define sUSV_BackMut(mut) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
su_back_mutex(&mut); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/* 等待 */
|
||||
#define sUSV_WaitBin(bin, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_wait_binary((s_bool_t *)&bin, tc) : false \
|
||||
)
|
||||
|
||||
/* 获取 */
|
||||
#define sUSV_TakeBin(bin, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_take_binary((s_bool_t *)&bin, tc) : false \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
|
||||
/* 获取 */
|
||||
#define sUSV_TakeSem(sem, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_take_semaphore(&sem, tc) : false \
|
||||
)
|
||||
|
||||
/* 给予/归还 */
|
||||
#define sUSV_GiveSem(sem) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
su_give_semaphore(&sem); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
|
||||
/* 接收飞信 */
|
||||
#define sUSV_RecvFetion(tbox, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_recv_fetion((m_fetion_t *)&tbox, tc) : false \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 私信
|
||||
*/
|
||||
|
||||
/* 接收私信 */
|
||||
#define sUSV_RecvTaskMsg(tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true \
|
||||
? su_recv_taskmsg(&m0_, tc) \
|
||||
? s_memcpy(&m0 + 1, &m0_ + 1, MCUCFG_TASKMSG_SIZE) || true \
|
||||
? (m_boolvoid_tf(su_exit_critical))() || true \
|
||||
: (m_boolvoid_tf(su_exit_critical))() || true \
|
||||
: false \
|
||||
: false \
|
||||
)
|
||||
|
||||
/* 发送私信 */
|
||||
#define sUSV_SendTaskMsg(task) \
|
||||
uEnterCritical; \
|
||||
s_sign_send_taskmsg = true; \
|
||||
MCUCFG_TASKMSG_PSP; \
|
||||
task(MCUCFG_TASKMSG_VAL,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱
|
||||
*/
|
||||
|
||||
/* 接收邮件 */
|
||||
#define sUSV_RecvMail(mail, mbox, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true \
|
||||
? su_recv_mail((s_bool_t *)&mbox##_gnmf, tc) \
|
||||
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
|
||||
? (m_boolvoid_tf(su_exit_critical))() || true \
|
||||
: (m_boolvoid_tf(su_exit_critical))() || true \
|
||||
: false \
|
||||
: false \
|
||||
)
|
||||
|
||||
/* 发送邮件 */
|
||||
#define sUSV_SendMail(mbox, mail) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
su_send_mail(&mbox, mail, sizeof(mbox), (s_bool_t *)&mbox##_gnmf); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
|
||||
/* 接收消息 */
|
||||
#define sUSV_RecvMsg(que, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_recv_msg(que, tc) : NULL \
|
||||
)
|
||||
|
||||
/* 发送消息 */
|
||||
#define sUSV_SendMsg(que, msg) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_send_msg(que, msg) : false \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 事件标志组
|
||||
*/
|
||||
|
||||
/* 查询标志组 */
|
||||
#define sUSV_QueryFlagGroup(group) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_query_group((void *)&group, sizeof(group)) : false \
|
||||
)
|
||||
|
||||
/* 等待标志组 */
|
||||
#define sUSV_WaitFlagGroup(group, tc) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_wait_group((void *)&group, sizeof(group), tc) : false \
|
||||
)
|
||||
|
||||
/* 清除标志组 */
|
||||
#define sUSV_ClearFlagGroup(group) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
sizeof(group) == 1 ? *(s_u8_t *)&group = false : OS_NOPx1; \
|
||||
sizeof(group) == 2 ? *(s_u16_t *)&group = false : OS_NOPx1; \
|
||||
sizeof(group) == 4 ? *(s_u32_t *)&group = false : OS_NOPx1; \
|
||||
uExitCritical; \
|
||||
}while(false)
|
||||
|
||||
/* 写标志位 */
|
||||
#define sUSV_WriteFlagBit(group, bit, value) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
group.bit = value; \
|
||||
uExitCritical; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 软件RTC
|
||||
*/
|
||||
|
||||
/* 获取时间 */
|
||||
#define sUSV_GetTime(t) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_return_voidptr(s_memcpy(t, s_rtc[0], sizeof(s_rtc[0]))) : NULL \
|
||||
)
|
||||
|
||||
/* 设置时间 */
|
||||
#define sUSV_SetTime(t) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \
|
||||
uUpdateCopy_GVar(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \
|
||||
uExitCritical; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 进程内存
|
||||
*/
|
||||
|
||||
/* malloc */
|
||||
#define sUSV_Malloc(size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_malloc(size)) : NULL \
|
||||
)
|
||||
|
||||
/* calloc */
|
||||
#define sUSV_Calloc(nmemb, size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_calloc(nmemb, size)) : NULL \
|
||||
)
|
||||
|
||||
/* realloc */
|
||||
#define sUSV_Realloc(p, size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_realloc(p, size)) : NULL \
|
||||
)
|
||||
|
||||
/* free */
|
||||
#define sUSV_Free(p) \
|
||||
do{ \
|
||||
uEnterCritical; \
|
||||
s_free(p); \
|
||||
uExitCritical; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 线程内存
|
||||
*/
|
||||
|
||||
/* 初始化线程内存池 */
|
||||
#define sUSV_InitMempool(size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_init_mempool(&u_thrmem, size) : false \
|
||||
)
|
||||
|
||||
/* 线程内存分配 */
|
||||
#define sUSV_Talloc(size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(su_talloc(&u_thrmem, size)) : NULL \
|
||||
)
|
||||
|
||||
/* 释放线程内存池 */
|
||||
#define sUSV_FreeMempool \
|
||||
do{ \
|
||||
sUSV_Free(u_thrmem.head); \
|
||||
u_thrmem.head = u_thrmem.move = NULL; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
292
System/sv_tick.c
Normal file
292
System/sv_tick.c
Normal file
@@ -0,0 +1,292 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_tick.c
|
||||
* @brief 滴答服务(仅在滴答钩子、定时中断钩子、定时查询钩子中调用)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_var.h"
|
||||
#include "os_api.h"
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 任务
|
||||
*/
|
||||
|
||||
/* 挂起任务 */
|
||||
s_ecode_t st_suspend_task(s_tasknode_tsp node) MCUCFG_C51USING
|
||||
{
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
#endif
|
||||
if(node->status < OS_STATUS_SUSPENDED){
|
||||
node->status |= OS_STATUS_SUSPENDED;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
if(node->status & OS_STATUS_SUSPENDED){
|
||||
return OS_ECODE_TASKSUSPENDED;
|
||||
}
|
||||
if(node->status & OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKSTOPPED;
|
||||
}
|
||||
if(node->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/* 恢复任务 */
|
||||
s_ecode_t st_resume_task(s_tasknode_tsp node) MCUCFG_C51USING
|
||||
{
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
#endif
|
||||
if(node->status & OS_STATUS_SUSPENDED){
|
||||
node->status &= (~OS_STATUS_SUSPENDED & 0xFF);
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
if(node->status < OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKNOTSUSPENDED;
|
||||
}
|
||||
if(node->status & OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKSTOPPED;
|
||||
}
|
||||
if(node->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/* 删除任务 */
|
||||
s_ecode_t st_delete_task(s_tasknode_tsp node) MCUCFG_C51USING
|
||||
{
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
#endif
|
||||
if(node->status < OS_STATUS_DELETED){
|
||||
node->status = OS_STATUS_DELETED;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
if(node->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/* 设置任务优先级 */
|
||||
s_ecode_t st_set_taskpri(s_tasknode_tsp node, s_u8_t pri) MCUCFG_C51USING
|
||||
{
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
#endif
|
||||
if(node->status < OS_STATUS_STOPPED){
|
||||
if(node->pri != pri){
|
||||
node->pri = pri;
|
||||
sSetTaskPri(node);
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_TASKPRIUNCHANGED;
|
||||
}
|
||||
}
|
||||
if(node->status & OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKSTOPPED;
|
||||
}
|
||||
if(node->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/* 设置阻塞(时间)*/
|
||||
s_ecode_t st_set_block(s_tasknode_tsp node, s_delay_t tick) MCUCFG_C51USING
|
||||
{
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
#endif
|
||||
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
|
||||
s_delay_loader[node->tid] = tick;
|
||||
if(!tick){
|
||||
node->status = OS_STATUS_READY;
|
||||
}
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
return OS_ECODE_TASKNOTBLOCKED;
|
||||
}
|
||||
|
||||
/* 清除阻塞(状态)*/
|
||||
s_ecode_t st_clear_block(s_tasknode_tsp node) MCUCFG_C51USING
|
||||
{
|
||||
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
|
||||
if(node == NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
#endif
|
||||
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
|
||||
s_delay_loader[node->tid] = 0;
|
||||
node->status = OS_STATUS_READY;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
return OS_ECODE_TASKNOTBLOCKED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/* 获取 */
|
||||
s_bool_t st_take_binary(s_bool_t _OBJ_MEM_ *bin) MCUCFG_C51USING
|
||||
{
|
||||
if(*bin){
|
||||
*bin = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
#if SYSCFG_SEMAPHORE == __ENABLED__
|
||||
/* 获取 */
|
||||
s_bool_t st_take_semaphore(s_sem_tsp sem) MCUCFG_C51USING
|
||||
{
|
||||
if(sem->counter){
|
||||
(sem->counter)--;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* 给予/归还 */
|
||||
void st_give_semaphore(s_sem_tsp sem) MCUCFG_C51USING
|
||||
{
|
||||
if(sem->counter < sem->maximum){
|
||||
sem->counter++;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
#if SYSCFG_FETION == __ENABLED__
|
||||
/* 接收飞信 */
|
||||
m_fetion_t st_recv_fetion(m_fetion_t _OBJ_MEM_ *ft) MCUCFG_C51USING
|
||||
{
|
||||
m_fetion_t fetion = *ft;
|
||||
*ft = false;
|
||||
return fetion;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱
|
||||
*/
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
/* 发送邮件 */
|
||||
void st_send_mail(void _OBJ_MEM_ *gm, void *lm, size_t size, s_bool_t _OBJ_MEM_ *gf) MCUCFG_C51USING
|
||||
{
|
||||
static s_mbox_ts accessor;
|
||||
accessor.gm = gm;
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
accessor.lm = lm;
|
||||
accessor.lf = true;
|
||||
#endif
|
||||
sWrite_MBoxAccessor(&accessor);
|
||||
s_memcpy(gm, lm, size);
|
||||
sWrite_MBoxAccessor(NULL);
|
||||
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
|
||||
*gf = true;
|
||||
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
|
||||
*gf = accessor.lf;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
#if SYSCFG_MSGQUEUE == __ENABLED__
|
||||
/* 接收消息 */
|
||||
void *st_recv_msg(s_msgqueue_tsp queue) MCUCFG_C51USING
|
||||
{
|
||||
void *msg = NULL;
|
||||
s_msgnode_tsp node;
|
||||
queue->mutex = false;
|
||||
if(!queue->counter);
|
||||
else if(queue->type == __DYNAMIC__){
|
||||
sRecvMsg_Dynamic(msg);
|
||||
}
|
||||
else{
|
||||
sRecvMsg_Static(msg);
|
||||
}
|
||||
queue->mutex = true;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/* 发送消息 */
|
||||
s_ecode_t st_send_msg(s_msgqueue_tsp queue, void *msg) MCUCFG_C51USING
|
||||
{
|
||||
queue->mutex = false;
|
||||
if(queue->counter == queue->len){
|
||||
queue->mutex = true;
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_alarm.overflow_msgqueue = true;
|
||||
#endif
|
||||
return OS_ECODE_OVERFLOW_MSGQUEUE;
|
||||
}
|
||||
if(queue->type == __DYNAMIC__){
|
||||
s_msgnode_tsp node = NULL;
|
||||
node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts));
|
||||
if(node == NULL){
|
||||
queue->mutex = true;
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.mallocfailed_msgnode = true;
|
||||
#endif
|
||||
return OS_ECODE_MALLOCFAIL_MSGNODE;
|
||||
}
|
||||
sSendMsg_Dynamic(msg);
|
||||
}
|
||||
else{
|
||||
sSendMsg_Static(msg);
|
||||
}
|
||||
queue->mutex = true;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
|
||||
#endif
|
||||
195
System/sv_tick.h
Normal file
195
System/sv_tick.h
Normal file
@@ -0,0 +1,195 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_tick.h
|
||||
* @brief 滴答服务(仅在滴答钩子、定时中断钩子、定时查询钩子中调用)
|
||||
* @author 迟凯峰
|
||||
* @version V1.2.0
|
||||
* @date 2023.11.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_TICK_H
|
||||
#define __SV_TICK_H
|
||||
|
||||
s_ecode_t st_suspend_task (s_tasknode_tsp node);
|
||||
s_ecode_t st_resume_task (s_tasknode_tsp node);
|
||||
s_ecode_t st_delete_task (s_tasknode_tsp node);
|
||||
s_ecode_t st_set_taskpri (s_tasknode_tsp node, s_u8_t pri);
|
||||
s_ecode_t st_set_block (s_tasknode_tsp node, s_delay_t tick);
|
||||
s_ecode_t st_clear_block (s_tasknode_tsp node);
|
||||
s_bool_t st_take_binary (s_bool_t _OBJ_MEM_ *bin);
|
||||
s_bool_t st_take_semaphore (s_sem_tsp sem);
|
||||
void st_give_semaphore (s_sem_tsp sem);
|
||||
m_fetion_t st_recv_fetion (m_fetion_t _OBJ_MEM_ *ft);
|
||||
void st_send_mail (void _OBJ_MEM_ *gm, void *lm, size_t size, s_bool_t _OBJ_MEM_ *gf);
|
||||
void *st_recv_msg (s_msgqueue_tsp queue);
|
||||
s_ecode_t st_send_msg (s_msgqueue_tsp queue, void *msg);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 任务
|
||||
*/
|
||||
|
||||
/* 挂起指定任务 */
|
||||
#define sTSV_SuspendTask(node) \
|
||||
st_suspend_task(node)
|
||||
|
||||
/* 恢复指定任务 */
|
||||
#define sTSV_ResumeTask(node) \
|
||||
st_resume_task(node)
|
||||
|
||||
/* 删除指定任务 */
|
||||
#define sTSV_DeleteTask(node) \
|
||||
st_delete_task(node)
|
||||
|
||||
/* 设置任务优先级 */
|
||||
#define sTSV_SetTaskPri(node, tpl) \
|
||||
st_set_taskpri(node, tpl)
|
||||
|
||||
/* 设置阻塞(时间)*/
|
||||
#define sTSV_SetBlock(node, tc) \
|
||||
st_set_block(node, tc)
|
||||
|
||||
/* 清除阻塞(状态)*/
|
||||
#define sTSV_ClearBlock(node) \
|
||||
st_clear_block(node)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 定时
|
||||
*/
|
||||
|
||||
/* 定时中断 */
|
||||
#define sTSV_TimInt(tmid, tc) \
|
||||
s_timint_loader[tmid] = s_timint_reload[tmid] = tc
|
||||
|
||||
/* 定时查询 */
|
||||
#define sTSV_TimQry(tmid, tc) \
|
||||
s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/* 获取 */
|
||||
#define sTSV_TakeBin(bin) \
|
||||
st_take_binary((s_bool_t *)&bin)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
|
||||
/* 获取 */
|
||||
#define sTSV_TakeSem(sem) \
|
||||
st_take_semaphore(&sem)
|
||||
|
||||
/* 给予/归还 */
|
||||
#define sTSV_GiveSem(sem) \
|
||||
st_give_semaphore(&sem)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
|
||||
/* 接收飞信 */
|
||||
#define sTSV_RecvFetion(tbox) \
|
||||
( \
|
||||
tbox ? st_recv_fetion((m_fetion_t *)&tbox) : false \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 私信
|
||||
*/
|
||||
|
||||
/* 发送私信 */
|
||||
#define sTSV_SendTaskMsg(task) \
|
||||
s_sign_send_taskmsg = true; \
|
||||
MCUCFG_TASKMSG_PSP; \
|
||||
task(MCUCFG_TASKMSG_VAL,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息邮箱
|
||||
*/
|
||||
|
||||
/* 接收邮件 */
|
||||
#define sTSV_RecvMail(mail, mbox) \
|
||||
( \
|
||||
mbox##_gnmf \
|
||||
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
|
||||
? mbox##_gnmf-- \
|
||||
: mbox##_gnmf-- \
|
||||
: false \
|
||||
)
|
||||
|
||||
/* 发送邮件 */
|
||||
#define sTSV_SendMail(mbox, mail) \
|
||||
st_send_mail(&mbox, mail, sizeof(mbox), (s_bool_t *)&mbox##_gnmf)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
|
||||
/* 接收消息 */
|
||||
#define sTSV_RecvMsg(que) \
|
||||
st_recv_msg(que)
|
||||
|
||||
/* 发送消息 */
|
||||
#define sTSV_SendMsg(que, msg) \
|
||||
st_send_msg(que, msg)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 事件标志组
|
||||
*/
|
||||
|
||||
/* 查询标志组 */
|
||||
#define sTSV_QueryFlagGroup(group) \
|
||||
( \
|
||||
sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \
|
||||
: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
|
||||
: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
|
||||
: false \
|
||||
)
|
||||
|
||||
/* 清除标志组 */
|
||||
#define sTSV_ClearFlagGroup(group) \
|
||||
do{ \
|
||||
sizeof(group) == 1 ? *(s_u8_t *)&group = false : OS_NOPx1; \
|
||||
sizeof(group) == 2 ? *(s_u16_t *)&group = false : OS_NOPx1; \
|
||||
sizeof(group) == 4 ? *(s_u32_t *)&group = false : OS_NOPx1; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 软件RTC
|
||||
*/
|
||||
|
||||
/* 获取时间 */
|
||||
#define sTSV_GetTime(t) \
|
||||
s_memcpy(t, s_rtc[0], sizeof(s_rtc[0]))
|
||||
|
||||
/* 设置时间 */
|
||||
#define sTSV_SetTime(t) \
|
||||
do{ \
|
||||
s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \
|
||||
tUpdateCopy_GVar(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
676
System/ur_api.h
Normal file
676
System/ur_api.h
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user