Files
cosyos/System/sv_int_pend_fifo.c
零中断延迟的RTOS bbd17e32ee update System/sv_int_pend_fifo.c.
Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
2024-11-15 09:04:52 +00:00

426 lines
13 KiB
C
Raw 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-II Kernel
* @file sv_int_pend_fifo.c
* @brief 中断挂起服务_FIFO - 执行函数
* @details 仅在 PendSV 中由系统调用并执行。
* @author 迟凯峰
* @version V3.1.0
* @date 2024.11.11
******************************************************************************/
#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 关联服务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);
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 || htask->status == OS_STATUS_FLOATING){
if(!((sp_blocktime_tsp)sv)->tick){
htask->status = OS_STATUS_READY;
s_switch_taskpri(htask);
}
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_FLOATING){
htask->status = OS_STATUS_READY;
htask->timer = 0;
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)。
*/
#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) =
{
_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