mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-09-21 21:03:39 +08:00
@@ -0,0 +1,82 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_var.c
|
||||
* @brief 系统全局变量定义
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_redef.h"
|
||||
|
||||
/* The Soft-RTC */
|
||||
#if SYSCFG_SOFTRTC == __ENABLED__
|
||||
const s_u8_t _CONST_MEM_ s_month0day[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /*!< 每月各有几天?*/
|
||||
s_u8_t _RTC_MEM_ s_month2day = 28; /*!< 二月有几天?*/
|
||||
volatile s_every_ts _SYS_MEM_ s_sign_every = {0}; /*!< 每信号 */
|
||||
s_rtc_ts _RTC_MEM_ s_rtc = {SYSCFG_MANUFACTUREDATE}; /*!< RTC正本 */
|
||||
#if SYSCFG_GETRTC_INT == __ENABLED__
|
||||
s_rtc_ts _RTC_MEM_ s_rtc_copy = {SYSCFG_MANUFACTUREDATE}; /*!< RTC副本 */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_rtc = false; /*!< 更新RTC副本信号 */
|
||||
#endif
|
||||
#endif
|
||||
/* The Task */
|
||||
m_bit_t /*_SYS_MEM_*/ s_sign_return = true; /*!< 返回信号 */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule = false; /*!< 调度信号 */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule_all = false; /*!< 完整调度信号 */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule_forbid = false; /*!< 禁止调度信号 */
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_switch_prigroup = false; /*!< 优先级组切换信号 */
|
||||
s_u8_t _SYS_MEM_ s_schedulelock_counter = 0; /*!< 调度锁嵌套计数器 */
|
||||
s_u8_t _SYS_MEM_ s_kernellock_counter = 0; /*!< 内核锁嵌套计数器 */
|
||||
s_ecode_t _SYS_MEM_ s_startup_code = OS_ECODE_NOERROR; /*!< 启动任务时,用来异地缓存错误码 */
|
||||
s_u8_t _SYS_MEM_ s_task_status0 = OS_STATUS_DELETED; /*!< 被启动任务 -> 初始状态 */
|
||||
s_taskhand_tsp _SYS_MEM_ s_task_starter = OS_NULL; /*!< 被启动任务 -> 装载块句柄 */
|
||||
s_tasknode_tsp _SYS_MEM_ s_task_current = OS_NULL; /*!< 当前任务句柄 */
|
||||
s_tasknode_tsp _SYS_MEM_ s_task_switch = OS_NULL; /*!< 立即切换至某任务 -> 任务句柄 */
|
||||
s_tasknode_tsp _SYS_MEM_ s_taskpri_tail = OS_NULL; /*!< 设置任务优先级时 -> 临时链表的尾节点 */
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
s_bool_t s_sign_timeout[OS_TASKTOTAL + 1]; /*!< 超时信号,安全运行时专用 */
|
||||
#endif
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
#if SYSCFG_TIMESHARINGMODE == 2
|
||||
const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY] = {SYSCFG_CUSTOMTIMESHARING}; /*!< 自定义时间片 -> 时间片数组 */
|
||||
#endif
|
||||
#endif
|
||||
/* The Timing Interrupt */
|
||||
#if OS_TIMINTTOTAL
|
||||
s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL]; /*!< 定时中断句柄 */
|
||||
#endif
|
||||
/* The Timing Query */
|
||||
#if 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 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__
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_taskmgr = SYSCFG_TASKMGRAUTOSTART;
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_send = false;
|
||||
volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_recv = false;
|
||||
volatile s_u8_t _SYS_MEM_ s_debug_sendtype = 0;
|
||||
char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE];/*
|
||||
char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE];*/
|
||||
char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE];
|
||||
char _XDATA_MEM_ * _SYS_MEM_ s_debug_recvptr = s_debug_recvbuff;
|
||||
char _XDATA_MEM_ * _SYS_MEM_ s_debug_sendptr;
|
||||
s_alarm_ts _DEBUG_MEM_ s_alarm = {0};
|
||||
s_fault_ts _DEBUG_MEM_ s_fault = {0};
|
||||
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
|
||||
s_u32_t _DEBUG_MEM_ s_tick_counter1 = 0;
|
||||
s_u32_t _DEBUG_MEM_ s_tick_counter2 = 0;
|
||||
#endif
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
m_pc_t _SYS_MEM_ s_pc = 0;
|
||||
#endif
|
||||
#if SYSCFG_RUNTIME_COUNT == __ENABLED__
|
||||
s_runtime_ts _DEBUG_MEM_ s_runtime = {0};
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,88 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_var.h
|
||||
* @brief 系统全局变量声明
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OS_VAR_H
|
||||
#define __OS_VAR_H
|
||||
#include "os_redef.h"
|
||||
|
||||
/* The Soft-RTC */
|
||||
#if SYSCFG_SOFTRTC == __ENABLED__
|
||||
extern const s_u8_t _CONST_MEM_ s_month0day[13];
|
||||
extern s_u8_t _RTC_MEM_ s_month2day;
|
||||
extern volatile s_every_ts _SYS_MEM_ s_sign_every;
|
||||
extern s_rtc_ts _RTC_MEM_ s_rtc;
|
||||
#if SYSCFG_GETRTC_INT == __ENABLED__
|
||||
extern s_rtc_ts _RTC_MEM_ s_rtc_copy;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_rtc;
|
||||
#endif
|
||||
#endif
|
||||
/* The Task */
|
||||
extern m_bit_t /*_SYS_MEM_*/ s_sign_return;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule_all;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_schedule_forbid;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_switch_prigroup;
|
||||
extern s_u8_t _SYS_MEM_ s_schedulelock_counter;
|
||||
extern s_u8_t _SYS_MEM_ s_kernellock_counter;
|
||||
extern s_ecode_t _SYS_MEM_ s_startup_code;
|
||||
extern s_u8_t _SYS_MEM_ s_task_status0;
|
||||
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_task_switch;
|
||||
extern s_tasknode_tsp _SYS_MEM_ s_taskpri_tail;
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
extern s_bool_t s_sign_timeout[OS_TASKTOTAL + 1];
|
||||
#endif
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
#if SYSCFG_TIMESHARINGMODE == 2
|
||||
extern const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY];
|
||||
#endif
|
||||
#endif
|
||||
/* The Timing Interrupt */
|
||||
#if OS_TIMINTTOTAL
|
||||
extern s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL];
|
||||
#endif
|
||||
/* The Timing Query */
|
||||
#if 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 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 volatile m_bit_t /*_SYS_MEM_*/ s_sign_taskmgr;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_send;
|
||||
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_debug_recv;
|
||||
extern volatile s_u8_t _SYS_MEM_ s_debug_sendtype;
|
||||
extern char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE];/*
|
||||
extern char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE];*/
|
||||
extern char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE];
|
||||
extern char _XDATA_MEM_ * _SYS_MEM_ s_debug_recvptr;
|
||||
extern char _XDATA_MEM_ * _SYS_MEM_ s_debug_sendptr;
|
||||
extern s_alarm_ts _DEBUG_MEM_ s_alarm;
|
||||
extern s_fault_ts _DEBUG_MEM_ s_fault;
|
||||
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
|
||||
extern s_u32_t _DEBUG_MEM_ s_tick_counter1;
|
||||
extern s_u32_t _DEBUG_MEM_ s_tick_counter2;
|
||||
#endif
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
extern m_pc_t _SYS_MEM_ s_pc;
|
||||
#endif
|
||||
#if SYSCFG_RUNTIME_COUNT == __ENABLED__
|
||||
extern s_runtime_ts _DEBUG_MEM_ s_runtime;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_FIFOHandler[OS_SVID_END])(void _STATIC_MEM_ *sv);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,298 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_create.h
|
||||
* @brief 创建服务
|
||||
* @details 用于创建 CosyOS 内核对象。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_CREATE_H
|
||||
#define __SV_CREATE_H
|
||||
|
||||
/**
|
||||
@addtogroup CosyOS_内核服务
|
||||
@{
|
||||
*//**
|
||||
\defgroup 创建服务
|
||||
\brief 用于创建 CosyOS 内核对象。
|
||||
@{
|
||||
*/
|
||||
|
||||
/*
|
||||
* 声明任务
|
||||
*/
|
||||
|
||||
/** 声明静态任务:无私信 */
|
||||
#define sCSV_ExternTask(name) \
|
||||
extern s_tasknode_tsp u_taskhandle_##name; \
|
||||
extern s_tasknode_ts u_taskhand_##name; \
|
||||
void name(void)
|
||||
|
||||
/** 声明动态任务:无私信 */
|
||||
#define dCSV_ExternTask(name) \
|
||||
extern s_tasknode_tsp u_taskhandle_##name; \
|
||||
extern s_taskhand_ts u_taskhand_##name; \
|
||||
void name(void)
|
||||
|
||||
/** 声明静态任务:有私信 */
|
||||
#define sCSV_ExternTask_Msg(name) \
|
||||
extern s_tasknode_tsp u_taskhandle_##name; \
|
||||
extern s_tasknode_ts u_taskhand_##name; \
|
||||
void name(MCUCFG_TASKMSG_VAR,
|
||||
|
||||
/** 声明动态任务:有私信 */
|
||||
#define dCSV_ExternTask_Msg(name) \
|
||||
extern s_tasknode_tsp u_taskhandle_##name; \
|
||||
extern s_taskhand_ts u_taskhand_##name; \
|
||||
void name(MCUCFG_TASKMSG_VAR,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 创建任务
|
||||
*/
|
||||
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
/** 静态创建任务:启用 DEBUGGING,启用 安全运行时 */
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_ts u_taskhand_##name; \
|
||||
s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \
|
||||
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
|
||||
s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name, srt, u_taskstack_##name, 0}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#else /** 静态创建任务:启用 DEBUGGING,禁用 安全运行时 */
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_ts u_taskhand_##name; \
|
||||
s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \
|
||||
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
|
||||
s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name, /**/ u_taskstack_##name, 0}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#endif
|
||||
#else
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
/** 静态创建任务:禁用 DEBUGGING,启用 安全运行时 */
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_ts u_taskhand_##name; \
|
||||
s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \
|
||||
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
|
||||
s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, /****/ srt, u_taskstack_##name, 0}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#else /** 静态创建任务:禁用 DEBUGGING,禁用 安全运行时 */
|
||||
#define sCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_ts u_taskhand_##name; \
|
||||
s_tasknode_tsp u_taskhandle_##name = &u_taskhand_##name; \
|
||||
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
|
||||
s_tasknode_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, /****/ /**/ u_taskstack_##name, 0}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
/** 动态创建任务:启用 DEBUGGING,启用 安全运行时 */
|
||||
#define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_tsp u_taskhandle_##name = OS_NULL; \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name, srt}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#else /** 动态创建任务:启用 DEBUGGING,禁用 安全运行时 */
|
||||
#define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_tsp u_taskhandle_##name = OS_NULL; \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, #name}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#endif
|
||||
#else
|
||||
#if SYSCFG_SAFERUNTIME == __ENABLED__
|
||||
/** 动态创建任务:禁用 DEBUGGING,启用 安全运行时 */
|
||||
#define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_tsp u_taskhandle_##name = OS_NULL; \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent, srt}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#else /** 动态创建任务:禁用 DEBUGGING,禁用 安全运行时 */
|
||||
#define dCSV_CreateTask(name, pri, tss, srt, ntm, ent) \
|
||||
s_tasknode_tsp u_taskhandle_##name = OS_NULL; \
|
||||
s_taskhand_ts u_taskhand_##name = {0, 0, pri, tss, &u_taskhandle_##name, ent}; \
|
||||
void name \
|
||||
sCreateTaskMsg_##ntm
|
||||
#endif
|
||||
#endif
|
||||
/** 静态创建定时中断任务 */
|
||||
#define sCSV_CreateTask_TimInt(tmid, arl, name, pri, tss, srt, ntm) \
|
||||
void name(void); \
|
||||
s_tasknode_ts u_taskhand_##name; \
|
||||
s_timinthand_ts _STATIC_MEM_ u_timinthand_##tmid = {0, 0, arl, 1, &u_taskhand_##name}; \
|
||||
sCSV_CreateTask(name, pri, tss, srt, ntm, name)
|
||||
|
||||
/** 动态创建定时中断任务 */
|
||||
#define dCSV_CreateTask_TimInt(tmid, arl, name, pri, tss, srt, ntm) \
|
||||
void name(void); \
|
||||
s_taskhand_ts u_taskhand_##name; \
|
||||
s_timinthand_ts _STATIC_MEM_ u_timinthand_##tmid = {0, 0, arl, 1, &u_taskhand_##name}; \
|
||||
dCSV_CreateTask(name, pri, tss, srt, ntm, name)
|
||||
|
||||
/** 静态创建定时查询任务 */
|
||||
#define sCSV_CreateTask_TimQry(tmid, event, arl, name, pri, tss, srt, ntm) \
|
||||
void name(void); \
|
||||
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING {return (event ? true : false);} \
|
||||
s_tasknode_ts u_taskhand_##name; \
|
||||
s_timqryhand_ts _STATIC_MEM_ u_timqryhand_##tmid = {(s_timqry_t)(SYSCFG_USERTIMQRYINIT - 1), (s_timqry_t)(SYSCFG_USERTIMQRYINIT - 1), arl, 1, &u_taskhand_##name, u_timqryevent_##tmid}; \
|
||||
sCSV_CreateTask(name, pri, tss, srt, ntm, name)
|
||||
|
||||
/** 动态创建定时查询任务 */
|
||||
#define dCSV_CreateTask_TimQry(tmid, event, arl, name, pri, tss, srt, ntm) \
|
||||
void name(void); \
|
||||
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING {return (event ? true : false);} \
|
||||
s_taskhand_ts u_taskhand_##name; \
|
||||
s_timqryhand_ts _STATIC_MEM_ u_timqryhand_##tmid = {(s_timqry_t)(SYSCFG_USERTIMQRYINIT - 1), (s_timqry_t)(SYSCFG_USERTIMQRYINIT - 1), arl, 1, &u_taskhand_##name, u_timqryevent_##tmid}; \
|
||||
dCSV_CreateTask(name, pri, tss, srt, ntm, name)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 创建钩子
|
||||
*/
|
||||
|
||||
/** 创建定时中断钩子 */
|
||||
#define sCSV_CreateHook_TimInt(tmid, arl, name) \
|
||||
void name(void); \
|
||||
s_timinthand_ts _STATIC_MEM_ u_timinthand_##tmid = {0, 0, arl, 0, name}; \
|
||||
void name(void) MCUCFG_C51USING
|
||||
|
||||
/** 创建定时查询钩子 */
|
||||
#define sCSV_CreateHook_TimQry(tmid, event, arl, name) \
|
||||
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING {return (event ? true : false);} \
|
||||
void name(void); \
|
||||
s_timqryhand_ts _STATIC_MEM_ u_timqryhand_##tmid = {(s_timqry_t)(SYSCFG_USERTIMQRYINIT - 1), (s_timqry_t)(SYSCFG_USERTIMQRYINIT - 1), arl, 0, name, u_timqryevent_##tmid}; \
|
||||
void name(void) MCUCFG_C51USING
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 互斥信号量
|
||||
*/
|
||||
|
||||
/** 声明互斥信号量 */
|
||||
#define sCSV_ExternMut(name) \
|
||||
extern s_mutex_ts name
|
||||
|
||||
/** 创建互斥信号量 */
|
||||
#define sCSV_CreateMut(name) \
|
||||
s_mutex_ts name = {false, OS_NULL, 0}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/** 声明二值信号量 */
|
||||
#define sCSV_ExternBin(name) \
|
||||
extern s_binary_ts name
|
||||
|
||||
/** 创建二值信号量 */
|
||||
#define sCSV_CreateBin(name, init) \
|
||||
s_binary_ts name = {init, OS_NULL}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
|
||||
/** 声明计数信号量 */
|
||||
#define sCSV_ExternSem(name) \
|
||||
extern s_semaph_ts name
|
||||
|
||||
/** 创建计数信号量 */
|
||||
#define sCSV_CreateSem(name, init, max) \
|
||||
s_semaph_ts name = {init, max, OS_NULL}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
|
||||
/** 声明信箱 */
|
||||
#define sCSV_ExternTionbox(name) \
|
||||
extern s_tionbox_ts name
|
||||
|
||||
/** 创建信箱 */
|
||||
#define sCSV_CreateTionbox(name) \
|
||||
s_tionbox_ts name = {false, OS_NULL}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 邮箱
|
||||
*/
|
||||
|
||||
/** 声明邮箱 */
|
||||
#define sCSV_ExternMailbox(name) \
|
||||
extern s_mailbox_ts name
|
||||
|
||||
/** 创建邮箱 */
|
||||
#define sCSV_CreateMailbox(name) \
|
||||
s_mailbox_ts name = {false, OS_NULL, OS_NULL}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
|
||||
/** 声明静态队列 */
|
||||
#define sCSV_ExternQueue_Static(name) \
|
||||
extern ss_queue_ts name
|
||||
|
||||
/** 声明动态队列 */
|
||||
#define sCSV_ExternQueue_Dynamic(name) \
|
||||
extern sd_queue_ts name
|
||||
|
||||
/** 创建静态队列 */
|
||||
#define sCSV_CreateQueue_Static(name, mode, len) \
|
||||
void *u_queue_##name[len]; \
|
||||
ss_queue_ts name = {0, __STATIC__, mode, len, OS_NULL, true, u_queue_##name, u_queue_##name + len - 1, u_queue_##name}
|
||||
|
||||
/** 创建动态队列 */
|
||||
#define sCSV_CreateQueue_Dynamic(name, mode, len) \
|
||||
sd_queue_ts name = {0, __DYNAMIC__, mode, len, OS_NULL, true, OS_NULL, OS_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 \
|
||||
static s_thrmem_ts u_thrmem = {OS_NULL, OS_NULL, 0}
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,149 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_loc.c
|
||||
* @brief 中断本地服务
|
||||
* @details 仅在用户中断中调用,并在本地执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_var.h"
|
||||
#include "os_api.h"
|
||||
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
#pragma NOAREGS /* 相对寄存器访问 for C51 */
|
||||
#endif
|
||||
|
||||
/**
|
||||
@addtogroup CosyOS_内核服务
|
||||
@{
|
||||
*//**
|
||||
\defgroup 中断本地服务
|
||||
\brief 仅在用户中断中调用,并在本地执行。
|
||||
@{
|
||||
*/
|
||||
|
||||
#if SYSCFG_BINARY == __ENABLED__
|
||||
/**
|
||||
\brief 获取二值信号量
|
||||
\param[in] hbin 二值信号量句柄
|
||||
\return 结果 [true:成功,false:失败]
|
||||
*/
|
||||
s_bool_t si_take_binary(s_binary_tsp hbin)
|
||||
{
|
||||
if(hbin->binary){
|
||||
hbin->binary = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_FETION == __ENABLED__
|
||||
/**
|
||||
\brief 接收飞信
|
||||
\param[in] htbox 信箱句柄
|
||||
\return 飞信数据 [false:失败]
|
||||
*/
|
||||
m_fetion_t si_recv_fetion(s_tionbox_tsp htbox)
|
||||
{
|
||||
m_fetion_t fetion = htbox->fetion;
|
||||
htbox->fetion = false;
|
||||
return fetion;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
/**
|
||||
\brief 接收邮件
|
||||
\param[in] hmbox 邮箱句柄
|
||||
\return 邮件指针 [NULL:失败]
|
||||
*/
|
||||
void *si_recv_mail(s_mailbox_tsp hmbox)
|
||||
{
|
||||
if(hmbox->flag){
|
||||
hmbox->flag = false;
|
||||
return hmbox->mail;
|
||||
}
|
||||
return OS_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_MSGQUEUE == __ENABLED__
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
/**
|
||||
\brief 获取队列互斥量
|
||||
\details 获取队列访问权限 for C51 接收消息。
|
||||
\param[in] hque 队列句柄
|
||||
\return 结果 [true:成功,false:失败]
|
||||
*/
|
||||
s_bool_t si_take_quemut(s_queue_tsp hque)
|
||||
{
|
||||
if(!hque->mutex) return false;
|
||||
hque->mutex = false;
|
||||
|
||||
if(hque->type == __DYNAMIC__){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.error_recvmsg_int = true;
|
||||
#endif
|
||||
}
|
||||
else if(!hque->counter);
|
||||
else return true;
|
||||
|
||||
hque->mutex = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 归还并返回
|
||||
\details 归还队列互斥量并返回消息指针 for C51 接收消息。
|
||||
\param[out] mut 队列互斥量指针
|
||||
\param[in] msg 消息指针
|
||||
\return 消息指针 [NULL:失败]
|
||||
*/
|
||||
static void *_back_ret_(s_bool_t _STATIC_MEM_ *mut, void *msg)
|
||||
{
|
||||
*mut = true;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief C51 接收消息
|
||||
\param[in] hque 队列句柄
|
||||
\return 消息指针 [NULL:失败]
|
||||
*/
|
||||
void *si_recv_msg_c51(s_queue_tsp hque)
|
||||
{
|
||||
void *msg;
|
||||
sRecvMsg_Static(msg);
|
||||
return _back_ret_((s_bool_t *)&hque->mutex, msg);
|
||||
}
|
||||
#else
|
||||
/**
|
||||
\brief 非51 接收消息
|
||||
\param[in] hque 队列句柄
|
||||
\return 消息指针 [NULL:失败]
|
||||
*/
|
||||
void *si_recv_msg_n51(s_queue_tsp hque)
|
||||
{
|
||||
void *msg = OS_NULL;
|
||||
if(!hque->mutex) return OS_NULL;
|
||||
hque->mutex = false;
|
||||
|
||||
if(hque->type == __DYNAMIC__){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.error_recvmsg_int = true;
|
||||
#endif
|
||||
}
|
||||
else if(!hque->counter);
|
||||
else sRecvMsg_Static(msg);
|
||||
|
||||
hque->mutex = true;
|
||||
return msg;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
||||
@@ -0,0 +1,48 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_loc.h
|
||||
* @brief 中断本地服务
|
||||
* @details 仅在用户中断中调用,并在本地执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_INT_LOC_H
|
||||
#define __SV_INT_LOC_H
|
||||
|
||||
s_bool_t si_take_binary (s_binary_tsp hbin);
|
||||
m_fetion_t si_recv_fetion (s_tionbox_tsp htbox);
|
||||
void *si_recv_mail (s_mailbox_tsp hmbox);
|
||||
s_bool_t si_take_quemut (s_queue_tsp hque);
|
||||
void *si_recv_msg_c51 (s_queue_tsp hque);
|
||||
void *si_recv_msg_n51 (s_queue_tsp hque);
|
||||
|
||||
/**
|
||||
@addtogroup 中断本地服务
|
||||
@{
|
||||
*/
|
||||
|
||||
#define sISV_TakeBin(bin) si_take_binary(&bin) /*!< 获取二值信号量 */
|
||||
#define sISV_RecvFetion(tbox) si_recv_fetion(&tbox) /*!< 接收飞信 */
|
||||
#define sISV_RecvMail(mbox) si_recv_mail(&mbox) /*!< 接收邮件 */
|
||||
#define sISV_GetTime(t) s_memcpy(t, iWhichGVar_Read ? &s_rtc : &s_rtc_copy, sizeof(s_rtc_ts)) /*!< 获取时间 */
|
||||
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
#define sISV_RecvMsg(que) (si_take_quemut((s_queue_tsp)&que) ? si_recv_msg_c51((s_queue_tsp)&que) : OS_NULL) /*!< C51 接收消息 */
|
||||
#else
|
||||
#define sISV_RecvMsg(que) si_recv_msg_n51((s_queue_tsp)&que) /*!< 非51 接收消息 */
|
||||
#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 \
|
||||
)
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,478 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_pend_fifo.c
|
||||
* @brief 中断挂起服务_FIFO - 执行函数
|
||||
* @details 仅在 PendSV 中由系统调用并执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
#if MCUCFG_PENDSVFIFO_DEPTH > 0
|
||||
|
||||
/**
|
||||
@addtogroup CosyOS_内核服务
|
||||
@{
|
||||
*//**
|
||||
\defgroup 中断挂起服务_FIFO
|
||||
\brief 在中断中调用的服务,不在本地执行,而是把服务的内容写入局部的结构体中,
|
||||
再把结构体指针入 PendSV_FIFO,再触发 PendSV,而后在 PendSV 中执行。
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
\page 手动裁剪说明:
|
||||
|
||||
\li 本页中的各个执行函数,任何编译器都无法自动移除未使用,原因是<br>
|
||||
它们是通过函数指针间接调用的。
|
||||
|
||||
\li 如果您希望做到极致的裁剪,可逐一查看这些函数,确定不使用的,<br>
|
||||
可通过 手动开关 进行手动移除。
|
||||
*/
|
||||
|
||||
/**
|
||||
\brief 清除就绪延时
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iClearDelay。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _clear_delay_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
if(sv == OS_NULL) return; /* 该句无实际用途,只为屏蔽可能的编译器警告 */
|
||||
if(s_sign_schedule_forbid){
|
||||
s_task_current->timer = 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _clear_delay_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 切换任务
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSwitchTask(task)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _switch_task_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_STOPPED){
|
||||
s_switch_taskpri(htask);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _switch_task_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 恢复任务
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iResumeTask(task)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _resume_task_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status & OS_STATUS_SUSPENDED){
|
||||
htask->status &= (~OS_STATUS_SUSPENDED & 0xFF);
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
s_switch_ready(htask);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _resume_task_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 挂起任务
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSuspendTask(task)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _suspend_task_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_SUSPENDED){
|
||||
htask->status |= OS_STATUS_SUSPENDED;
|
||||
if(htask == s_task_current){
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _suspend_task_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 删除任务
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iDeleteTask(task)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _delete_task_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_DELETED){
|
||||
htask->status = OS_STATUS_DELETED;
|
||||
if(htask == s_task_current){
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _delete_task_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 设置任务优先级
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSetTaskPri(task, pri)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _set_taskpri_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_taskpri_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_STOPPED){
|
||||
s_u8_t pri = ((sp_taskpri_tsp)sv)->pri;
|
||||
if(htask->pri != pri){
|
||||
htask->pri = pri;
|
||||
s_set_taskpri(htask);
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _set_taskpri_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 设置阻塞(时间)
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSetBlock_tc(task, tc)、iSetBlock_ms(task, ms)、
|
||||
iSetBlock_s(task, s)、iSetBlock_m(task, m)、iSetBlock_h(task, h)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _set_block_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_blocktime_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status == OS_STATUS_BLOCKED){
|
||||
if(!((sp_blocktime_tsp)sv)->tick){
|
||||
htask->status = OS_STATUS_READY;
|
||||
htask->timer = 0;
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
s_switch_taskpri(htask);
|
||||
}
|
||||
else{
|
||||
htask->timer = ((sp_blocktime_tsp)sv)->tick;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _set_block_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 清除阻塞(状态)
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iClearBlock(task)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _clear_block_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status == OS_STATUS_BLOCKED){
|
||||
htask->status = OS_STATUS_READY;
|
||||
htask->timer = 0;
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
s_switch_taskpri(htask);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _clear_block_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 定时中断
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iTimInt_tc(tmid, tc)、iTimInt_ms(tmid, ms)、iTimInt_s(tmid, s)、
|
||||
iTimInt_m(tmid, m)、iTimInt_h(tmid, h)、iTimInt_Cancel(tmid)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& OS_TIMINTTOTAL
|
||||
static void _timint_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_timint_handle[((sp_timint_tsp)sv)->tmid]->timer
|
||||
= s_timint_handle[((sp_timint_tsp)sv)->tmid]->reload
|
||||
= ((sp_timint_tsp)sv)->tick;
|
||||
}
|
||||
#else
|
||||
#define _timint_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 定时查询
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iTimQry_tc(tmid, tc)、iTimQry_ms(tmid, ms)、iTimQry_s(tmid, s)、
|
||||
iTimQry_m(tmid, m)、iTimQry_h(tmid, h)、iTimQry_Cancel(tmid)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& OS_TIMQRYTOTAL
|
||||
static void _timqry_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_timqry_handle[((sp_timqry_tsp)sv)->tmid]->timer
|
||||
= s_timqry_handle[((sp_timqry_tsp)sv)->tmid]->reload
|
||||
= ((sp_timqry_tsp)sv)->tick;
|
||||
}
|
||||
#else
|
||||
#define _timqry_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 上锁or给予二值信号量
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iLockBin(bin)、iGiveBin(bin)、iBackBin(bin)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& SYSCFG_BINARY == __ENABLED__
|
||||
static void _binary_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_binary_tsp hbin = ((sp_binary_tsp)sv)->hbin;
|
||||
hbin->binary = ((sp_binary_tsp)sv)->value;
|
||||
if(!hbin->binary) return;
|
||||
s_switch_notnull(hbin->htask);
|
||||
}
|
||||
#else
|
||||
#define _binary_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 给予计数信号量
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iGiveSem(sem)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& SYSCFG_SEMAPHORE == __ENABLED__
|
||||
static void _give_sem_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_semaph_tsp hsem = ((sp_semaph_tsp)sv)->hsem;
|
||||
if(hsem->counter < hsem->maximum){
|
||||
hsem->counter++;
|
||||
}
|
||||
s_switch_notnull(hsem->htask);
|
||||
}
|
||||
#else
|
||||
#define _give_sem_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 发送飞信
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSendFetion(tbox, tion)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& SYSCFG_FETION == __ENABLED__
|
||||
static void _send_fetion_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_tionbox_tsp htbox = ((sp_tionbox_tsp)sv)->htbox;
|
||||
htbox->fetion = ((sp_tionbox_tsp)sv)->fetion;
|
||||
s_switch_notnull(htbox->htask);
|
||||
}
|
||||
#else
|
||||
#define _send_fetion_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 发送邮件
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSendMail(mbox, mail)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& SYSCFG_MAILBOX == __ENABLED__
|
||||
static void _send_mail_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_mailbox_tsp hmbox = ((sp_mailbox_tsp)sv)->hmbox;
|
||||
hmbox->flag = false;
|
||||
hmbox->mail = ((sp_mailbox_tsp)sv)->mail;
|
||||
hmbox->flag = true;
|
||||
s_switch_notnull(hmbox->htask);
|
||||
}
|
||||
#else
|
||||
#define _send_mail_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 发送消息
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSendMsg(que, msg)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& SYSCFG_MSGQUEUE == __ENABLED__
|
||||
static void _send_msg_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
s_queue_tsp hque = ((sp_msg_tsp)sv)->hque;
|
||||
hque->mutex = false;
|
||||
|
||||
if(hque->counter == hque->len){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_alarm.overflow_msgqueue = true;
|
||||
#endif
|
||||
hque->mutex = true;
|
||||
return;
|
||||
}
|
||||
if(hque->type == __DYNAMIC__){
|
||||
s_msgnode_tsp hmsg = OS_NULL;
|
||||
hmsg = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts));
|
||||
if(hmsg == OS_NULL){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.mallocfailed_msgnode = true;
|
||||
#endif
|
||||
hque->mutex = true;
|
||||
return;
|
||||
}
|
||||
sSendMsg_Dynamic(((sp_msg_tsp)sv)->msg);
|
||||
}
|
||||
else
|
||||
sSendMsg_Static(((sp_msg_tsp)sv)->msg);
|
||||
|
||||
s_switch_notnull(hque->htask);
|
||||
hque->mutex = true;
|
||||
}
|
||||
#else
|
||||
#define _send_msg_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 写标志组
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iClearFlagGroup(group)、
|
||||
iSetFlagBit(group, bit)、iSetFlagBits(group, nbit) ...)、
|
||||
iClearFlagBit(group, bit)、iClearFlagBits(group, nbit) ...)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/ \
|
||||
&& SYSCFG_FLAGGROUP == __ENABLED__
|
||||
static void _group_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
switch(((sp_group_tsp)sv)->size){
|
||||
case +1: *(s_u8_t *)((sp_group_tsp)sv)->hgrp |= ((sp_group_tsp)sv)->value; break;
|
||||
case +2: *(s_u16_t *)((sp_group_tsp)sv)->hgrp |= ((sp_group_tsp)sv)->value; break;
|
||||
case +4: *(s_u32_t *)((sp_group_tsp)sv)->hgrp |= ((sp_group_tsp)sv)->value; break;
|
||||
case -1: *(s_u8_t *)((sp_group_tsp)sv)->hgrp &=~((sp_group_tsp)sv)->value; break;
|
||||
case -2: *(s_u16_t *)((sp_group_tsp)sv)->hgrp &=~((sp_group_tsp)sv)->value; break;
|
||||
case -4: *(s_u32_t *)((sp_group_tsp)sv)->hgrp &=~((sp_group_tsp)sv)->value; break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _group_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 全局变量写访问
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iWriteGVar(gv, lv)、iWriteGAry(gp, lp, size)、iWriteGStr(gs, ls)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _gvar_write_(void _STATIC_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);
|
||||
}
|
||||
#else
|
||||
#define _gvar_write_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 挂起服务调用
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iPendSVC(fp)。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _pendsvc_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
(*((sp_pendsvc_tsp)sv)->fp)();
|
||||
}
|
||||
#else
|
||||
#define _pendsvc_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 发送信号
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
\note 关联服务:iSendSign(sign);
|
||||
iSetTime(t) [系统配置中,当 中断中获取RTC 选项为启用,
|
||||
即 SYSCFG_GETRTC_INT == 1 时,调用该服务]。
|
||||
*/
|
||||
#if 1 /* 手动开关 *//* 如果用户不会调用关联服务,可手动移除该函数(1 改为 0)*/
|
||||
static void _send_sign_(void _STATIC_MEM_ *sv) MCUCFG_C51USING
|
||||
{
|
||||
*((sp_sign_tsp)sv)->sign = true;
|
||||
}
|
||||
#else
|
||||
#define _send_sign_ OS_NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief 中断挂起服务_FIFO - 执行总函数(函数指针数组)
|
||||
\param[in] [SVID] 服务ID
|
||||
\param[in] sv 服务的结构体指针
|
||||
\return 无
|
||||
*/
|
||||
void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_FIFOHandler[OS_SVID_END])(void _STATIC_MEM_ *sv) =
|
||||
{
|
||||
_clear_delay_,
|
||||
_switch_task_,
|
||||
_resume_task_,
|
||||
_suspend_task_,
|
||||
_delete_task_,
|
||||
_set_taskpri_,
|
||||
_set_block_,
|
||||
_clear_block_,
|
||||
_timint_,
|
||||
_timqry_,
|
||||
_binary_,
|
||||
_give_sem_,
|
||||
_send_fetion_,
|
||||
_send_mail_,
|
||||
_send_msg_,
|
||||
_group_,
|
||||
_gvar_write_,
|
||||
_pendsvc_,
|
||||
_send_sign_
|
||||
};
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
||||
#endif
|
||||
@@ -0,0 +1,192 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_pend_fifo.h
|
||||
* @brief 中断挂起服务_FIFO - 调用宏
|
||||
* @details 仅在用户中断中调用,而后挂起到 PendSV 中执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_INT_PEND_FIFO_H
|
||||
#define __SV_INT_PEND_FIFO_H
|
||||
|
||||
/**
|
||||
@addtogroup 中断挂起服务_FIFO
|
||||
@{
|
||||
*/
|
||||
|
||||
/** 清除就绪延时 */
|
||||
#define sPSV_ClearDelay \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_CLEARDELAY, OS_NULL}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 切换任务 */
|
||||
#define sPSV_SwitchTask(_htask) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_SWITCHTASK, OS_NULL}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 恢复任务 */
|
||||
#define sPSV_ResumeTask(_htask) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_RESUMETASK, OS_NULL}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 挂起任务 */
|
||||
#define sPSV_SuspendTask(_htask) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_SUSPENDTASK, OS_NULL}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 删除任务 */
|
||||
#define sPSV_DeleteTask(_htask) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_DELETETASK, OS_NULL}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 设置任务优先级 */
|
||||
#define sPSV_SetTaskPri(_htask, _pri) \
|
||||
do{ \
|
||||
static sp_taskpri_ts u_psv = {OS_SVID_SETTASKPRI, OS_NULL, _pri}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 设置阻塞(时间)*/
|
||||
#define sPSV_SetBlock(_htask, _tick) \
|
||||
do{ \
|
||||
static sp_blocktime_ts u_psv = {OS_SVID_SETBLOCK, OS_NULL, _tick}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 清除阻塞(状态)*/
|
||||
#define sPSV_ClearBlock(_htask) \
|
||||
do{ \
|
||||
static sp_task_ts u_psv = {OS_SVID_CLEARBLOCK, OS_NULL}; \
|
||||
u_psv.htask = _htask; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 定时中断 */
|
||||
#define sPSV_TimInt(_tmid, _tick) \
|
||||
do{ \
|
||||
static sp_timint_ts u_psv = {OS_SVID_TIMINT, _tmid, 0}; \
|
||||
u_psv.tick = _tick; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 定时查询 */
|
||||
#define sPSV_TimQry(_tmid, _tick) \
|
||||
do{ \
|
||||
static sp_timqry_ts u_psv = {OS_SVID_TIMQRY, _tmid, 0}; \
|
||||
u_psv.tick = _tick; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 上锁or给予二值信号量 */
|
||||
#define sPSV_WriteBin(_bin, _val) \
|
||||
do{ \
|
||||
static sp_binary_ts u_psv = {OS_SVID_BINARY, &_bin, _val}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 给予计数信号量 */
|
||||
#define sPSV_GiveSem(_sem) \
|
||||
do{ \
|
||||
static sp_semaph_ts u_psv = {OS_SVID_GIVESEM, &_sem}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 发送飞信 */
|
||||
#define sPSV_SendFetion(_tbox, _tion) \
|
||||
do{ \
|
||||
static sp_tionbox_ts u_psv = {OS_SVID_SENDFETION, &_tbox, 0}; \
|
||||
u_psv.fetion = _tion; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 发送邮件 */
|
||||
#define sPSV_SendMail(_mbox, _mail) \
|
||||
do{ \
|
||||
static sp_mailbox_ts u_psv = {OS_SVID_SENDMAIL, &_mbox, OS_NULL}; \
|
||||
u_psv.mail = _mail; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 发送消息 */
|
||||
#define sPSV_SendMsg(_que, _msg) \
|
||||
do{ \
|
||||
static sp_msg_ts u_psv = {OS_SVID_SENDMSG, (s_queue_tsp)&_que, OS_NULL}; \
|
||||
u_psv.msg = _msg; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 清除标志组 */
|
||||
#define sPSV_ClearFlagGroup(_group) \
|
||||
do{ \
|
||||
static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&_group, -sizeof(_group), ~0}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}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 : MCUCFG_TERNARYMASK \
|
||||
sizeof(lv) == 2 ? *(s_u16_t *)&lv = false : MCUCFG_TERNARYMASK \
|
||||
sizeof(lv) == 4 ? *(s_u32_t *)&lv = false : false; \
|
||||
siWriteFlagBits_##_nbit(
|
||||
|
||||
/** 全局变量写访问 */
|
||||
#define sPSV_WriteGVar(_gp, _lp, _size) \
|
||||
do{ \
|
||||
static sp_gvar_ts u_psv = {OS_SVID_GVARWRITE, _gp, _lp, _size}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 挂起服务调用 */
|
||||
#define sPSV_PendSVC(_fp) \
|
||||
do{ \
|
||||
static sp_pendsvc_ts u_psv = {OS_SVID_PENDSVC, _fp}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 发送信号 */
|
||||
#define sPSV_SendSign(_sign) \
|
||||
do{ \
|
||||
static sp_sign_ts u_psv = {OS_SVID_SENDSIGN, (s_bool_t *)&_sign}; \
|
||||
mPendSV_FIFOLoad; \
|
||||
}while(false)
|
||||
|
||||
/** 设置时间 */
|
||||
#if SYSCFG_GETRTC_INT == __ENABLED__
|
||||
#define sPSV_SetTime(_t) \
|
||||
do{ \
|
||||
iWriteGAry(&s_rtc, _t, sizeof(s_rtc_ts)); \
|
||||
s_sign_every.set = true; \
|
||||
iSendSign(s_sign_rtc); \
|
||||
}while(false)
|
||||
#else
|
||||
#define sPSV_SetTime(_t) \
|
||||
do{ \
|
||||
iWriteGAry(&s_rtc, _t, sizeof(s_rtc_ts)); \
|
||||
s_sign_every.set = true; \
|
||||
}while(false)
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,175 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_pend_flag.c
|
||||
* @brief 中断挂起服务_FLAG
|
||||
* @details 仅在 pendsv_hook 中调用并执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
#if SYSCFG_PENDSVHOOK == __ENABLED__
|
||||
|
||||
/**
|
||||
@addtogroup CosyOS_内核服务
|
||||
@{
|
||||
*//**
|
||||
\defgroup 中断挂起服务_FLAG
|
||||
\brief 当需要在中断中完成特定的服务功能时,可先设置一个标志位,再触发 PendSV;
|
||||
而后在 pendsv_hook 中查询该标志位,为真就清除标志位,而后调用服务。
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
\brief 清除就绪延时
|
||||
\param 无
|
||||
\return 无
|
||||
*/
|
||||
void sp_clear_delay(void) MCUCFG_C51USING
|
||||
{
|
||||
if(s_sign_schedule_forbid){
|
||||
s_task_current->timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 切换任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 无
|
||||
*/
|
||||
void sp_switch_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_STOPPED){
|
||||
s_switch_taskpri(htask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 恢复任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 无
|
||||
*/
|
||||
void sp_resume_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status & OS_STATUS_SUSPENDED){
|
||||
htask->status &= (~OS_STATUS_SUSPENDED & 0xFF);
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
s_switch_ready(htask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 挂起任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 无
|
||||
*/
|
||||
void sp_suspend_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_SUSPENDED){
|
||||
htask->status |= OS_STATUS_SUSPENDED;
|
||||
if(htask == s_task_current){
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 删除任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 无
|
||||
*/
|
||||
void sp_delete_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_DELETED){
|
||||
htask->status = OS_STATUS_DELETED;
|
||||
if(htask == s_task_current){
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 设置任务优先级
|
||||
\param[in] htask 任务句柄
|
||||
\param[in] pri 任务优先级
|
||||
\return 无
|
||||
*/
|
||||
void sp_set_taskpri(s_tasknode_tsp htask, s_u8_t pri) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status < OS_STATUS_STOPPED){
|
||||
if(htask->pri != pri){
|
||||
htask->pri = pri;
|
||||
s_set_taskpri(htask);
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 设置阻塞(时间)
|
||||
\param[in] htask 任务句柄
|
||||
\param[in] tick 阻塞时间 [单位:滴答周期,0:等效于清除阻塞,~0:无限阻塞]
|
||||
\return 无
|
||||
*/
|
||||
void sp_set_block(s_tasknode_tsp htask, s_delay_t tick) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status == OS_STATUS_BLOCKED){
|
||||
if(!tick){
|
||||
htask->status = OS_STATUS_READY;
|
||||
htask->timer = 0;
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
s_switch_taskpri(htask);
|
||||
}
|
||||
else{
|
||||
htask->timer = tick;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 清除阻塞(状态)
|
||||
\param[in] htask 任务句柄
|
||||
\return 无
|
||||
*/
|
||||
void sp_clear_block(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL) return;
|
||||
if(htask->status == OS_STATUS_BLOCKED){
|
||||
htask->status = OS_STATUS_READY;
|
||||
htask->timer = 0;
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
s_switch_taskpri(htask);
|
||||
}
|
||||
}
|
||||
|
||||
#if SYSCFG_BINARY == __ENABLED__
|
||||
/**
|
||||
\brief 上锁or给予二值信号量
|
||||
\param[in] hbin 二值信号量句柄
|
||||
\param[in] val 0:上锁,1:给予
|
||||
\return 无
|
||||
*/
|
||||
void sp_write_binary(s_binary_tsp hbin, s_bool_t val) MCUCFG_C51USING
|
||||
{
|
||||
hbin->binary = val;
|
||||
if(!val) return;
|
||||
s_switch_notnull(hbin->htask);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_int_pend_flag.h
|
||||
* @brief 中断挂起服务_FLAG
|
||||
* @details 仅在 pendsv_hook 中调用并执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_INT_PEND_FLAG_H
|
||||
#define __SV_INT_PEND_FLAG_H
|
||||
|
||||
void sp_clear_delay (void);
|
||||
void sp_switch_task (s_tasknode_tsp htask);
|
||||
void sp_resume_task (s_tasknode_tsp htask);
|
||||
void sp_suspend_task(s_tasknode_tsp htask);
|
||||
void sp_delete_task (s_tasknode_tsp htask);
|
||||
void sp_set_taskpri (s_tasknode_tsp htask, s_u8_t pri);
|
||||
void sp_set_block (s_tasknode_tsp htask, s_delay_t tick);
|
||||
void sp_clear_block (s_tasknode_tsp htask);
|
||||
void sp_write_binary(s_binary_tsp hbin, s_bool_t val);
|
||||
|
||||
/**
|
||||
@addtogroup 中断挂起服务_FLAG
|
||||
@{
|
||||
*/
|
||||
|
||||
#define sPS2_ClearDelay sp_clear_delay() /*!< 清除就绪延时 */
|
||||
#define sPS2_SwitchTask(htask) sp_switch_task(htask) /*!< 切换任务 */
|
||||
#define sPS2_ResumeTask(htask) sp_resume_task(htask) /*!< 恢复任务 */
|
||||
#define sPS2_SuspendTask(htask) sp_suspend_task(htask) /*!< 挂起任务 */
|
||||
#define sPS2_DeleteTask(htask) sp_delete_task(htask) /*!< 删除任务 */
|
||||
#define sPS2_SetTaskPri(htask, pri) sp_set_taskpri(htask, pri) /*!< 设置任务优先级 */
|
||||
#define sPS2_SetBlock(htask, tick) sp_set_block(htask, tick) /*!< 设置阻塞(时间)*/
|
||||
#define sPS2_ClearBlock(htask) sp_clear_block(htask) /*!< 清除阻塞(状态)*/
|
||||
#define sPS2_WriteBin(bin, val) sp_write_binary(&bin, val) /*!< 上锁or给予二值信号量 */
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
+1019
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,421 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_task.h
|
||||
* @brief 任务服务
|
||||
* @details 仅在任务中调用并执行。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_TASK_H
|
||||
#define __SV_TASK_H
|
||||
|
||||
void su_schedule_lock (void);
|
||||
void su_schedule_unlock (void);
|
||||
void su_kernel_lock (void);
|
||||
void su_kernel_unlock (void);
|
||||
void *su_kernel_unlock_ret (void *p);
|
||||
void su_kernel_lock_ (void);
|
||||
void su_kernel_unlock_ (void);
|
||||
void su_kernel_unlock_psv (void);
|
||||
s_ecode_t su_startup_task (s_taskhand_tsp hhand, s_voidvoid_tfp entry, s_u8_t status);
|
||||
s_ecode_t su_suspend_task (s_tasknode_tsp htask);
|
||||
s_ecode_t su_resume_task (s_tasknode_tsp htask);
|
||||
s_ecode_t su_resume_suspend (s_tasknode_tsp htask);
|
||||
s_ecode_t su_delete_task (s_tasknode_tsp htask);
|
||||
s_ecode_t su_set_taskpri (s_tasknode_tsp htask, s_u8_t pri);
|
||||
s_ecode_t su_set_block (s_tasknode_tsp htask, s_delay_t tick);
|
||||
s_ecode_t su_clear_block (s_tasknode_tsp htask);
|
||||
void su_switch_task (s_tasknode_tsp htask);
|
||||
void su_yield_tasking (void);
|
||||
void su_delay (s_delay_t tick);
|
||||
s_bool_t su_take_mutex (s_mutex_tsp hmut, s_delay_t tick);
|
||||
void su_back_mutex (s_mutex_tsp hmut);
|
||||
s_bool_t su_wait_binary (s_binary_tsp hbin, s_delay_t tick);
|
||||
s_bool_t su_take_binary (s_binary_tsp hbin, s_delay_t tick);
|
||||
void su_give_binary (s_binary_tsp hbin);
|
||||
s_bool_t su_take_semaphore (s_semaph_tsp hsem, s_delay_t tick);
|
||||
void su_give_semaphore (s_semaph_tsp hsem);
|
||||
s_bool_t su_recv_taskmsg (m_taskmsg_t _STATIC_MEM_ *flag, s_delay_t tick);
|
||||
m_fetion_t su_recv_fetion (s_tionbox_tsp htbox, s_delay_t tick);
|
||||
void *su_recv_mail (s_mailbox_tsp hmbox, s_delay_t tick);
|
||||
void su_send_mail (s_mailbox_tsp hmbox, void *mail);
|
||||
void *su_recv_msg (s_queue_tsp hque, s_delay_t tick);
|
||||
s_ecode_t su_send_msg (s_queue_tsp hque, void *msg);
|
||||
s_bool_t su_query_group (void _STATIC_MEM_ *hgrp, s_u8_t size);
|
||||
s_bool_t su_wait_group (void _STATIC_MEM_ *hgrp, s_u8_t size, s_delay_t tick);
|
||||
s_bool_t su_init_mempool (s_thrmem_tsp hmem, size_t size);
|
||||
void _MALLOC_MEM_ *su_talloc (s_thrmem_tsp hmem, size_t size);
|
||||
void _MALLOC_MEM_ *su_xalloc (void _MALLOC_MEM_ *p);
|
||||
|
||||
/**
|
||||
@addtogroup 任务服务
|
||||
@{
|
||||
*/
|
||||
|
||||
/*
|
||||
* 操作任务
|
||||
*/
|
||||
|
||||
/** 启动任务 */
|
||||
#define sUSV_StartTask(hhand, entry, status) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_startup_task((s_taskhand_tsp)hhand, entry, !status ? OS_STATUS_READY : OS_STATUS_SUSPENDED) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 挂起任务 */
|
||||
#define sUSV_SuspendTask(htask) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_suspend_task(htask) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 恢复任务 */
|
||||
#define sUSV_ResumeTask(htask) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_resume_task(htask) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 恢复指定任务并挂起自身任务 */
|
||||
#define sUSV_ResumeSuspend(htask) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_resume_suspend(htask) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 删除任务 */
|
||||
#define sUSV_DeleteTask(htask) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_delete_task(htask) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 设置任务优先级 */
|
||||
#define sUSV_SetTaskPri(htask, pri) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_set_taskpri(htask, pri) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 设置阻塞(时间)*/
|
||||
#define sUSV_SetBlock(htask, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_set_block(htask, tick) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 清除阻塞(状态)*/
|
||||
#define sUSV_ClearBlock(htask) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_clear_block(htask) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
/** 自身任务延时 */
|
||||
#define sUSV_Delay(tick) \
|
||||
do{ \
|
||||
if(!s_sign_schedule_forbid){ \
|
||||
mSysIRQ_Disable; \
|
||||
} \
|
||||
su_delay(tick); \
|
||||
}while(false)
|
||||
|
||||
/** 切换任务 */
|
||||
#define sUSV_SwitchTask(htask) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
su_switch_task(htask); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 定时
|
||||
*/
|
||||
|
||||
/** 定时中断 */
|
||||
#define sUSV_TimInt(tmid, tick) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
s_timint_handle[tmid]->timer = s_timint_handle[tmid]->reload = tick; \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
|
||||
/** 定时查询 */
|
||||
#define sUSV_TimQry(tmid, tick) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
s_timqry_handle[tmid]->timer = s_timqry_handle[tmid]->reload = tick; \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 互斥信号量
|
||||
*/
|
||||
|
||||
/** 获取互斥信号量 */
|
||||
#define sUSV_TakeMut(mut, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_take_mutex(&mut, tick) : false \
|
||||
)
|
||||
|
||||
/** 归还互斥信号量 */
|
||||
#define sUSV_BackMut(mut) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
su_back_mutex(&mut); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 二值信号量
|
||||
*/
|
||||
|
||||
/** 等待二值信号量 */
|
||||
#define sUSV_WaitBin(bin, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_wait_binary(&bin, tick) : false \
|
||||
)
|
||||
|
||||
/** 获取二值信号量 */
|
||||
#define sUSV_TakeBin(bin, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_take_binary(&bin, tick) : false \
|
||||
)
|
||||
|
||||
/** 给予二值信号量 */
|
||||
#define sUSV_GiveBin(bin) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
su_give_binary(&bin); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 计数信号量
|
||||
*/
|
||||
|
||||
/** 获取计数信号量 */
|
||||
#define sUSV_TakeSem(sem, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_take_semaphore(&sem, tick) : false \
|
||||
)
|
||||
|
||||
/** 给予计数信号量 */
|
||||
#define sUSV_GiveSem(sem) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
su_give_semaphore(&sem); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 私信
|
||||
*/
|
||||
|
||||
/** 接收私信 */
|
||||
#define sUSV_RecvTaskMsg(tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true \
|
||||
? su_recv_taskmsg(&m0_, tick) \
|
||||
? s_memcpy(&m0 + 1, &m0_ + 1, MCUCFG_TASKMSG_SIZE) || true \
|
||||
? (m_boolvoid_tf(su_kernel_unlock_))() || true \
|
||||
: (m_boolvoid_tf(su_kernel_unlock_))() || true \
|
||||
: false \
|
||||
: false \
|
||||
)
|
||||
|
||||
/** 发送私信 */
|
||||
#define sUSV_SendTaskMsg(task) \
|
||||
su_kernel_lock(); \
|
||||
s_sign_send_taskmsg = true; \
|
||||
MCUCFG_TASKMSG_PSP; \
|
||||
s_switch_taskmsg(u_taskhandle_##task); \
|
||||
task(MCUCFG_TASKMSG_VAL,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 飞信
|
||||
*/
|
||||
|
||||
/** 接收飞信 */
|
||||
#define sUSV_RecvFetion(tbox, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_recv_fetion(&tbox, tick) : false \
|
||||
)
|
||||
|
||||
/** 发送飞信 */
|
||||
#define sUSV_SendFetion(tbox, tion) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
tbox.fetion = tion; \
|
||||
s_switch_notnull(tbox.htask); \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 邮箱
|
||||
*/
|
||||
|
||||
/** 接收邮件 */
|
||||
#define sUSV_RecvMail(mbox, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_recv_mail(&mbox, tick) : OS_NULL \
|
||||
)
|
||||
|
||||
/** 发送邮件 */
|
||||
#define sUSV_SendMail(mbox, mail) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
su_send_mail(&mbox, mail); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 消息队列
|
||||
*/
|
||||
|
||||
/** 接收消息 */
|
||||
#define sUSV_RecvMsg(que, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_recv_msg((s_queue_tsp)&que, tick) : OS_NULL \
|
||||
)
|
||||
|
||||
/** 发送消息 */
|
||||
#define sUSV_SendMsg(que, msg) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_send_msg((s_queue_tsp)&que, msg) : OS_ECODE_NOERROR \
|
||||
)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 事件标志组
|
||||
*/
|
||||
|
||||
/** 查询标志组 */
|
||||
#define sUSV_QueryFlagGroup(group) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_query_group((void *)&group, sizeof(group)) : false \
|
||||
)
|
||||
|
||||
/** 等待标志组 */
|
||||
#define sUSV_WaitFlagGroup(group, tick) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock_))() || true ? su_wait_group((void *)&group, sizeof(group), tick) : false \
|
||||
)
|
||||
|
||||
/** 清除标志组 */
|
||||
#define sUSV_ClearFlagGroup(group) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
sizeof(group) == 1 ? *(s_u8_t *)&group = false : MCUCFG_TERNARYMASK \
|
||||
sizeof(group) == 2 ? *(s_u16_t *)&group = false : MCUCFG_TERNARYMASK \
|
||||
sizeof(group) == 4 ? *(s_u32_t *)&group = false : false; \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
|
||||
/** 写标志位 */
|
||||
#define sUSV_WriteFlagBit(group, bit, value) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
group.bit = value; \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 软件RTC
|
||||
*/
|
||||
|
||||
/** 获取时间 */
|
||||
#define sUSV_GetTime(t) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_kernel_unlock_ret(s_memcpy(t, &s_rtc, sizeof(s_rtc_ts))) : OS_NULL \
|
||||
)
|
||||
|
||||
/** 设置时间 */
|
||||
#if SYSCFG_GETRTC_INT == __ENABLED__
|
||||
#define sUSV_SetTime(t) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
s_memcpy(&s_rtc, t, sizeof(s_rtc_ts)); \
|
||||
s_sign_every.set = true; \
|
||||
s_update_rtccopy(); \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
#else
|
||||
#define sUSV_SetTime(t) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
s_memcpy(&s_rtc, t, sizeof(s_rtc_ts)); \
|
||||
s_sign_every.set = true; \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 进程内存
|
||||
*/
|
||||
|
||||
/** malloc */
|
||||
#define sUSV_Malloc(size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_xalloc((void _MALLOC_MEM_ *)s_malloc(size)) : OS_NULL \
|
||||
)
|
||||
|
||||
/** calloc */
|
||||
#define sUSV_Calloc(nmemb, size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_xalloc((void _MALLOC_MEM_ *)s_calloc(nmemb, size)) : OS_NULL \
|
||||
)
|
||||
|
||||
/** realloc */
|
||||
#define sUSV_Realloc(p, size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_xalloc((void _MALLOC_MEM_ *)s_realloc(p, size)) : OS_NULL \
|
||||
)
|
||||
|
||||
/** free */
|
||||
#define sUSV_Free(p) \
|
||||
do{ \
|
||||
su_kernel_lock(); \
|
||||
s_free(p); \
|
||||
su_kernel_unlock(); \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 线程内存
|
||||
*/
|
||||
|
||||
/** 初始化线程内存池 */
|
||||
#define sUSV_InitMempool(size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_init_mempool(&u_thrmem, size) : false \
|
||||
)
|
||||
|
||||
/** 线程内存分配 */
|
||||
#define sUSV_Talloc(size) \
|
||||
( \
|
||||
(m_boolvoid_tf(su_kernel_lock))() || true ? su_xalloc(su_talloc(&u_thrmem, size)) : OS_NULL \
|
||||
)
|
||||
|
||||
/** 释放线程内存池 */
|
||||
#define sUSV_FreeMempool \
|
||||
do{ \
|
||||
sUSV_Free(u_thrmem.head); \
|
||||
u_thrmem.head = u_thrmem.move = OS_NULL; \
|
||||
}while(false)
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,347 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_tick.c
|
||||
* @brief 滴答服务
|
||||
* @details 仅在 SysTick 中调用并执行,包括在滴答钩子、定时中断钩子、
|
||||
定时查询钩子、定时查询事件等处调用。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_var.h"
|
||||
#include "os_api.h"
|
||||
|
||||
/**
|
||||
@addtogroup CosyOS_内核服务
|
||||
@{
|
||||
*//**
|
||||
\defgroup 滴答服务
|
||||
\brief 仅在 SysTick 中调用并执行,包括在滴答钩子、定时中断钩子、
|
||||
定时查询钩子、定时查询事件等处调用。
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
\brief 清除就绪延时
|
||||
\param 无
|
||||
\return 结果 [true:成功,false:失败]
|
||||
*/
|
||||
s_bool_t st_clear_delay(void) MCUCFG_C51USING
|
||||
{
|
||||
if(s_sign_schedule_forbid){
|
||||
s_task_current->timer = 0;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 挂起任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_suspend_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
if(htask->status < OS_STATUS_SUSPENDED){
|
||||
htask->status |= OS_STATUS_SUSPENDED;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
if(htask->status & OS_STATUS_SUSPENDED){
|
||||
return OS_ECODE_TASKSUSPENDED;
|
||||
}
|
||||
if(htask->status & OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKSTOPPED;
|
||||
}
|
||||
if(htask->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 恢复任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_resume_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
if(htask->status & OS_STATUS_SUSPENDED){
|
||||
htask->status &= (~OS_STATUS_SUSPENDED & 0xFF);
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
if(htask->status < OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKNOTSUSPENDED;
|
||||
}
|
||||
if(htask->status & OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKSTOPPED;
|
||||
}
|
||||
if(htask->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 删除任务
|
||||
\param[in] htask 任务句柄
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_delete_task(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
if(htask->status < OS_STATUS_DELETED){
|
||||
htask->status = OS_STATUS_DELETED;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
if(htask->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 设置任务优先级
|
||||
\param[in] htask 任务句柄
|
||||
\param[in] pri 任务优先级
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_set_taskpri(s_tasknode_tsp htask, s_u8_t pri) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
if(htask->status < OS_STATUS_STOPPED){
|
||||
if(htask->pri != pri){
|
||||
htask->pri = pri;
|
||||
s_set_taskpri(htask);
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_TASKPRIUNCHANGED;
|
||||
}
|
||||
}
|
||||
if(htask->status & OS_STATUS_STOPPED){
|
||||
return OS_ECODE_TASKSTOPPED;
|
||||
}
|
||||
if(htask->status == OS_STATUS_DELETED){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
else{
|
||||
return OS_ECODE_DONOTKNOW;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 设置阻塞(时间)
|
||||
\param[in] htask 任务句柄
|
||||
\param[in] tick 阻塞时间 [单位:滴答周期,0:等效于清除阻塞,~0:无限阻塞]
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_set_block(s_tasknode_tsp htask, s_delay_t tick) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
if(htask->status == OS_STATUS_BLOCKED){
|
||||
if(!tick){
|
||||
htask->status = OS_STATUS_READY;
|
||||
htask->timer = 0;
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
}
|
||||
else{
|
||||
htask->timer = tick;
|
||||
}
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
return OS_ECODE_TASKNOTBLOCKED;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 清除阻塞(状态)
|
||||
\param[in] htask 任务句柄
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_clear_block(s_tasknode_tsp htask) MCUCFG_C51USING
|
||||
{
|
||||
if(htask == OS_NULL){
|
||||
return OS_ECODE_TASKNOTSTARTED;
|
||||
}
|
||||
if(htask->status == OS_STATUS_BLOCKED){
|
||||
htask->status = OS_STATUS_READY;
|
||||
htask->timer = 0;
|
||||
#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
|
||||
htask->tc_counter = 0;
|
||||
#endif
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
return OS_ECODE_TASKNOTBLOCKED;
|
||||
}
|
||||
|
||||
#if SYSCFG_BINARY == __ENABLED__
|
||||
/**
|
||||
\brief 获取二值信号量
|
||||
\param[in] hbin 二值信号量句柄
|
||||
\return 结果 [true:成功,false:失败]
|
||||
*/
|
||||
s_bool_t st_take_binary(s_binary_tsp hbin) MCUCFG_C51USING
|
||||
{
|
||||
if(hbin->binary){
|
||||
hbin->binary = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_SEMAPHORE == __ENABLED__
|
||||
/**
|
||||
\brief 获取计数信号量
|
||||
\param[in] hsem 计数信号量句柄
|
||||
\return 结果 [true:成功,false:失败]
|
||||
*/
|
||||
s_bool_t st_take_semaphore(s_semaph_tsp hsem) MCUCFG_C51USING
|
||||
{
|
||||
if(hsem->counter){
|
||||
(hsem->counter)--;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 给予计数信号量
|
||||
\param[in] hsem 计数信号量句柄
|
||||
\return 无
|
||||
*/
|
||||
void st_give_semaphore(s_semaph_tsp hsem) MCUCFG_C51USING
|
||||
{
|
||||
if(hsem->counter < hsem->maximum){
|
||||
hsem->counter++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_FETION == __ENABLED__
|
||||
/**
|
||||
\brief 接收飞信
|
||||
\param[in] htbox 信箱句柄
|
||||
\return 飞信数据 [false:失败]
|
||||
*/
|
||||
m_fetion_t st_recv_fetion(s_tionbox_tsp htbox) MCUCFG_C51USING
|
||||
{
|
||||
m_fetion_t fetion = htbox->fetion;
|
||||
htbox->fetion = false;
|
||||
return fetion;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_MAILBOX == __ENABLED__
|
||||
/**
|
||||
\brief 接收邮件
|
||||
\param[in] hmbox 邮箱句柄
|
||||
\return 邮件指针 [NULL:失败]
|
||||
*/
|
||||
void *st_recv_mail(s_mailbox_tsp hmbox) MCUCFG_C51USING
|
||||
{
|
||||
if(hmbox->flag){
|
||||
hmbox->flag = false;
|
||||
return hmbox->mail;
|
||||
}
|
||||
return OS_NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 发送邮件
|
||||
\param[in] hmbox 邮箱句柄
|
||||
\param[in] mail 邮件指针
|
||||
\return 无
|
||||
*/
|
||||
void st_send_mail(s_mailbox_tsp hmbox, void *mail) MCUCFG_C51USING
|
||||
{
|
||||
hmbox->flag = false;
|
||||
hmbox->mail = mail;
|
||||
hmbox->flag = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYSCFG_MSGQUEUE == __ENABLED__
|
||||
/**
|
||||
\brief 接收消息
|
||||
\param[in] hque 队列句柄
|
||||
\return 消息指针 [NULL:失败]
|
||||
*/
|
||||
void *st_recv_msg(s_queue_tsp hque) MCUCFG_C51USING
|
||||
{
|
||||
void *msg = OS_NULL;
|
||||
s_msgnode_tsp hmsg;
|
||||
hque->mutex = false;
|
||||
|
||||
if(!hque->counter);
|
||||
else if(hque->type == __DYNAMIC__)
|
||||
sRecvMsg_Dynamic(msg);
|
||||
else
|
||||
sRecvMsg_Static(msg);
|
||||
|
||||
hque->mutex = true;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief 发送消息
|
||||
\param[in] hque 队列句柄
|
||||
\param[in] msg 消息指针
|
||||
\return 错误码 [0:无错误]
|
||||
*/
|
||||
s_ecode_t st_send_msg(s_queue_tsp hque, void *msg) MCUCFG_C51USING
|
||||
{
|
||||
hque->mutex = false;
|
||||
|
||||
if(hque->counter == hque->len){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_alarm.overflow_msgqueue = true;
|
||||
#endif
|
||||
hque->mutex = true;
|
||||
return OS_ECODE_OVERFLOW_MSGQUEUE;
|
||||
}
|
||||
if(hque->type == __DYNAMIC__){
|
||||
s_msgnode_tsp hmsg = OS_NULL;
|
||||
hmsg = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts));
|
||||
if(hmsg == OS_NULL){
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
s_fault.mallocfailed_msgnode = true;
|
||||
#endif
|
||||
hque->mutex = true;
|
||||
return OS_ECODE_MALLOCFAIL_MSGNODE;
|
||||
}
|
||||
sSendMsg_Dynamic(msg);
|
||||
}
|
||||
else
|
||||
sSendMsg_Static(msg);
|
||||
|
||||
hque->mutex = true;
|
||||
return OS_ECODE_NOERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
||||
@@ -0,0 +1,96 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file sv_tick.h
|
||||
* @brief 滴答服务
|
||||
* @details 仅在 SysTick 中调用并执行,包括在滴答钩子、定时中断钩子、
|
||||
定时查询钩子、定时查询事件等处调用。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SV_TICK_H
|
||||
#define __SV_TICK_H
|
||||
|
||||
s_bool_t st_clear_delay (void);
|
||||
s_ecode_t st_suspend_task (s_tasknode_tsp htask);
|
||||
s_ecode_t st_resume_task (s_tasknode_tsp htask);
|
||||
s_ecode_t st_delete_task (s_tasknode_tsp htask);
|
||||
s_ecode_t st_set_taskpri (s_tasknode_tsp htask, s_u8_t pri);
|
||||
s_ecode_t st_set_block (s_tasknode_tsp htask, s_delay_t tick);
|
||||
s_ecode_t st_clear_block (s_tasknode_tsp htask);
|
||||
s_bool_t st_take_binary (s_binary_tsp hbin);
|
||||
s_bool_t st_take_semaphore (s_semaph_tsp hsem);
|
||||
void st_give_semaphore (s_semaph_tsp hsem);
|
||||
m_fetion_t st_recv_fetion (s_tionbox_tsp htbox);
|
||||
void *st_recv_mail (s_mailbox_tsp hmbox);
|
||||
void st_send_mail (s_mailbox_tsp hmbox, void *mail);
|
||||
void *st_recv_msg (s_queue_tsp hque);
|
||||
s_ecode_t st_send_msg (s_queue_tsp hque, void *msg);
|
||||
|
||||
/**
|
||||
@addtogroup 滴答服务
|
||||
@{
|
||||
*/
|
||||
|
||||
#define sTSV_ClearDelay st_clear_delay() /*!< 清除就绪延时 */
|
||||
#define sTSV_SuspendTask(htask) st_suspend_task(htask) /*!< 挂起任务 */
|
||||
#define sTSV_ResumeTask(htask) st_resume_task(htask) /*!< 恢复任务 */
|
||||
#define sTSV_DeleteTask(htask) st_delete_task(htask) /*!< 删除任务 */
|
||||
#define sTSV_SetTaskPri(htask, pri) st_set_taskpri(htask, pri) /*!< 设置任务优先级 */
|
||||
#define sTSV_SetBlock(htask, tick) st_set_block(htask, tick) /*!< 设置阻塞(时间)*/
|
||||
#define sTSV_ClearBlock(htask) st_clear_block(htask) /*!< 清除阻塞(状态)*/
|
||||
#define sTSV_TakeBin(bin) st_take_binary(&bin) /*!< 获取二值信号量 */
|
||||
#define sTSV_TakeSem(sem) st_take_semaphore(&sem) /*!< 获取计数信号量 */
|
||||
#define sTSV_GiveSem(sem) st_give_semaphore(&sem) /*!< 给予计数信号量 */
|
||||
#define sTSV_RecvFetion(tbox) st_recv_fetion(&tbox) /*!< 接收飞信 */
|
||||
#define sTSV_RecvMail(mbox) st_recv_mail(&mbox) /*!< 接收邮件 */
|
||||
#define sTSV_SendMail(mbox, mail) st_send_mail(&mbox, mail) /*!< 发送邮件 */
|
||||
#define sTSV_RecvMsg(que) st_recv_msg((s_queue_tsp)&que) /*!< 接收消息 */
|
||||
#define sTSV_SendMsg(que, msg) st_send_msg((s_queue_tsp)&que, msg) /*!< 发送消息 */
|
||||
#define sTSV_TimInt(tmid, tick) s_timint_handle[tmid]->timer = s_timint_handle[tmid]->reload = tick /*!< 定时中断 */
|
||||
#define sTSV_TimQry(tmid, tick) s_timqry_handle[tmid]->timer = s_timqry_handle[tmid]->reload = tick /*!< 定时查询 */
|
||||
#define sTSV_GetTime(t) s_memcpy(t, &s_rtc, sizeof(s_rtc_ts)) /*!< 获取时间 */
|
||||
|
||||
/** 设置时间 */
|
||||
#if SYSCFG_GETRTC_INT == __ENABLED__
|
||||
#define sTSV_SetTime(t) \
|
||||
do{ \
|
||||
s_memcpy(&s_rtc, t, sizeof(s_rtc_ts)); \
|
||||
s_sign_every.set = true; \
|
||||
s_update_rtccopy(); \
|
||||
}while(false)
|
||||
#else
|
||||
#define sTSV_SetTime(t) \
|
||||
do{ \
|
||||
s_memcpy(&s_rtc, t, sizeof(s_rtc_ts)); \
|
||||
s_sign_every.set = true; \
|
||||
}while(false)
|
||||
#endif
|
||||
|
||||
/** 发送私信 */
|
||||
#define sTSV_SendTaskMsg(task) \
|
||||
s_sign_send_taskmsg = true; \
|
||||
MCUCFG_TASKMSG_PSP; \
|
||||
task(MCUCFG_TASKMSG_VAL,
|
||||
|
||||
/** 查询标志组 */
|
||||
#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 : MCUCFG_TERNARYMASK \
|
||||
sizeof(group) == 2 ? *(s_u16_t *)&group = false : MCUCFG_TERNARYMASK \
|
||||
sizeof(group) == 4 ? *(s_u32_t *)&group = false : false; \
|
||||
}while(false)
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
+1805
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,217 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file ur_eapi.h
|
||||
* @brief 用户API扩展
|
||||
* @details 用户API的补充扩展定义,仅是定义无注释说明,所有内核服务的API说明
|
||||
均在 ur_api.h 中,并支持 doxygen。
|
||||
* @author 迟凯峰
|
||||
* @version V3.3.0
|
||||
* @date 2024.12.25
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __UR_EAPI_H
|
||||
#define __UR_EAPI_H
|
||||
|
||||
|
||||
|
||||
/* 清除就绪延时 */
|
||||
#define iClearDelay sPSV_ClearDelay
|
||||
#define pClearDelay sPS2_ClearDelay
|
||||
|
||||
/* 切换任务 */
|
||||
#define iSwitchTask(task) sPSV_SwitchTask(u_taskhandle_##task)
|
||||
#define pSwitchTask(task) sPS2_SwitchTask(u_taskhandle_##task)
|
||||
|
||||
/* 恢复任务 */
|
||||
#define tResumeTask(task) sTSV_ResumeTask(u_taskhandle_##task)
|
||||
#define iResumeTask(task) sPSV_ResumeTask(u_taskhandle_##task)
|
||||
#define pResumeTask(task) sPS2_ResumeTask(u_taskhandle_##task)
|
||||
|
||||
/* 挂起任务 */
|
||||
#define tSuspendTask(task) sTSV_SuspendTask(u_taskhandle_##task)
|
||||
#define iSuspendTask(task) sPSV_SuspendTask(u_taskhandle_##task)
|
||||
#define pSuspendTask(task) sPS2_SuspendTask(u_taskhandle_##task)
|
||||
|
||||
/* 删除任务 */
|
||||
#define tDeleteTask(task) sTSV_DeleteTask(u_taskhandle_##task)
|
||||
#define iDeleteTask(task) sPSV_DeleteTask(u_taskhandle_##task)
|
||||
#define pDeleteTask(task) sPS2_DeleteTask(u_taskhandle_##task)
|
||||
|
||||
/* 设置任务优先级 */
|
||||
#define tSetTaskPri(task, pri) sTSV_SetTaskPri(u_taskhandle_##task, pri)
|
||||
#define iSetTaskPri(task, pri) sPSV_SetTaskPri(u_taskhandle_##task, pri)
|
||||
#define pSetTaskPri(task, pri) sPS2_SetTaskPri(u_taskhandle_##task, pri)
|
||||
|
||||
/* 清除阻塞(状态)*/
|
||||
#define tClearBlock(task) sTSV_ClearBlock(u_taskhandle_##task)
|
||||
#define iClearBlock(task) sPSV_ClearBlock(u_taskhandle_##task)
|
||||
#define pClearBlock(task) sPS2_ClearBlock(u_taskhandle_##task)
|
||||
|
||||
/* 设置阻塞-滴答周期 */
|
||||
#define tSetBlock_tc(task, tc) sTSV_SetBlock(u_taskhandle_##task, tc)
|
||||
#define iSetBlock_tc(task, tc) sPSV_SetBlock(u_taskhandle_##task, tc)
|
||||
#define pSetBlock_tc(task, tc) sPS2_SetBlock(u_taskhandle_##task, tc)
|
||||
|
||||
/* 设置阻塞-毫秒 */
|
||||
#define tSetBlock_ms(task, ms) tSetBlock_tc(task, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
#define iSetBlock_ms(task, ms) iSetBlock_tc(task, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
#define pSetBlock_ms(task, ms) pSetBlock_tc(task, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
|
||||
/* 设置阻塞-秒钟 */
|
||||
#define tSetBlock_s(task, s) tSetBlock_ms(task, 1000UL * (s))
|
||||
#define iSetBlock_s(task, s) iSetBlock_ms(task, 1000UL * (s))
|
||||
#define pSetBlock_s(task, s) pSetBlock_ms(task, 1000UL * (s))
|
||||
|
||||
/* 设置阻塞-分钟 */
|
||||
#define tSetBlock_m(task, m) tSetBlock_s(task, 60UL * (m))
|
||||
#define iSetBlock_m(task, m) iSetBlock_s(task, 60UL * (m))
|
||||
#define pSetBlock_m(task, m) pSetBlock_s(task, 60UL * (m))
|
||||
|
||||
/* 设置阻塞-小时 */
|
||||
#define tSetBlock_h(task, h) tSetBlock_m(task, 60UL * (h))
|
||||
#define iSetBlock_h(task, h) iSetBlock_m(task, 60UL * (h))
|
||||
#define pSetBlock_h(task, h) pSetBlock_m(task, 60UL * (h))
|
||||
|
||||
/* 定时中断-滴答周期 */
|
||||
#define tTimInt_tc(tmid, tc) sTSV_TimInt(tmid, tc)
|
||||
#define iTimInt_tc(tmid, tc) sPSV_TimInt(tmid, tc)
|
||||
|
||||
/* 定时中断-毫秒 */
|
||||
#define tTimInt_ms(tmid, ms) tTimInt_tc(tmid, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
#define iTimInt_ms(tmid, ms) iTimInt_tc(tmid, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
|
||||
/* 定时中断-秒钟 */
|
||||
#define tTimInt_s(tmid, s) tTimInt_ms(tmid, 1000UL * (s))
|
||||
#define iTimInt_s(tmid, s) iTimInt_ms(tmid, 1000UL * (s))
|
||||
|
||||
/* 定时中断-分钟 */
|
||||
#define tTimInt_m(tmid, m) tTimInt_s(tmid, 60UL * (m))
|
||||
#define iTimInt_m(tmid, m) iTimInt_s(tmid, 60UL * (m))
|
||||
|
||||
/* 定时中断-小时 */
|
||||
#define tTimInt_h(tmid, h) tTimInt_m(tmid, 60UL * (h))
|
||||
#define iTimInt_h(tmid, h) iTimInt_m(tmid, 60UL * (h))
|
||||
|
||||
/* 终止定时中断 */
|
||||
#define tTimInt_Cancel(tmid) tTimInt_tc(tmid, 0)
|
||||
#define iTimInt_Cancel(tmid) iTimInt_tc(tmid, 0)
|
||||
|
||||
/* 定时查询-滴答周期 */
|
||||
#define tTimQry_tc(tmid, tc) sTSV_TimQry(tmid, tc)
|
||||
#define iTimQry_tc(tmid, tc) sPSV_TimQry(tmid, tc)
|
||||
|
||||
/* 定时查询-毫秒 */
|
||||
#define tTimQry_ms(tmid, ms) tTimQry_tc(tmid, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
#define iTimQry_ms(tmid, ms) iTimQry_tc(tmid, (1000UL * (ms)) / SYSCFG_SYSTICKCYCLE)
|
||||
|
||||
/* 定时查询-秒钟 */
|
||||
#define tTimQry_s(tmid, s) tTimQry_ms(tmid, 1000UL * (s))
|
||||
#define iTimQry_s(tmid, s) iTimQry_ms(tmid, 1000UL * (s))
|
||||
|
||||
/* 定时查询-分钟 */
|
||||
#define tTimQry_m(tmid, m) tTimQry_s(tmid, 60UL * (m))
|
||||
#define iTimQry_m(tmid, m) iTimQry_s(tmid, 60UL * (m))
|
||||
|
||||
/* 定时查询-小时 */
|
||||
#define tTimQry_h(tmid, h) tTimQry_m(tmid, 60UL * (h))
|
||||
#define iTimQry_h(tmid, h) iTimQry_m(tmid, 60UL * (h))
|
||||
|
||||
/* 终止定时查询 */
|
||||
#define tTimQry_Cancel(tmid) tTimQry_tc(tmid, ~0)
|
||||
#define iTimQry_Cancel(tmid) iTimQry_tc(tmid, ~0)
|
||||
|
||||
/* 上锁二值信号量 */
|
||||
#define tLockBin(bin) bin.binary = false
|
||||
#define iLockBin(bin) sPSV_WriteBin(bin, false)
|
||||
#define pLockBin(bin) sPS2_WriteBin(bin, false)
|
||||
|
||||
/* 给予二值信号量 */
|
||||
#define tGiveBin(bin) bin.binary = true
|
||||
#define iGiveBin(bin) sPSV_WriteBin(bin, true)
|
||||
#define pGiveBin(bin) sPS2_WriteBin(bin, true)
|
||||
|
||||
/* 获取二值信号量 */
|
||||
#define tTakeBin(bin) sTSV_TakeBin(bin)
|
||||
#define iTakeBin(bin) sISV_TakeBin(bin)
|
||||
|
||||
/* 归还二值信号量 */
|
||||
#define tBackBin(bin) bin.binary = true
|
||||
#define iBackBin(bin) \
|
||||
do{ \
|
||||
bin.binary = true; \
|
||||
iGiveBin(bin); \
|
||||
}while(false)
|
||||
|
||||
/* 给予计数信号量 */
|
||||
#define tGiveSem(sem) sTSV_GiveSem(sem)
|
||||
#define iGiveSem(sem) sPSV_GiveSem(sem)
|
||||
|
||||
/* 获取计数信号量 */
|
||||
#define tTakeSem(sem) sTSV_TakeSem(sem)
|
||||
|
||||
/* 归还计数信号量 */
|
||||
#define tBackSem(sem) tGiveSem(sem)
|
||||
|
||||
/* 发送私信 */
|
||||
#define tSendTaskMsg(task) sTSV_SendTaskMsg(task)
|
||||
|
||||
/* 接收飞信 */
|
||||
#define tRecvFetion(tbox) sTSV_RecvFetion(tbox)
|
||||
#define iRecvFetion(tbox) sISV_RecvFetion(tbox)
|
||||
|
||||
/* 发送飞信 */
|
||||
#define tSendFetion(tbox, tion) tbox.fetion = tion
|
||||
#define iSendFetion(tbox, tion) sPSV_SendFetion(tbox, tion)
|
||||
|
||||
/* 接收邮件 */
|
||||
#define tRecvMail(mbox) sTSV_RecvMail(mbox)
|
||||
#define iRecvMail(mbox) sISV_RecvMail(mbox)
|
||||
|
||||
/* 发送邮件 */
|
||||
#define tSendMail(mbox, mail) sTSV_SendMail(mbox, mail)
|
||||
#define iSendMail(mbox, mail) sPSV_SendMail(mbox, mail)
|
||||
|
||||
/* 接收消息 */
|
||||
#define tRecvMsg(que) sTSV_RecvMsg(que)
|
||||
#define iRecvMsg(que) sISV_RecvMsg(que)
|
||||
|
||||
/* 发送消息 */
|
||||
#define tSendMsg(que, msg) sTSV_SendMsg(que, msg)
|
||||
#define iSendMsg(que, msg) sPSV_SendMsg(que, msg)
|
||||
|
||||
/* 查询标志组 */
|
||||
#define tQueryFlagGroup(group) sTSV_QueryFlagGroup(group)
|
||||
#define iQueryFlagGroup(group) sISV_QueryFlagGroup(group)
|
||||
|
||||
/* 清除标志组 */
|
||||
#define tClearFlagGroup(group) sTSV_ClearFlagGroup(group)
|
||||
#define iClearFlagGroup(group) sPSV_ClearFlagGroup(group)
|
||||
|
||||
/* 设置标志位 */
|
||||
#define iSetFlagBit(group, bit) iSetFlagBits(group, 1) bit)
|
||||
|
||||
/* 清除标志位 */
|
||||
#define iClearFlagBit(group, bit) iClearFlagBits(group, 1) bit)
|
||||
|
||||
/* 获取时间 */
|
||||
#define tGetTime(t) sTSV_GetTime(t)
|
||||
#define iGetTime(t) sISV_GetTime(t)
|
||||
|
||||
/* 设置时间 */
|
||||
#define tSetTime(t) sTSV_SetTime(t)
|
||||
#define iSetTime(t) sPSV_SetTime(t)
|
||||
|
||||
/* 别名定义(API简化)*/
|
||||
#define uRecvTM uRecvTaskMsg
|
||||
#define uSendTM uSendTaskMsg
|
||||
#define tSendTM tSendTaskMsg
|
||||
#define uRecvFet uRecvFetion
|
||||
#define tRecvFet tRecvFetion
|
||||
#define iRecvFet iRecvFetion
|
||||
#define uSendFet uSendFetion
|
||||
#define tSendFet tSendFetion
|
||||
#define iSendFet iSendFetion
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user