update 内核文件.

Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
This commit is contained in:
零中断延迟的RTOS
2026-03-01 09:05:14 +00:00
committed by Gitee
parent 3af8904537
commit 32ec5ff04e
8 changed files with 4435 additions and 0 deletions

28
System/CosyOS.H Normal file
View File

@@ -0,0 +1,28 @@
/**************************************************************************//**
* @item CosyOS-III Kernel
* @file CosyOS.H
* @brief 系统链接头文件
* @details 用户的各个c文件中应包含此文件。
* @author 迟凯峰
* @version V2.3.1
* @date 2026.03.01
******************************************************************************/
#ifndef __COSYOS_H
#define __COSYOS_H
#include "os_var.h"
#include "os_api.h"
#include "sv_com.h"
#include "sv_create.h"
#include "sv_int_fifo.h"
#include "sv_int_loc.h"
#include "sv_pend.h"
#include "sv_task.h"
#include "sv_tick.h"
#include "ur_api.h"
#include "ur_eapi.h"
#endif

313
System/os_api.h Normal file
View File

@@ -0,0 +1,313 @@
/**************************************************************************//**
* @item CosyOS-III Kernel
* @file os_api.h
* @brief 系统内核专用API
* @author 迟凯峰
* @version V2.3.1
* @date 2026.03.01
******************************************************************************/
#ifndef __OS_API_H
#define __OS_API_H
/*
* 引用.标准库函数
*/
#define s_init_mempool init_mempool
#define s_malloc malloc
#define s_calloc calloc
#define s_realloc realloc
#define s_free free
#define s_memcpy memcpy
#define s_memcmp memcmp
#define s_strcpy strcpy
#define s_strcmp strcmp
#define s_strlen strlen
/*
* 操作.定时中断/查询
*/
/** 启动定时中断任务 */
#define sStartTask_TimInt(tmid) \
sUSV_StartTask_0(s_timint_handle[tmid]->hookorhand.hand, OS_STATUS_SUSPENDED)
/** 启动定时查询任务 */
#define sStartTask_TimQry(tmid) \
sUSV_StartTask_0(s_timqry_handle[tmid]->hookorhand.hand, OS_STATUS_SUSPENDED)
/** 恢复定时中断任务 */
#define sResumeTask_TimInt(tmid) \
sTSV_ResumeTask(*(s_timint_handle[tmid]->hookorhand.hand)->dualhandle)
/** 恢复定时查询任务 */
#define sResumeTask_TimQry(tmid) \
sTSV_ResumeTask(*(s_timqry_handle[tmid]->hookorhand.hand)->dualhandle)
/** 调用定时中断钩子 */
#define sCallHook_TimInt(tmid) \
(*s_timint_handle[tmid]->hookorhand.hook)()
/** 调用定时查询钩子 */
#define sCallHook_TimQry(tmid) \
(*s_timqry_handle[tmid]->hookorhand.hook)()
/*
* 事件标志组 - 写标志位
*/
#define stWriteFlagBits_1(g, v, b0) \
g.b0 = v
#define stWriteFlagBits_2(g, v, b0, b1) \
g.b0 = g.b1 = v
#define stWriteFlagBits_3(g, v, b0, b1, b2) \
g.b0 = g.b1 = g.b2 = v
#define stWriteFlagBits_4(g, v, b0, b1, b2, b3) \
g.b0 = g.b1 = g.b2 = g.b3 = v
#define stWriteFlagBits_5(g, v, b0, b1, b2, b3, b4) \
g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = v
#define stWriteFlagBits_6(g, v, b0, b1, b2, b3, b4, b5) \
g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = g.b5 = v
#define stWriteFlagBits_7(g, v, b0, b1, b2, b3, b4, b5, b6) \
g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = g.b5 = g.b6 = v
#define stWriteFlagBits_8(g, v, b0, b1, b2, b3, b4, b5, b6, b7) \
g.b0 = g.b1 = g.b2 = g.b3 = g.b4 = g.b5 = g.b6 = g.b7 = v
#define suWriteFlagBits_1(g, v, b0) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_1(g, v, b0); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_2(g, v, b0, b1) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_2(g, v, b0, b1); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_3(g, v, b0, b1, b2) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_3(g, v, b0, b1, b2); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_4(g, v, b0, b1, b2, b3) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_4(g, v, b0, b1, b2, b3); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_5(g, v, b0, b1, b2, b3, b4) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_5(g, v, b0, b1, b2, b3, b4); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_6(g, v, b0, b1, b2, b3, b4, b5) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_6(g, v, b0, b1, b2, b3, b4, b5); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_7(g, v, b0, b1, b2, b3, b4, b5, b6) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_7(g, v, b0, b1, b2, b3, b4, b5, b6); \
su_kernel_unlocks(); \
}while(false)
#define suWriteFlagBits_8(g, v, b0, b1, b2, b3, b4, b5, b6, b7) \
do{ \
su_kernel_locks(); \
stWriteFlagBits_8(g, v, b0, b1, b2, b3, b4, b5, b6, b7); \
su_kernel_unlocks(); \
}while(false)
#define siWriteFlagBits_1(b0) \
stWriteFlagBits_1(u_grp, true, b0); \
siWriteFlagBits()
#define siWriteFlagBits_2(b0, b1) \
stWriteFlagBits_2(u_grp, true, b0, b1); \
siWriteFlagBits()
#define siWriteFlagBits_3(b0, b1, b2) \
stWriteFlagBits_3(u_grp, true, b0, b1, b2); \
siWriteFlagBits()
#define siWriteFlagBits_4(b0, b1, b2, b3) \
stWriteFlagBits_4(u_grp, true, b0, b1, b2, b3); \
siWriteFlagBits()
#define siWriteFlagBits_5(b0, b1, b2, b3, b4) \
stWriteFlagBits_5(u_grp, true, b0, b1, b2, b3, b4); \
siWriteFlagBits()
#define siWriteFlagBits_6(b0, b1, b2, b3, b4, b5) \
stWriteFlagBits_6(u_grp, true, b0, b1, b2, b3, b4, b5); \
siWriteFlagBits()
#define siWriteFlagBits_7(b0, b1, b2, b3, b4, b5, b6) \
stWriteFlagBits_7(u_grp, true, b0, b1, b2, b3, b4, b5, b6); \
siWriteFlagBits()
#define siWriteFlagBits_8(b0, b1, b2, b3, b4, b5, b6, b7) \
stWriteFlagBits_8(u_grp, true, b0, b1, b2, b3, b4, b5, b6, b7); \
siWriteFlagBits()
#define siWriteFlagBits() \
u_psv.value = ( \
sizeof(u_grp) == 1 ? *(s_u8_t *)&u_grp \
: sizeof(u_grp) == 2 ? *(s_u16_t *)&u_grp \
: sizeof(u_grp) == 4 ? *(s_u32_t *)&u_grp \
: 0 \
); \
} \
mPendSV_FIFOLoad(); \
}while(false)
/*
* 私信 - 创建信箱
*/
#define sTaskMsg_Init_1(g) \
tm1##g = tm1_##g
#define sTaskMsg_Init_2(g) \
sTaskMsg_Init_1(g); \
tm2##g = tm2_##g
#define sTaskMsg_Init_3(g) \
sTaskMsg_Init_2(g); \
tm3##g = tm3_##g
#define sTaskMsg_Init_4(g) \
sTaskMsg_Init_3(g); \
tm4##g = tm4_##g
#define sTaskMsg_Init_5(g) \
sTaskMsg_Init_4(g); \
tm5##g = tm5_##g
#define sTaskMsg_Init_6(g) \
sTaskMsg_Init_5(g); \
tm6##g = tm6_##g
#define sTaskMsg_Init_7(g) \
sTaskMsg_Init_6(g); \
tm7##g = tm7_##g
#define sTaskMsg_Init_8(g) \
sTaskMsg_Init_7(g); \
tm8##g = tm8_##g
#define sTaskMsg_Init(n) \
static volatile s_u8_t u_tmrf = 0; \
if(s_taskmsg_sign){ \
u_tmrf = 1; \
sTaskMsg_Init_##n(_); \
if(--s_taskmsg_sign){ \
s_taskmsg_sign = 0; \
su_kernel_unlocks(); \
} \
return; \
} \
if(u_tmrf == 2){ \
u_tmrf = 0; \
sTaskMsg_Init_##n( ); \
return; \
}
#define sCreateTaskMsg_0_1(m1) \
(m1##__) \
{ \
static m1##_; \
static m1 ; \
sTaskMsg_Init(1); \
do
#define sCreateTaskMsg_0_2(m1, m2) \
(m1##__, m2##__) \
{ \
static m1##_; static m2##_; \
static m1 ; static m2 ; \
sTaskMsg_Init(2); \
do
#define sCreateTaskMsg_0_3(m1, m2, m3) \
(m1##__, m2##__, m3##__) \
{ \
static m1##_; static m2##_; static m3##_; \
static m1 ; static m2 ; static m3 ; \
sTaskMsg_Init(3); \
do
#define sCreateTaskMsg_0_4(m1, m2, m3, m4) \
(m1##__, m2##__, m3##__, m4##__) \
{ \
static m1##_; static m2##_; static m3##_; static m4##_; \
static m1 ; static m2 ; static m3 ; static m4 ; \
sTaskMsg_Init(4); \
do
#define sCreateTaskMsg_0_5(m1, m2, m3, m4, m5) \
(m1##__, m2##__, m3##__, m4##__, m5##__) \
{ \
static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; \
static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; \
sTaskMsg_Init(5); \
do
#define sCreateTaskMsg_0_6(m1, m2, m3, m4, m5, m6) \
(m1##__, m2##__, m3##__, m4##__, m5##__, m6##__) \
{ \
static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; static m6##_; \
static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; static m6 ; \
sTaskMsg_Init(6); \
do
#define sCreateTaskMsg_0_7(m1, m2, m3, m4, m5, m6, m7) \
(m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__) \
{ \
static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; static m6##_; static m7##_; \
static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; static m6 ; static m7 ; \
sTaskMsg_Init(7); \
do
#define sCreateTaskMsg_0_8(m1, m2, m3, m4, m5, m6, m7, m8) \
(m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__, m8##__) \
{ \
static m1##_; static m2##_; static m3##_; static m4##_; static m5##_; static m6##_; static m7##_; static m8##_; \
static m1 ; static m2 ; static m3 ; static m4 ; static m5 ; static m6 ; static m7 ; static m8 ; \
sTaskMsg_Init(8); \
do
#define sCreateTaskMsg_1(m1) sCreateTaskMsg_0_1(m1)
#define sCreateTaskMsg_2(m1, m2) sCreateTaskMsg_0_2(m1, m2)
#define sCreateTaskMsg_3(m1, m2, m3) sCreateTaskMsg_0_3(m1, m2, m3)
#define sCreateTaskMsg_4(m1, m2, m3, m4) sCreateTaskMsg_0_4(m1, m2, m3, m4)
#define sCreateTaskMsg_5(m1, m2, m3, m4, m5) sCreateTaskMsg_0_5(m1, m2, m3, m4, m5)
#define sCreateTaskMsg_6(m1, m2, m3, m4, m5, m6) sCreateTaskMsg_0_6(m1, m2, m3, m4, m5, m6)
#define sCreateTaskMsg_7(m1, m2, m3, m4, m5, m6, m7) sCreateTaskMsg_0_7(m1, m2, m3, m4, m5, m6, m7)
#define sCreateTaskMsg_8(m1, m2, m3, m4, m5, m6, m7, m8) sCreateTaskMsg_0_8(m1, m2, m3, m4, m5, m6, m7, m8)
#endif

688
System/os_handler.c Normal file

File diff suppressed because it is too large Load Diff

635
System/os_taskmgr.c Normal file

File diff suppressed because it is too large Load Diff

579
System/sv_int_fifo.c Normal file

File diff suppressed because it is too large Load Diff

181
System/sv_int_fifo.h Normal file
View File

@@ -0,0 +1,181 @@
/**************************************************************************//**
* @item CosyOS-III Kernel
* @file sv_int_fifo.h
* @brief 中断FIFO服务-调用宏
* @details 仅在用户中断中调用,而后挂起到 PendSV中断 中执行。
* @author 迟凯峰
* @version V2.3.1
* @date 2026.03.01
******************************************************************************/
#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_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

38
System/sv_pend.h Normal file
View File

@@ -0,0 +1,38 @@
/**************************************************************************//**
* @item CosyOS-III Kernel
* @file sv_pend.h
* @brief PSV服务
* @details 仅在 PendSV中断 中调用并执行。
* @author 迟凯峰
* @version V2.3.1
* @date 2026.03.01
******************************************************************************/
#ifndef __SV_PEND_H
#define __SV_PEND_H
/**
@addtogroup CosyOS_内核服务
@{
*//**
\defgroup PSV服务
\brief 仅在 PendSV中断 中调用并执行的服务。
包括通过挂起服务调用iPendSVC间接调用在挂起服务钩子pendsv_hook中调用。
如果通过挂起服务调用iPendSVC间接调用就是 FIFO服务
如果通过挂起服务钩子pendsv_hook 调用,就是 FIAG服务。
@{
*/
#define sPSV_ClearDelay() sc_clear_delay() /*!< 清除就绪延时 */
#define sPSV_ResumeTask(htask) sc_resume_task(htask) /*!< 恢复任务 */
#define sPSV_SuspendTask(htask) sc_suspend_task(htask) /*!< 挂起任务 */
#define sPSV_DeleteTask(htask) sc_delete_task(htask) /*!< 删除任务 */
#define sPSV_ClearBlock(htask) sc_clear_block(htask) /*!< 清除阻塞(状态)*/
#define sPSV_SetBlock(htask, tick) sc_set_block(htask, tick) /*!< 设置阻塞(时间)*/
#define sPSV_SetTaskPri(htask, npri) sc_set_taskpri(htask, npri) /*!< 设置任务优先级 */
#define sPSV_GiveBin(bin) sc_write_binary(&bin, true) /*!< 给予二值信号量 */
/** @} */
/** @} */
#endif

1973
System/ur_api.h Normal file

File diff suppressed because it is too large Load Diff