mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-08-17 16:52:27 +08:00
190 lines
5.0 KiB
C
190 lines
5.0 KiB
C
/**************************************************************************//**
|
|
* @item CosyOS-III Kernel
|
|
* @file sv_int_fifo.h
|
|
* @brief 中断FIFO服务-调用宏
|
|
* @details 仅在用户中断中调用,而后挂起到 PendSV中断 中执行。
|
|
* @author 迟凯峰
|
|
* @version v3.0.0
|
|
* @date 2026.07.21
|
|
******************************************************************************/
|
|
|
|
#ifndef __SV_INT_FIFO_H
|
|
#define __SV_INT_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_ResetTask(_htask, _status) \
|
|
do{ \
|
|
static sp_taskrst_ts u_psv = {OS_SVID_RESETTASK, OS_NULL, _status}; \
|
|
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_TERNARY_MASK \
|
|
sizeof(u_grp) == 2 ? *(s_u16_t *)&u_grp = false : MCUCFG_TERNARY_MASK \
|
|
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 m_rtccount_t const _c = 1000000UL / SYSCFG_SYSTICK_CYCLE / 2 + 1; \
|
|
iWriteGAry(&s_rtc, _t, sizeof(s_rtc)); \
|
|
iWriteGVar(s_rtc_counter, _c); \
|
|
}while(false)
|
|
|
|
/** @} */
|
|
/** @} */
|
|
/** @} */
|
|
|
|
#endif
|