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

580 lines
18 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.c
* @brief 中断挂起服务_FIFO-执行函数
* @details 仅在 PendSV中断 中由系统调用并执行。
* @author 迟凯峰
* @version V2.3.0
* @date 2026.02.01
******************************************************************************/
#include "os_var.h"
#if (MCUCFG_PENDSVFIFO_DEPTH > 0)
#include "os_api.h"
#include "sv_com.h"
#include "ur_api.h"
/**
@addtogroup 中断挂起服务_FIFO
@{
*//**
\defgroup 中断挂起服务_FIFO-执行函数
@{
*/
/**
\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_OSIT_ATTRIBUTE
{
__UNUSED(sv);
sc_clear_delay();
}
#else
#define _clear_delay_ OS_NULL
#endif
/**
\brief 恢复任务
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iResumeTask(task)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/
static void _resume_task_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_resume_task(htask);
if(_ecode){
s_psvfifo_ecode = _ecode;
pResumeTask_ErrorCallback(htask);
}
#else
if(htask == OS_NULL) return;
if(htask->status & OS_STATUS_SUSPENDED){
sa_resume_task(htask);
}
#endif
}
#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_OSIT_ATTRIBUTE
{
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_suspend_task(htask);
if(_ecode){
s_psvfifo_ecode = _ecode;
pSuspendTask_ErrorCallback(htask);
}
#else
if(htask == OS_NULL) return;
if(htask->status < OS_STATUS_SUSPENDED){
sa_suspend_task(htask);
}
#endif
}
#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_OSIT_ATTRIBUTE
{
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_delete_task(htask);
if(_ecode){
s_psvfifo_ecode = _ecode;
pDeleteTask_ErrorCallback(htask);
}
#else
if(htask == OS_NULL) return;
if(htask->status < OS_STATUS_DELETED){
sa_delete_task(htask);
}
#endif
}
#else
#define _delete_task_ OS_NULL
#endif
/**
\brief 清除阻塞(状态)
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iClearBlock(task)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/
static void _clear_block_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_tasknode_tsp htask = ((sp_task_tsp)sv)->htask;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_clear_block(htask);
if(_ecode){
s_psvfifo_ecode = _ecode;
pClearBlock_ErrorCallback(htask);
}
#else
if(htask == OS_NULL) return;
if(htask->status == OS_STATUS_FLOATING || htask->status == OS_STATUS_BLOCKED){
sa_clear_block(htask);
}
#endif
}
#else
#define _clear_block_ 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_OSIT_ATTRIBUTE
{
s_tasknode_tsp htask = ((sp_blocktime_tsp)sv)->htask;
s_delay_t tick = ((sp_blocktime_tsp)sv)->tick;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_set_block(htask, tick);
if(_ecode){
s_psvfifo_ecode = _ecode;
pSetBlock_ErrorCallback(htask, tick);
}
#else
if(htask == OS_NULL) return;
if(htask->status == OS_STATUS_FLOATING || htask->status == OS_STATUS_BLOCKED){
sa_set_block(htask, tick);
}
#endif
}
#else
#define _set_block_ OS_NULL
#endif
/**
\brief 设置任务优先级
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iSetTaskPri(task, npri)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/
static void _set_taskpri_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_tasknode_tsp htask = ((sp_taskpri_tsp)sv)->htask;
s_u8_t npri = ((sp_taskpri_tsp)sv)->npri;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_set_taskpri(htask, npri);
if(_ecode){
s_psvfifo_ecode = _ecode;
pSetTaskPri_ErrorCallback(htask, npri);
}
#else
if(htask == OS_NULL) return;
if(htask->status < OS_STATUS_STOPPED){
if(htask->pri != npri){
sa_set_taskpri(htask, npri);
}
}
#endif
}
#else
#define _set_taskpri_ OS_NULL
#endif
/**
\brief 写二值信号量
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iLockBin(bin)、iGiveBin(bin)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/ \
&& (SYSCFG_BINARY == __ENABLED__)
static void _write_binary_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_binary_tsp hbin = ((sp_binary_tsp)sv)->hbin;
bool value = ((sp_binary_tsp)sv)->value;
sc_write_binary(hbin, value);
}
#else
#define _write_binary_ OS_NULL
#endif
/**
\brief 给予计数信号量
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iGiveSem(sem)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/ \
&& (SYSCFG_SEMAPHORE == __ENABLED__)
static void _give_semaph_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_semaph_tsp hsem = ((sp_semaph_tsp)sv)->hsem;
sc_give_semaph(hsem);
}
#else
#define _give_semaph_ 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_OSIT_ATTRIBUTE
{
s_tionbox_tsp htbox = ((sp_tionbox_tsp)sv)->htbox;
m_fetion_t tion = ((sp_tionbox_tsp)sv)->tion;
sc_send_fetion(htbox, tion);
}
#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_OSIT_ATTRIBUTE
{
s_mailbox_tsp hmbox = ((sp_mailbox_tsp)sv)->hmbox;
void *mail = ((sp_mailbox_tsp)sv)->mail;
sc_send_mail(hmbox, mail);
}
#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_OSIT_ATTRIBUTE
{
s_msgque_tsp hque = ((sp_msgque_tsp)sv)->hque;
void *msg = ((sp_msgque_tsp)sv)->msg;
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
s_ecode_t _ecode = sc_send_msg(hque, msg);
if(_ecode){
s_psvfifo_ecode = _ecode;
pSendMsg_ErrorCallback(hque, msg);
}
#else
sc_send_msg(hque, msg);
#endif
}
#else
#define _send_msg_ 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 > 0)
static void _timint_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_u8_t tmid = ((sp_timint_tsp)sv)->tmid;
s_timint_t tick = ((sp_timint_tsp)sv)->tick;
sc_timint(tmid, 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 > 0)
static void _timqry_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
s_u8_t tmid = ((sp_timqry_tsp)sv)->tmid;
s_timqry_t tick = ((sp_timqry_tsp)sv)->tick;
sc_timqry(tmid, tick);
}
#else
#define _timqry_ 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 _write_group_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
switch((s_u8_t)(((sp_group_tsp)sv)->size)){
case 0x01: *(s_u8_t *)((sp_group_tsp)sv)->hgrp |= ((sp_group_tsp)sv)->value; break;
case 0x02: *(s_u16_t *)((sp_group_tsp)sv)->hgrp |= ((sp_group_tsp)sv)->value; break;
case 0x04: *(s_u32_t *)((sp_group_tsp)sv)->hgrp |= ((sp_group_tsp)sv)->value; break;
case 0xFF: *(s_u8_t *)((sp_group_tsp)sv)->hgrp &=~((sp_group_tsp)sv)->value; break;
case 0xFE: *(s_u16_t *)((sp_group_tsp)sv)->hgrp &=~((sp_group_tsp)sv)->value; break;
case 0xFC: *(s_u32_t *)((sp_group_tsp)sv)->hgrp &=~((sp_group_tsp)sv)->value; break;
}
}
#else
#define _write_group_ OS_NULL
#endif
/**
\brief 全局变量写访问
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iWriteGVar(gv, lv)、iWriteGAry(gp, lp, size)、iWriteGStr(gs, ls)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/
#include <string.h>
static void _write_gvar_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
size_t size = ((sp_gvar_tsp)sv)->size;
void * gp = ((sp_gvar_tsp)sv)->gp;
void * lp = ((sp_gvar_tsp)sv)->lp;
size ? s_memcpy(gp, lp, size) : s_strcpy((char *)gp, (char *)lp);
}
#else
#define _write_gvar_ OS_NULL
#endif
/**
\brief 挂起服务调用
\param[in] sv 服务的结构体指针
\return 无
\note 关联服务iPendSVC(fp)。
*/
#if 1 /* 编译开关 *//* 如果用户不会调用关联服务可手动移除该函数1 改为 0*/
static void _pendsvc_(void _STATIC_MEM_ *sv) MCUCFG_OSIT_ATTRIBUTE
{
(*((sp_pendsvc_tsp)sv)->fp)();
}
#else
#define _pendsvc_ 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_,
_resume_task_,
_suspend_task_,
_delete_task_,
_clear_block_,
_set_block_,
_set_taskpri_,
_write_binary_,
_give_semaph_,
_send_fetion_,
_send_mail_,
_send_msg_,
_timint_,
_timqry_,
_write_group_,
_write_gvar_,
_pendsvc_
};
/** @} *//**
\defgroup 中断挂起服务_FIFO-错误调用返回
\note 当需要回调时,下列的回调函数可以在用户文件中实现。
@{
*/
#if (SYSCFG_PENDSVFIFO_ERRORCALLBACK == __ENABLED__)
/**
\brief iResumeTask(task) error callback
\param[in] htask 任务句柄
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_resume_task_)
__WEAK void pResumeTask_ErrorCallback(s_tasknode_tsp htask) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(htask);
/* NOTE: This function should not be modified, when the callback is needed,
the pResumeTask_ErrorCallback could be implemented in the user file
*/
}
#endif
/**
\brief iSuspendTask(task) error callback
\param[in] htask 任务句柄
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_suspend_task_)
__WEAK void pSuspendTask_ErrorCallback(s_tasknode_tsp htask) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(htask);
/* NOTE: This function should not be modified, when the callback is needed,
the pSuspendTask_ErrorCallback could be implemented in the user file
*/
}
#endif
/**
\brief iDeleteTask(task) error callback
\param[in] htask 任务句柄
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_delete_task_)
__WEAK void pDeleteTask_ErrorCallback(s_tasknode_tsp htask) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(htask);
/* NOTE: This function should not be modified, when the callback is needed,
the pDeleteTask_ErrorCallback could be implemented in the user file
*/
}
#endif
/**
\brief iClearBlock(task) error callback
\param[in] htask 任务句柄
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_clear_block_)
__WEAK void pClearBlock_ErrorCallback(s_tasknode_tsp htask) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(htask);
/* NOTE: This function should not be modified, when the callback is needed,
the pClearBlock_ErrorCallback could be implemented in the user file
*/
}
#endif
/**
\brief iSetBlock_x(task, x) error callback
\details iSetBlock_tc(task, tc)、iSetBlock_ms(task, ms)、iSetBlock_s(task, s)、
iSetBlock_m(task, m)、iSetBlock_h(task, h),都通过该函数实现错误调用返回。
\param[in] htask 任务句柄
\param[in] tick 滴答周期(阻塞时间)
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_set_block_)
__WEAK void pSetBlock_ErrorCallback(s_tasknode_tsp htask, s_delay_t tick) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(htask);
__UNUSED(tick);
/* NOTE: This function should not be modified, when the callback is needed,
the pSetBlock_ErrorCallback could be implemented in the user file
*/
}
#endif
/**
\brief iSetTaskPri(task, npri) error callback
\param[in] htask 任务句柄
\param[in] npri 新优先级
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_set_taskpri_)
__WEAK void pSetTaskPri_ErrorCallback(s_tasknode_tsp htask, s_u8_t npri) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(htask);
__UNUSED(npri);
/* NOTE: This function should not be modified, when the callback is needed,
the pSetTaskPri_ErrorCallback could be implemented in the user file
*/
}
#endif
/**
\brief iSendMsg(que, msg) error callback
\param[in] hque 队列句柄
\param[in] msg 消息指针
\return 无
*/
#if 1 /* 编译开关 *//* 如果该函数在用户文件中实现且此处的弱定义无效可手动移除该函数1 改为 0*/ \
&& !defined (_send_msg_)
__WEAK void pSendMsg_ErrorCallback(s_msgque_tsp hque, void *msg) MCUCFG_OSIT_ATTRIBUTE
{
/* Prevent unused argument(s) compilation warning */
__UNUSED(hque);
__UNUSED(msg);
/* NOTE: This function should not be modified, when the callback is needed,
the pSendMsg_ErrorCallback could be implemented in the user file
*/
}
#endif
#endif
/** @} */
/** @} */
#endif