Files
cosyos/System/sv_int_pend_fifo.h
零中断延迟的RTOS beda3ca2f4 update 内核文件.
Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
2026-02-01 19:00:21 +00:00

182 lines
4.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**************************************************************************//**
* @item CosyOS-III Kernel
* @file sv_int_pend_fifo.h
* @brief 中断挂起服务_FIFO-调用宏
* @details 仅在用户中断中调用,而后挂起到 PendSV中断 中执行。
* @author 迟凯峰
* @version V2.3.0
* @date 2026.02.01
******************************************************************************/
#ifndef __SV_INT_PEND_FIFO_H
#define __SV_INT_PEND_FIFO_H
/**
@addtogroup CosyOS_内核服务
@{
*//**
\defgroup 中断挂起服务_FIFO
\brief 在中断中调用的服务,不在本地执行,而是把服务的内容写入局部的结构体中,
再把结构体指针入 PendSV_FIFO再触发 PendSV而后在 PendSV中断 中执行。
@{
*//**
\ingroup 中断挂起服务_FIFO
\defgroup 中断挂起服务_FIFO-调用宏
@{
*/
/** 清除就绪延时 */
#define sIPS_ClearDelay() \
do{ \
static sp_svid_ts u_psv = {OS_SVID_CLEARDELAY}; \
mPendSV_FIFOLoad(); \
}while(false)
/** 恢复任务 */
#define sIPS_ResumeTask(_htask) \
do{ \
static sp_task_ts u_psv = {OS_SVID_RESUMETASK, OS_NULL}; \
u_psv.htask = _htask; \
mPendSV_FIFOLoad(); \
}while(false)
/** 挂起任务 */
#define sIPS_SuspendTask(_htask) \
do{ \
static sp_task_ts u_psv = {OS_SVID_SUSPENDTASK, OS_NULL}; \
u_psv.htask = _htask; \
mPendSV_FIFOLoad(); \
}while(false)
/** 删除任务 */
#define sIPS_DeleteTask(_htask) \
do{ \
static sp_task_ts u_psv = {OS_SVID_DELETETASK, OS_NULL}; \
u_psv.htask = _htask; \
mPendSV_FIFOLoad(); \
}while(false)
/** 清除阻塞(状态)*/
#define sIPS_ClearBlock(_htask) \
do{ \
static sp_task_ts u_psv = {OS_SVID_CLEARBLOCK, OS_NULL}; \
u_psv.htask = _htask; \
mPendSV_FIFOLoad(); \
}while(false)
/** 设置阻塞(时间)*/
#define sIPS_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 sIPS_SetTaskPri(_htask, _npri) \
do{ \
static sp_taskpri_ts u_psv = {OS_SVID_SETTASKPRI, OS_NULL, _npri}; \
u_psv.htask = _htask; \
mPendSV_FIFOLoad(); \
}while(false)
/** 写二值信号量 */
#define sIPS_WriteBin(_bin, _value) \
do{ \
static sp_binary_ts u_psv = {OS_SVID_WRITEBINARY, &_bin, _value}; \
mPendSV_FIFOLoad(); \
}while(false)
/** 给予计数信号量 */
#define sIPS_GiveSem(_sem) \
do{ \
static sp_semaph_ts u_psv = {OS_SVID_GIVESEMAPH, &_sem}; \
mPendSV_FIFOLoad(); \
}while(false)
/** 发送飞信 */
#define sIPS_SendFetion(_tbox, _tion) \
do{ \
static sp_tionbox_ts u_psv = {OS_SVID_SENDFETION, &_tbox, 0}; \
u_psv.tion = _tion; \
mPendSV_FIFOLoad(); \
}while(false)
/** 发送邮件 */
#define sIPS_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 sIPS_SendMsg(_que, _msg) \
do{ \
static sp_msgque_ts u_psv = {OS_SVID_SENDMSG, (s_msgque_tsp)&_que, OS_NULL}; \
u_psv.msg = _msg; \
mPendSV_FIFOLoad(); \
}while(false)
/** 定时中断 */
#define sIPS_TimInt(_tmid, _tick) \
do{ \
static sp_timint_ts u_psv = {OS_SVID_TIMINT, _tmid, 0}; \
u_psv.tick = _tick; \
mPendSV_FIFOLoad(); \
}while(false)
/** 定时查询 */
#define sIPS_TimQry(_tmid, _tick) \
do{ \
static sp_timqry_ts u_psv = {OS_SVID_TIMQRY, _tmid, 0}; \
u_psv.tick = _tick; \
mPendSV_FIFOLoad(); \
}while(false)
/** 清除标志组 */
#define sIPS_ClearFlagGroup(_group) \
do{ \
static sp_group_ts u_psv = {OS_SVID_WRITEGROUP, (void *)&_group, -sizeof(_group), ~0}; \
mPendSV_FIFOLoad(); \
}while(false)
/** 写多标志位 */
#define sIPS_WriteFlagBits(_group, _sign, _nbit) \
do{ \
static sp_group_ts u_psv = {OS_SVID_WRITEGROUP, (void *)&_group, _sign##sizeof(_group), 0}; \
u_##_group##_ts u_grp; \
miWriteFlagBits(); \
sizeof(u_grp) == 1 ? *(s_u8_t *)&u_grp = false : MCUCFG_TERNARYMASK \
sizeof(u_grp) == 2 ? *(s_u16_t *)&u_grp = false : MCUCFG_TERNARYMASK \
sizeof(u_grp) == 4 ? *(s_u32_t *)&u_grp = false : false; \
siWriteFlagBits_##_nbit(
/** 全局变量写访问 */
#define sIPS_WriteGVar(_gp, _lp, _size) \
do{ \
static sp_gvar_ts u_psv = {OS_SVID_WRITEGVAR, _gp, _lp, _size}; \
mPendSV_FIFOLoad(); \
}while(false)
/** 挂起服务调用 */
#define sIPS_PendSVC(_fp) \
do{ \
static sp_pendsvc_ts u_psv = {OS_SVID_PENDSVC, _fp}; \
mPendSV_FIFOLoad(); \
}while(false)
/** 设置时间 */
#define sIPS_SetTime(_t) \
do{ \
static const m_rtccount_t _c = 1000000UL / SYSCFG_SYSTICK_CYCLE / 2 + 1; \
iWriteGAry(&s_rtc, _t, sizeof(s_rtc)); \
iWriteGVar(s_rtc_counter, _c); \
}while(false)
/** @} */
/** @} */
/** @} */
#endif