update CosyOS-II 内核文件.

Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
This commit is contained in:
零中断延迟的RTOS
2023-11-25 15:59:06 +00:00
committed by Gitee
parent f83b72b7f0
commit 9568ccb8d5
13 changed files with 4410 additions and 0 deletions

845
System/os_timing.c Normal file

File diff suppressed because it is too large Load Diff

86
System/os_var.c Normal file
View File

@@ -0,0 +1,86 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_var.c
* @brief 系统全局变量定义
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#include "os_redef.h"
/* The Soft-RTC */
#if SYSCFG_SOFTRTC == __ENABLED__
s_u8_t _SYS_MEM_ s_rtc[2][7] = {sInitRealTime, sInitRealTime};
volatile s_bool_t s_rtc_binary = false;
s_u8_t _SYS_MEM_ s_month2day = 28;
const s_u8_t _CONST_MEM_ s_month0day[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
volatile s_every_ts _SYS_MEM_ s_sign_every = {0, 0, 0, 0, 0, 0};
#endif
/* The Task */
volatile m_bit_t /*_SYS_MEM_*/ s_sign_return = true;
volatile m_bit_t /*_SYS_MEM_*/ s_sign_scheduling = false;
volatile s_u8_t _SYS_MEM_ s_taskcri_counter = 0;
s_sharing_t _SYS_MEM_ s_tick_counter = 0;
s_taskhand_tsp _SYS_MEM_ s_task_starter = NULL;
s_tasknode_tsp _SYS_MEM_ s_task_current = NULL;
s_tasknode_tsp _SYS_MEM_ s_taskpri_tail = NULL;
s_ecode_t _SYS_MEM_ s_startup_code = OS_ECODE_NOERROR;
s_delay_t s_delay_loader[OS_TASKTOTAL + 1];
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
s_u8_t _SYS_MEM_ s_task_status0 = OS_STATUS_DELETED;
#endif
#if SYSCFG_SAFERUNTIME == __ENABLED__
s_bool_t s_sign_timeout[OS_TASKTOTAL + 1];
#endif
#if SYSCFG_TIMESHARINGMODE == 2
const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY] = {SYSCFG_CUSTOMTIMESHARING};
#endif
/* The Timing Interrupt-Task/Hook */
#if OS_TIMINTTOTAL
s_bool_t s_timint_hookortask[OS_TIMINTTOTAL];
s_bool_t s_timint_autoreload[OS_TIMINTTOTAL];
s_timint_t s_timint_reload[OS_TIMINTTOTAL];
s_timint_t s_timint_loader[OS_TIMINTTOTAL];
s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL];
#endif
/* The Timing Query-Task/Hook */
#if OS_TIMQRYTOTAL
s_bool_t s_timqry_hookortask[OS_TIMQRYTOTAL];
s_bool_t s_timqry_autoreload[OS_TIMQRYTOTAL];
s_timqry_t s_timqry_reload[OS_TIMQRYTOTAL];
s_timqry_t s_timqry_loader[OS_TIMQRYTOTAL];
s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL];
#endif
/* The Global Variable Accessor */
volatile m_bit_t /*_SYS_MEM_*/ s_sign_updatecopy = false;
/* The Message Mailbox Accessor */
#if SYSCFG_MAILBOX == __ENABLED__
s_mbox_tsp _SYS_MEM_ s_mbox_accessor = NULL;
#if SYSCFG_MCUCORE == 8051
volatile m_bit_t /*_SYS_MEM_*/ s_sign_write_mbox_accessor = false;
#endif
#endif
/* The Task Message */
#if SYSCFG_TASKMSG == __ENABLED__
volatile m_bit_t /*_SYS_MEM_*/ s_sign_send_taskmsg = false;
#endif
/* The Debug Interface */
#if SYSCFG_DEBUGGING == __ENABLED__
s_alarm_ts s_alarm = {0, 0, 0, 0};
s_fault_ts s_fault = {0, 0, 0, 0, 0, 0, 0, 0};
char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE];
char _XDATA_MEM_ * s_debug_recvptr = s_debug_recvbuff;
volatile s_u8_t s_debug_sendtype = 0;
char _XDATA_MEM_ * s_debug_sendptr;
char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE];
char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE];
volatile s_bool_t s_taskmgr_binary = SYSCFG_TASKMGRAUTOSTART;
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
s_u32_t s_tick_counter1 = 0;
s_u32_t s_tick_counter2 = 0;
#endif
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
m_pc_t s_pc = 0;
#endif
#endif

92
System/os_var.h Normal file
View File

@@ -0,0 +1,92 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_var.h
* @brief 系统全局变量声明
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#ifndef __OS_VAR_H
#define __OS_VAR_H
#include "os_redef.h"
/* The Soft-RTC */
#if SYSCFG_SOFTRTC == __ENABLED__
extern s_u8_t _SYS_MEM_ s_rtc[2][7];
extern volatile s_bool_t s_rtc_binary;
extern s_u8_t _SYS_MEM_ s_month2day;
extern const s_u8_t _CONST_MEM_ s_month0day[13];
extern volatile s_every_ts _SYS_MEM_ s_sign_every;
#endif
/* The Task */
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_return;
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_scheduling;
extern volatile s_u8_t _SYS_MEM_ s_taskcri_counter;
extern s_sharing_t _SYS_MEM_ s_tick_counter;
extern s_taskhand_tsp _SYS_MEM_ s_task_starter;
extern s_tasknode_tsp _SYS_MEM_ s_task_current;
extern s_tasknode_tsp _SYS_MEM_ s_taskpri_tail;
extern s_ecode_t _SYS_MEM_ s_startup_code;
extern s_delay_t s_delay_loader[OS_TASKTOTAL + 1];
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
extern s_u8_t _SYS_MEM_ s_task_status0;
#endif
#if SYSCFG_SAFERUNTIME == __ENABLED__
extern s_bool_t s_sign_timeout[OS_TASKTOTAL + 1];
#endif
#if SYSCFG_TIMESHARINGMODE == 2
extern const s_sharing_t _CONST_MEM_ s_time_sharing[SYSCFG_TASKPRIORITY];
#endif
/* The Timing Interrupt-Task/Hook */
#if OS_TIMINTTOTAL
extern s_bool_t s_timint_hookortask[OS_TIMINTTOTAL];
extern s_bool_t s_timint_autoreload[OS_TIMINTTOTAL];
extern s_timint_t s_timint_reload[OS_TIMINTTOTAL];
extern s_timint_t s_timint_loader[OS_TIMINTTOTAL];
extern s_timinthand_tsp s_timint_handle[OS_TIMINTTOTAL];
#endif
/* The Timing Query-Task/Hook */
#if OS_TIMQRYTOTAL
extern s_bool_t s_timqry_hookortask[OS_TIMQRYTOTAL];
extern s_bool_t s_timqry_autoreload[OS_TIMQRYTOTAL];
extern s_timqry_t s_timqry_reload[OS_TIMQRYTOTAL];
extern s_timqry_t s_timqry_loader[OS_TIMQRYTOTAL];
extern s_timqryhand_tsp s_timqry_handle[OS_TIMQRYTOTAL];
#endif
/* The Global Variable Accessor */
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_updatecopy;
/* The Message Mailbox Accessor */
#if SYSCFG_MAILBOX == __ENABLED__
extern s_mbox_tsp _SYS_MEM_ s_mbox_accessor;
#if SYSCFG_MCUCORE == 8051
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_write_mbox_accessor;
#endif
#endif
/* The Task Message */
#if SYSCFG_TASKMSG == __ENABLED__
extern volatile m_bit_t /*_SYS_MEM_*/ s_sign_send_taskmsg;
#endif
/* The Debug Interface */
#if SYSCFG_DEBUGGING == __ENABLED__
extern s_alarm_ts s_alarm;
extern s_fault_ts s_fault;
extern char _XDATA_MEM_ s_debug_recvbuff[OS_DEBUGRECVBUFFSIZE];
extern char _XDATA_MEM_ * s_debug_recvptr;
extern volatile s_u8_t s_debug_sendtype;
extern char _XDATA_MEM_ * s_debug_sendptr;
extern char _XDATA_MEM_ s_cmdline_sendbuff[OS_CMDLINESENDBUFFSIZE];
extern char _XDATA_MEM_ s_taskmgr_sendbuff[OS_TASKMGRSENDBUFFSIZE];
extern volatile s_bool_t s_taskmgr_binary;
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
extern s_u32_t s_tick_counter1;
extern s_u32_t s_tick_counter2;
#endif
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
extern m_pc_t s_pc;
#endif
#endif
extern void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_Handler[OS_SVID_END])(void _OBJ_MEM_ *);
#endif

240
System/sv_create.h Normal file
View File

@@ -0,0 +1,240 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_create.h
* @brief 创建服务(用于创建各种内核对象)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#ifndef __SV_CREATE_H
#define __SV_CREATE_H
/*
* 声明任务
*/
/* 无私信 */
#define sCSV_ExternTask(name) \
extern s_taskhand_ts u_taskhand_##name; \
void name(void)
/* 有私信 */
#define sCSV_ExternTask_Msg(name) \
extern s_taskhand_ts u_taskhand_##name; \
void name(MCUCFG_TASKMSG_VAR,
/*
* 创建任务
*/
/* 创建一般任务 */
#if SYSCFG_DEBUGGING == __ENABLED__
#if SYSCFG_TASKCREATEMODE == __STATIC__
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, u_taskstack_##name, tss, #name, {0}, MCUCFG_BASICSTACKSIZE, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name}; \
void name \
sCreateTaskMsg_##ntm
#elif SYSCFG_TASKCREATEMODE == __BALANCE__
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, NULL, tss, #name, {0}, MCUCFG_BASICSTACKSIZE, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name, false}; \
void name \
sCreateTaskMsg_##ntm
#elif SYSCFG_TASKCREATEMODE == __DYNAMIC__
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
s_taskhand_ts u_taskhand_##name = {0, tss, pri, (s_voidvoid_tfp)name, #name, srt, NULL}; \
void name \
sCreateTaskMsg_##ntm
#endif
#else
#if SYSCFG_TASKCREATEMODE == __STATIC__
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
MCUCFG_STACK_ALIGN static s_u8_t u_taskstack_##name[tss]; \
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, u_taskstack_##name, tss, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name}; \
void name \
sCreateTaskMsg_##ntm
#elif SYSCFG_TASKCREATEMODE == __BALANCE__
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
s_taskhand_ts u_taskhand_##name = {0, 0, 0, OS_STATUS_DELETED, 0, NULL, NULL, tss, srt, 0, NULL, NULL, pri, (s_voidvoid_tfp)name}; \
void name \
sCreateTaskMsg_##ntm
#elif SYSCFG_TASKCREATEMODE == __DYNAMIC__
#define sCSV_CreateTask(name, pri, tss, srt, ntm) \
s_taskhand_ts u_taskhand_##name = {0, tss, pri, (s_voidvoid_tfp)name, srt, NULL}; \
void name \
sCreateTaskMsg_##ntm
#endif
#endif
/* 创建定时中断任务 */
#define sCSV_CreateTask_TimInt(tmid, arl, name, pri, tss, srt, ntm) \
s_taskhand_ts u_taskhand_##name; \
const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {&u_taskhand_##name, (s_voidvoid_tfp)0, arl}; \
sCSV_CreateTask(name, pri, tss, srt, ntm)
/* 创建定时查询任务 */
#define sCSV_CreateTask_TimQry(tmid, event, arl, name, pri, tss, srt, ntm) \
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING \
{ \
return (event ? true : false); \
} \
s_taskhand_ts u_taskhand_##name; \
const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {&u_taskhand_##name, (s_voidvoid_tfp)0, (s_boolvoid_tfp)u_timqryevent_##tmid, arl}; \
sCSV_CreateTask(name, pri, tss, srt, ntm)
/*
* 创建钩子
*/
/* 创建定时中断钩子 */
#define sCSV_CreateHook_TimInt(tmid, arl, name) \
void name(void); \
const s_timinthand_ts _CONST_MEM_ u_timinthand_##tmid = {(s_taskhand_tsp)0, (s_voidvoid_tfp)name, arl}; \
void name(void) MCUCFG_USING
/* 创建定时查询钩子 */
#define sCSV_CreateHook_TimQry(tmid, event, arl, name) \
s_bool_t u_timqryevent_##tmid(void) MCUCFG_C51USING \
{ \
return (event ? true : false); \
} \
void name(void); \
const s_timqryhand_ts _CONST_MEM_ u_timqryhand_##tmid = {(s_taskhand_tsp)0, (s_voidvoid_tfp)name, (s_boolvoid_tfp)u_timqryevent_##tmid, arl}; \
void name(void) MCUCFG_USING
/*
* 二值信号量
*/
/* 声明 */
#define sCSV_ExternBin(name) \
extern volatile s_bool_t name
/* 创建 */
#define sCSV_CreateBin(name) \
volatile s_bool_t name
/*
* 互斥信号量
*/
/* 声明 */
#define sCSV_ExternMut(name) \
extern s_mutex_ts name
/* 创建 */
#define sCSV_CreateMut(name) \
s_mutex_ts name = {false, NULL, 0}
/*
* 计数信号量
*/
/* 声明 */
#define sCSV_ExternSem(name) \
extern s_sem_ts name
/* 创建 */
#define sCSV_CreateSem(name, init, max) \
s_sem_ts name = {init, max}
/*
* 飞信
*/
/* 声明信箱 */
#define sCSV_ExternFetion(name) \
extern volatile m_fetion_t name
/* 创建信箱 */
#define sCSV_CreateFetion(name) \
volatile m_fetion_t name = false
/*
* 消息邮箱
*/
/* 声明邮箱 */
#define sCSV_ExternMailbox(name, type) \
extern type name; \
sCSV_ExternBin(name##_gnmf)
/* 创建邮箱 */
#define sCSV_CreateMailbox(name, type) \
type name; \
sCSV_CreateBin(name##_gnmf) = false
/*
* 消息队列
*/
/* 声明静态消息队列 */
#define sCSV_ExternMsgQueue_Static(name) \
extern s_msgqueue_static_ts name
/* 声明动态消息队列 */
#define sCSV_ExternMsgQueue_Dynamic(name) \
extern s_msgqueue_dynamic_ts name
/* 创建静态消息队列 */
#define sCSV_CreateMsgQueue_Static(name, mode, len) \
void *u_msgqueue_##name[len]; \
s_msgqueue_static_ts name = {0, __STATIC__, mode, len, true, u_msgqueue_##name, u_msgqueue_##name + len - 1, u_msgqueue_##name}
/* 创建动态消息队列 */
#define sCSV_CreateMsgQueue_Dynamic(name, mode, len) \
s_msgqueue_dynamic_ts name = {0, __DYNAMIC__, mode, len, true, NULL, NULL}
/*
* 事件标志组
*/
/* 声明 */
#define sCSV_ExternFlagGroup(name, bits) \
typedef struct{bits} u_##name##_ts; \
extern volatile u_##name##_ts name
/* 创建 */
#define sCSV_CreateFlagGroup(name) \
volatile u_##name##_ts name
/*
* 线程内存
*/
/* 创建线程内存池 */
#define sCSV_CreateMempool \
s_thrmem_ts u_thrmem = {NULL, NULL, 0}
#endif

172
System/sv_int_loc.c Normal file
View File

@@ -0,0 +1,172 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_int_loc.c
* @brief 中断本地服务(仅在用户中断中调用,并在本地执行)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#include "os_var.h"
#include "os_api.h"
#if SYSCFG_MCUCORE == 8051
#pragma NOAREGS
#endif
/*
* 二值信号量(获取)
*/
s_bool_t si_take_binary(s_bool_t _OBJ_MEM_ *bin)
{
if(*bin){
*bin = false;
return true;
}
return false;
}
/*
* 飞信(接收飞信)
*/
#if SYSCFG_FETION == __ENABLED__
m_fetion_t si_recv_fetion(m_fetion_t _OBJ_MEM_ *ft)
{
m_fetion_t fetion = *ft;
*ft = false;
return fetion;
}
#endif
/*
* 消息邮箱(接收邮件)
*/
#if SYSCFG_MAILBOX == __ENABLED__
#if SYSCFG_MCUCORE == 8051
s_bool_t si_can_read_gmbox(void _OBJ_MEM_ *gm)
{
if(s_sign_write_mbox_accessor
|| s_mbox_accessor == NULL || s_mbox_accessor->gm != gm){
return true;
}
return false;
}
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
s_bool_t si_can_read_lmbox(void)
{
if(!s_mbox_accessor->lf) return false;
s_mbox_accessor->lf = false;
return true;
}
void *si_get_lmbox(void)
{
return s_mbox_accessor->lm;
}
#endif
#else
s_bool_t si_recv_mail(void *lm, void *gm, size_t size, s_bool_t *gf) MCUCFG_251_REENTRANT
{
if(s_mbox_accessor == NULL || s_mbox_accessor->gm != gm){
if(*gf){
*gf = false;
s_memcpy(lm, gm, size);
return true;
}
return false;
}
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
else if(s_mbox_accessor->lf){
s_mbox_accessor->lf = false;
s_memcpy(lm, s_mbox_accessor->lm, size);
return true;
}
#endif
return false;
}
#endif
#endif
/*
* 消息队列(接收消息)
*/
#if SYSCFG_MSGQUEUE == __ENABLED__
#if SYSCFG_MCUCORE == 8051
s_bool_t si_can_access_msgqueue(s_msgqueue_tsp queue)
{
if(!queue->mutex) goto __RET_FALSE;
queue->mutex = false;
if(queue->type == __DYNAMIC__){
#if SYSCFG_DEBUGGING == __ENABLED__
s_fault.error_recvmsg_int = true;
#endif
goto __FREE_MUTEX;
}
if(!queue->counter) goto __FREE_MUTEX;
return true;
__FREE_MUTEX:
queue->mutex = true;
__RET_FALSE:
return false;
}
static void *_recv_msg_(s_bool_t _OBJ_MEM_ *mut, void *msg)
{
*mut = true;
return msg;
}
void *si_recv_msg(s_msgqueue_tsp queue)
{
void *msg;
sRecvMsg_Static(msg);
return _recv_msg_((s_bool_t *)&queue->mutex, msg);
}
#else
void *si_recv_msg(s_msgqueue_tsp queue)
{
void *msg = NULL;
if(!queue->mutex) return NULL;
queue->mutex = false;
if(queue->type == __DYNAMIC__){
#if SYSCFG_DEBUGGING == __ENABLED__
s_fault.error_recvmsg_int = true;
#endif
}
else if(!queue->counter);
else{
sRecvMsg_Static(msg);
}
queue->mutex = true;
return msg;
}
#endif
#endif

128
System/sv_int_loc.h Normal file
View File

@@ -0,0 +1,128 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_int_loc.h
* @brief 中断本地服务(仅在用户中断中调用,并在本地执行)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#ifndef __SV_INT_LOC_H
#define __SV_INT_LOC_H
s_bool_t si_take_binary(s_bool_t _OBJ_MEM_ *bin);
m_fetion_t si_recv_fetion(m_fetion_t _OBJ_MEM_ *ft);
#if SYSCFG_MCUCORE == 8051
s_bool_t si_can_read_gmbox(void _OBJ_MEM_ *gm);
s_bool_t si_can_read_lmbox(void);
void *si_get_lmbox(void);
s_bool_t si_can_access_msgqueue(s_msgqueue_tsp queue);
#else
s_bool_t si_recv_mail(void *lm, void *gm, size_t size, s_bool_t *gf) MCUCFG_251_REENTRANT;
#endif
void *si_recv_msg (s_msgqueue_tsp queue);
/*
* 二值信号量(获取)
*/
#define sISV_TakeBin(bin) \
si_take_binary((s_bool_t *)&bin)
/*
* 飞信(接收飞信)
*/
#define sISV_RecvFetion(tbox) \
( \
tbox ? si_recv_fetion((m_fetion_t *)&tbox) : false \
)
/*
* 消息邮箱(接收邮件)
*/
#if SYSCFG_MCUCORE == 8051
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
#define sISV_RecvMail(mail, mbox) \
( \
si_can_read_gmbox(&mbox) \
? mbox##_gnmf \
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
? mbox##_gnmf-- \
: mbox##_gnmf-- \
: false \
: false \
)
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
#define sISV_RecvMail(mail, mbox) \
( \
si_can_read_gmbox(&mbox) \
? mbox##_gnmf \
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
? mbox##_gnmf-- \
: mbox##_gnmf-- \
: false \
: si_can_read_lmbox() \
? s_memcpy(mail, si_get_lmbox(), sizeof(mbox)) || true \
? true \
: true \
: false \
)
#endif
#else
#define sISV_RecvMail(mail, mbox) \
si_recv_mail(mail, &mbox, sizeof(mbox), &mbox##_gnmf)
#endif
/*
* 消息队列(接收消息)
*/
#if SYSCFG_MCUCORE == 8051
#define sISV_RecvMsg(que) \
( \
si_can_access_msgqueue(que) ? si_recv_msg(que) : NULL \
)
#else
#define sISV_RecvMsg(que) \
si_recv_msg(que)
#endif
/*
* 事件标志组
*/
/* 查询标志组 */
#define sISV_QueryFlagGroup(group) \
( \
sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \
: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
: false \
)
/*
* 软件RTC
*/
/* 获取时间 */
#define sISV_GetTime(t) \
s_memcpy(t, !iWhichGVar_Read ? s_rtc[0] : s_rtc[1], sizeof(s_rtc[0]))
#endif

283
System/sv_int_pend.c Normal file
View File

@@ -0,0 +1,283 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_int_pend.c
* @brief 中断挂起服务 - 执行函数仅在PendSV中调用并执行
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#include "os_link.h"
/* 恢复任务 */
static void _resume_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL) return;
#endif
if(node->status & OS_STATUS_SUSPENDED){
node->status &= (~OS_STATUS_SUSPENDED & 0xFF);
if(!s_sign_scheduling){
if(node->status <= OS_STATUS_FLOATING && node->pri > s_task_current->pri){
s_sign_scheduling = true;
}
}
}
}
/* 挂起任务 */
static void _suspend_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL) return;
#endif
if(node->status < OS_STATUS_SUSPENDED){
node->status |= OS_STATUS_SUSPENDED;
if(!s_sign_scheduling){
if(node == s_task_current){
s_sign_scheduling = true;
}
}
}
}
/* 删除任务 */
static void _delete_task_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL) return;
#endif
if(node->status < OS_STATUS_DELETED){
node->status = OS_STATUS_DELETED;
if(!s_sign_scheduling){
if(node == s_task_current){
s_sign_scheduling = true;
}
}
}
}
/* 设置任务优先级 */
static void _set_taskpri_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_tasknode_tsp node = ((sp_taskpri_tsp)sv)->node;
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL) return;
#endif
if(node->status < OS_STATUS_STOPPED){
s_u8_t pri = ((sp_taskpri_tsp)sv)->pri;
if(node->pri != pri){
node->pri = pri;
sSetTaskPri(node);
if(!s_sign_scheduling){
if(pri > s_task_current->pri && node->status <= OS_STATUS_FLOATING){
s_sign_scheduling = true;
}
}
}
}
}
/* 设置阻塞(时间)*/
static void _set_block_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_tasknode_tsp node = ((sp_blocktime_tsp)sv)->node;
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL) return;
#endif
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
s_delay_loader[node->tid] = ((sp_blocktime_tsp)sv)->tick;
if(!((sp_blocktime_tsp)sv)->tick){
node->status = OS_STATUS_READY;
if(!s_sign_scheduling){
if(node->pri > s_task_current->pri){
s_sign_scheduling = true;
}
}
}
}
}
/* 清除阻塞(状态)*/
static void _clear_block_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_tasknode_tsp node = ((sp_task_tsp)sv)->node;
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL) return;
#endif
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
s_delay_loader[node->tid] = 0;
node->status = OS_STATUS_READY;
if(!s_sign_scheduling){
if(node->pri > s_task_current->pri){
s_sign_scheduling = true;
}
}
}
}
/* 定时中断 */
#if OS_TIMINTTOTAL
static void _timint_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_timint_loader[((sp_timint_tsp)sv)->tmid]
= s_timint_reload[((sp_timint_tsp)sv)->tmid]
= ((sp_timint_tsp)sv)->tick;
}
#else
#define _timint_ (s_voidvptr_tfp)NULL
#endif
/* 定时查询 */
#if OS_TIMQRYTOTAL
static void _timqry_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_timqry_loader[((sp_timqry_tsp)sv)->tmid]
= s_timqry_reload[((sp_timqry_tsp)sv)->tmid]
= ((sp_timqry_tsp)sv)->tick;
}
#else
#define _timqry_ (s_voidvptr_tfp)NULL
#endif
/* 上锁/给予二值信号量 */
#if SYSCFG_BINARY == __ENABLED__
static void _binary_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
*((sp_binary_tsp)sv)->bin = ((sp_binary_tsp)sv)->value;
}
#else
#define _binary_ (s_voidvptr_tfp)NULL
#endif
/* 给予计数信号量 */
#if SYSCFG_SEMAPHORE == __ENABLED__
static void _give_sem_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
if(((sp_sem_tsp)sv)->sem->counter < ((sp_sem_tsp)sv)->sem->maximum){
((sp_sem_tsp)sv)->sem->counter++;
}
}
#else
#define _give_sem_ (s_voidvptr_tfp)NULL
#endif
/* 全局变量写访问 */
static void _gvar_write_(void _OBJ_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);
}
/* 挂起服务调用 */
static void _pendsvc_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
(*((sp_pendsvc_tsp)sv)->fp)();
}
/* 发送飞信 */
#if SYSCFG_FETION == __ENABLED__
static void _send_fetion_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
*((sp_fetion_tsp)sv)->tbox = ((sp_fetion_tsp)sv)->fetion;
}
#else
#define _send_fetion_ (s_voidvptr_tfp)NULL
#endif
/* 发送邮件 */
#if SYSCFG_MAILBOX == __ENABLED__
static void _send_mail_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
si_mbox_tsp accessor = ((sp_mbox_tsp)sv)->accessor;
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
accessor->lf = true;
#endif
sWrite_MBoxAccessor((s_mbox_tsp)accessor);
s_memcpy(accessor->gm, accessor->lm, accessor->size);
sWrite_MBoxAccessor(NULL);
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
*accessor->gf = true;
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
*accessor->gf = accessor->lf;
#endif
}
#else
#define _send_mail_ (s_voidvptr_tfp)NULL
#endif
/* 发送消息 */
#if SYSCFG_MSGQUEUE == __ENABLED__
static void _send_msg_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
s_msgqueue_tsp queue = ((sp_msg_tsp)sv)->queue;
queue->mutex = false;
if(queue->counter == queue->len){
queue->mutex = true;
#if SYSCFG_DEBUGGING == __ENABLED__
s_alarm.overflow_msgqueue = true;
#endif
return;
}
if(queue->type == __DYNAMIC__){
s_msgnode_tsp node = NULL;
node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts));
if(node == NULL){
queue->mutex = true;
#if SYSCFG_DEBUGGING == __ENABLED__
s_fault.mallocfailed_msgnode = true;
#endif
return;
}
sSendMsg_Dynamic(((sp_msg_tsp)sv)->msg);
}
else{
sSendMsg_Static(((sp_msg_tsp)sv)->msg);
}
queue->mutex = true;
}
#else
#define _send_msg_ (s_voidvptr_tfp)NULL
#endif
/* 写标志组 */
#if SYSCFG_FLAGGROUP == __ENABLED__
static void _group_(void _OBJ_MEM_ *sv) MCUCFG_C51USING
{
switch(((sp_group_tsp)sv)->size){
case +1: *(s_u8_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break;
case +2: *(s_u16_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break;
case +4: *(s_u32_t *)((sp_group_tsp)sv)->group |= ((sp_group_tsp)sv)->value; break;
case -1: *(s_u8_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break;
case -2: *(s_u16_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break;
case -4: *(s_u32_t *)((sp_group_tsp)sv)->group &=~((sp_group_tsp)sv)->value; break;
}
}
#else
#define _group_ (s_voidvptr_tfp)NULL
#endif
typedef void (_CODE_MEM_ *s_voidvptr_tfp)(void _OBJ_MEM_ *);
void (_CODE_MEM_ * const _CONST_MEM_ sPendSV_Handler[OS_SVID_END])(void _OBJ_MEM_ *) =
{
_resume_task_,
_suspend_task_,
_delete_task_,
_set_taskpri_,
_set_block_,
_clear_block_,
_timint_,
_timqry_,
_binary_,
_give_sem_,
_gvar_write_,
_pendsvc_,
_send_fetion_,
_send_mail_,
_send_msg_,
_group_
};

232
System/sv_int_pend.h Normal file
View File

@@ -0,0 +1,232 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_int_pend.h
* @brief 中断挂起服务 - 调用宏(仅在用户中断中调用)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#ifndef __SV_INT_PEND_H
#define __SV_INT_PEND_H
/*
* 任务
*/
#if SYSCFG_TASKCREATEMODE == __STATIC__ \
|| SYSCFG_TASKCREATEMODE == __BALANCE__
#define sPSV_0x01(load) load
#define sPSV_0x02(load) do{}while(false)
#elif SYSCFG_TASKCREATEMODE == __DYNAMIC__
#define sPSV_0x01(load) NULL
#define sPSV_0x02(load) u_psv.node = load
#endif
/* 恢复任务 */
#define sPSV_ResumeTask(load) \
do{ \
static sp_task_ts u_psv = {OS_SVID_RESUMETASK, sPSV_0x01(load)}; \
sPSV_0x02(load); \
mPendSV_Load; \
}while(false)
/* 挂起任务 */
#define sPSV_SuspendTask(load) \
do{ \
static sp_task_ts u_psv = {OS_SVID_SUSPENDTASK, sPSV_0x01(load)}; \
sPSV_0x02(load); \
mPendSV_Load; \
}while(false)
/* 删除任务 */
#define sPSV_DeleteTask(load) \
do{ \
static sp_task_ts u_psv = {OS_SVID_DELETETASK, sPSV_0x01(load)}; \
sPSV_0x02(load); \
mPendSV_Load; \
}while(false)
/* 设置任务优先级 */
#define sPSV_SetTaskPri(load, pri) \
do{ \
static sp_taskpri_ts u_psv = {OS_SVID_SETTASKPRI, sPSV_0x01(load), pri}; \
sPSV_0x02(load); \
mPendSV_Load; \
}while(false)
/* 设置阻塞(时间)*/
#define sPSV_SetBlock(load, tc) \
do{ \
static sp_blocktime_ts u_psv = {OS_SVID_SETBLOCK, sPSV_0x01(load), tc}; \
sPSV_0x02(load); \
mPendSV_Load; \
}while(false)
/* 清除阻塞(状态)*/
#define sPSV_ClearBlock(load) \
do{ \
static sp_task_ts u_psv = {OS_SVID_CELARBLOCK, sPSV_0x01(load)}; \
sPSV_0x02(load); \
mPendSV_Load; \
}while(false)
/*
* 定时
*/
/* 定时中断 */
#define sPSV_TimInt(tmid, tc) \
do{ \
static sp_timint_ts u_psv = {OS_SVID_TIMINT, tmid, tc}; \
mPendSV_Load; \
}while(false)
/* 定时查询 */
#define sPSV_TimQry(tmid, tc) \
do{ \
static sp_timqry_ts u_psv = {OS_SVID_TIMQRY, tmid, tc}; \
mPendSV_Load; \
}while(false)
/*
* 二值信号量
*/
/* 上锁/给予 */
#define sPSV_WriteBin(bin, val) \
do{ \
static sp_binary_ts u_psv = {OS_SVID_BINARY, (bool *)&bin, val}; \
mPendSV_Load; \
}while(false)
/*
* 计数信号量
*/
/* 给予 */
#define sPSV_GiveSem(sem) \
do{ \
static sp_sem_ts u_psv = {OS_SVID_GIVESEM, &sem}; \
mPendSV_Load; \
}while(false)
/*
* 全局变量
*/
/* 全局变量写访问 */
#define sPSV_WriteGVar(gp, lp, size) \
do{ \
static sp_gvar_ts u_psv = {OS_SVID_GVARWRITE, gp, lp, size}; \
mPendSV_Load; \
}while(false)
/* 挂起服务调用 */
#define sPSV_PendSVC(fp) \
do{ \
static sp_pendsvc_ts u_psv = {OS_SVID_PENDSVC, fp}; \
mPendSV_Load; \
}while(false)
/*
* 飞信
*/
/* 发送飞信 */
#define sPSV_SendFetion(tbox, tion) \
do{ \
static sp_fetion_ts u_psv = {OS_SVID_SENDFETION, (m_fetion_t *)&tbox, 0}; \
u_psv.fetion = tion; \
mPendSV_Load; \
}while(false)
/*
* 消息邮箱
*/
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
#define sPSV_0x03
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
#define sPSV_0x03 false,
#endif
/* 发送邮件 */
#define sPSV_SendMail(mbox, mail) \
do{ \
static si_mbox_ts u_acc = {&mbox, mail, sPSV_0x03 &mbox##_gnmf, sizeof(mbox)}; \
static sp_mbox_ts u_psv = {OS_SVID_SENDMAIL, &u_acc}; \
mPendSV_Load; \
}while(false)
/*
* 消息队列
*/
/* 发送消息 */
#define sPSV_SendMsg(que, msg) \
do{ \
static sp_msg_ts u_psv = {OS_SVID_SENDMSG, que, msg}; \
mPendSV_Load; \
}while(false)
/*
* 事件标志组
*/
/* 清除标志组 */
#define sPSV_ClearFlagGroup(group) \
do{ \
static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&group, -sizeof(group), ~0}; \
mPendSV_Load; \
}while(false)
/* 写多标志位 */
#define sPSV_WriteFlagBits(group, sign, nbit) \
do{ \
static sp_group_ts u_psv = {OS_SVID_GROUP, (void *)&group, sign##sizeof(group), 0}; \
u_##group##_ts lv; \
miWriteFlagBits; \
sizeof(lv) == 1 ? *(s_u8_t *)&lv = false : OS_NOPx1; \
sizeof(lv) == 2 ? *(s_u16_t *)&lv = false : OS_NOPx1; \
sizeof(lv) == 4 ? *(s_u32_t *)&lv = false : OS_NOPx1; \
siWriteFlagBits_##nbit(
/*
* 软件RTC
*/
/* 设置时间 */
#define sPSV_SetTime(t) \
do{ \
iWriteGAry(s_rtc[0], t, sizeof(s_rtc[0])); \
iGiveBin(s_rtc_binary); \
}while(false)
#endif

789
System/sv_task.c Normal file

File diff suppressed because it is too large Load Diff

380
System/sv_task.h Normal file
View File

@@ -0,0 +1,380 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_task.h
* @brief 任务服务(仅在任务中调用)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#ifndef __SV_TASK_H
#define __SV_TASK_H
void su_enter_critical (void);
void su_exit_critical (void);
void su_task_scheduling(void);
void *su_return_voidptr (void *p);
s_ecode_t su_startup_task (s_taskhand_tsp hand, s_u8_t status);
s_ecode_t su_suspend_task (s_tasknode_tsp node);
s_ecode_t su_resume_task (s_tasknode_tsp node);
s_ecode_t su_resume_suspend (s_tasknode_tsp node);
s_ecode_t su_delete_task (s_tasknode_tsp node);
s_ecode_t su_set_taskpri (s_tasknode_tsp node, s_u8_t pri);
s_ecode_t su_set_block (s_tasknode_tsp node, s_delay_t tick);
s_ecode_t su_clear_block (s_tasknode_tsp node);
void su_delay (s_delay_t tick);
s_bool_t su_take_mutex (s_mutex_tsp mut, s_delay_t tick);
void su_back_mutex (s_mutex_tsp mut);
s_bool_t su_wait_binary (s_bool_t _OBJ_MEM_ *bin, s_delay_t tick);
s_bool_t su_take_binary (s_bool_t _OBJ_MEM_ *bin, s_delay_t tick);
s_bool_t su_take_semaphore (s_sem_tsp sem, s_delay_t tick);
void su_give_semaphore (s_sem_tsp sem);
m_fetion_t su_recv_fetion (m_fetion_t _OBJ_MEM_ *ft, s_delay_t tick);
s_bool_t su_recv_taskmsg (m_taskmsg_t _OBJ_MEM_ *nmf, s_delay_t tick);
s_bool_t su_recv_mail (s_bool_t _OBJ_MEM_ *gf, s_delay_t tick);
void su_send_mail (void _OBJ_MEM_ *gm, void *lm, size_t size, s_bool_t _OBJ_MEM_ *gf);
void *su_recv_msg (s_msgqueue_tsp queue, s_delay_t tick);
s_ecode_t su_send_msg (s_msgqueue_tsp queue, void *msg);
s_bool_t su_query_group (void _OBJ_MEM_ *p, s_u8_t size);
s_bool_t su_wait_group (void _OBJ_MEM_ *p, s_u8_t size, s_delay_t tick);
s_bool_t su_init_mempool (s_thrmem_tsp p, size_t size);
void _MALLOC_MEM_ *su_talloc (s_thrmem_tsp p, size_t size);
void _MALLOC_MEM_ *su_xalloc (void _MALLOC_MEM_ *p);
/*
* 任务
*/
/* 启动任务 */
#define sUSV_StartTask(hand, status) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_startup_task(hand, !status ? OS_STATUS_READY : OS_STATUS_SUSPENDED) : false \
)
/* 挂起任务 */
#define sUSV_SuspendTask(node) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_suspend_task(node) : false \
)
/* 恢复任务 */
#define sUSV_ResumeTask(node) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_resume_task(node) : false \
)
/* 恢复指定任务并挂起自身任务 */
#define sUSV_ResumeSuspend(node) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_resume_suspend(node) : false \
)
/* 删除任务 */
#define sUSV_DeleteTask(node) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_delete_task(node) : false \
)
/* 设置任务优先级 */
#define sUSV_SetTaskPri(node, pri) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_set_taskpri(node, pri) : false \
)
/* 设置阻塞(时间)*/
#define sUSV_SetBlock(node, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_set_block(node, tc) : false \
)
/* 清除阻塞(状态)*/
#define sUSV_ClearBlock(node) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_clear_block(node) : false \
)
/* 自身任务延时 */
#define sUSV_Delay(tc) \
do{ \
uEnterCritical; \
su_delay(tc); \
}while(false)
/*
* 定时
*/
/* 定时中断 */
#define sUSV_TimInt(tmid, tc) \
do{ \
uEnterCritical; \
s_timint_loader[tmid] = s_timint_reload[tmid] = tc; \
uExitCritical; \
}while(false)
/* 定时查询 */
#define sUSV_TimQry(tmid, tc) \
do{ \
uEnterCritical; \
s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc; \
uExitCritical; \
}while(false)
/*
* 互斥信号量
*/
/* 获取 */
#define sUSV_TakeMut(mut, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_take_mutex(&mut, tc) : false \
)
/* 归还 */
#define sUSV_BackMut(mut) \
do{ \
uEnterCritical; \
su_back_mutex(&mut); \
}while(false)
/*
* 二值信号量
*/
/* 等待 */
#define sUSV_WaitBin(bin, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_wait_binary((s_bool_t *)&bin, tc) : false \
)
/* 获取 */
#define sUSV_TakeBin(bin, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_take_binary((s_bool_t *)&bin, tc) : false \
)
/*
* 计数信号量
*/
/* 获取 */
#define sUSV_TakeSem(sem, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_take_semaphore(&sem, tc) : false \
)
/* 给予/归还 */
#define sUSV_GiveSem(sem) \
do{ \
uEnterCritical; \
su_give_semaphore(&sem); \
}while(false)
/*
* 飞信
*/
/* 接收飞信 */
#define sUSV_RecvFetion(tbox, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_recv_fetion((m_fetion_t *)&tbox, tc) : false \
)
/*
* 私信
*/
/* 接收私信 */
#define sUSV_RecvTaskMsg(tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true \
? su_recv_taskmsg(&m0_, tc) \
? s_memcpy(&m0 + 1, &m0_ + 1, MCUCFG_TASKMSG_SIZE) || true \
? (m_boolvoid_tf(su_exit_critical))() || true \
: (m_boolvoid_tf(su_exit_critical))() || true \
: false \
: false \
)
/* 发送私信 */
#define sUSV_SendTaskMsg(task) \
uEnterCritical; \
s_sign_send_taskmsg = true; \
MCUCFG_TASKMSG_PSP; \
task(MCUCFG_TASKMSG_VAL,
/*
* 消息邮箱
*/
/* 接收邮件 */
#define sUSV_RecvMail(mail, mbox, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true \
? su_recv_mail((s_bool_t *)&mbox##_gnmf, tc) \
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
? (m_boolvoid_tf(su_exit_critical))() || true \
: (m_boolvoid_tf(su_exit_critical))() || true \
: false \
: false \
)
/* 发送邮件 */
#define sUSV_SendMail(mbox, mail) \
do{ \
uEnterCritical; \
su_send_mail(&mbox, mail, sizeof(mbox), (s_bool_t *)&mbox##_gnmf); \
}while(false)
/*
* 消息队列
*/
/* 接收消息 */
#define sUSV_RecvMsg(que, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_recv_msg(que, tc) : NULL \
)
/* 发送消息 */
#define sUSV_SendMsg(que, msg) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_send_msg(que, msg) : false \
)
/*
* 事件标志组
*/
/* 查询标志组 */
#define sUSV_QueryFlagGroup(group) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_query_group((void *)&group, sizeof(group)) : false \
)
/* 等待标志组 */
#define sUSV_WaitFlagGroup(group, tc) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_wait_group((void *)&group, sizeof(group), tc) : false \
)
/* 清除标志组 */
#define sUSV_ClearFlagGroup(group) \
do{ \
uEnterCritical; \
sizeof(group) == 1 ? *(s_u8_t *)&group = false : OS_NOPx1; \
sizeof(group) == 2 ? *(s_u16_t *)&group = false : OS_NOPx1; \
sizeof(group) == 4 ? *(s_u32_t *)&group = false : OS_NOPx1; \
uExitCritical; \
}while(false)
/* 写标志位 */
#define sUSV_WriteFlagBit(group, bit, value) \
do{ \
uEnterCritical; \
group.bit = value; \
uExitCritical; \
}while(false)
/*
* 软件RTC
*/
/* 获取时间 */
#define sUSV_GetTime(t) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_return_voidptr(s_memcpy(t, s_rtc[0], sizeof(s_rtc[0]))) : NULL \
)
/* 设置时间 */
#define sUSV_SetTime(t) \
do{ \
uEnterCritical; \
s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \
uUpdateCopy_GVar(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \
uExitCritical; \
}while(false)
/*
* 进程内存
*/
/* malloc */
#define sUSV_Malloc(size) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_malloc(size)) : NULL \
)
/* calloc */
#define sUSV_Calloc(nmemb, size) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_calloc(nmemb, size)) : NULL \
)
/* realloc */
#define sUSV_Realloc(p, size) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(s_realloc(p, size)) : NULL \
)
/* free */
#define sUSV_Free(p) \
do{ \
uEnterCritical; \
s_free(p); \
uExitCritical; \
}while(false)
/*
* 线程内存
*/
/* 初始化线程内存池 */
#define sUSV_InitMempool(size) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_init_mempool(&u_thrmem, size) : false \
)
/* 线程内存分配 */
#define sUSV_Talloc(size) \
( \
(m_boolvoid_tf(su_enter_critical))() || true ? su_xalloc(su_talloc(&u_thrmem, size)) : NULL \
)
/* 释放线程内存池 */
#define sUSV_FreeMempool \
do{ \
sUSV_Free(u_thrmem.head); \
u_thrmem.head = u_thrmem.move = NULL; \
}while(false)
#endif

292
System/sv_tick.c Normal file
View File

@@ -0,0 +1,292 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_tick.c
* @brief 滴答服务(仅在滴答钩子、定时中断钩子、定时查询钩子中调用)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#include "os_var.h"
#include "os_api.h"
/*
* 任务
*/
/* 挂起任务 */
s_ecode_t st_suspend_task(s_tasknode_tsp node) MCUCFG_C51USING
{
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL){
return OS_ECODE_TASKNOTSTARTED;
}
#endif
if(node->status < OS_STATUS_SUSPENDED){
node->status |= OS_STATUS_SUSPENDED;
return OS_ECODE_NOERROR;
}
if(node->status & OS_STATUS_SUSPENDED){
return OS_ECODE_TASKSUSPENDED;
}
if(node->status & OS_STATUS_STOPPED){
return OS_ECODE_TASKSTOPPED;
}
if(node->status == OS_STATUS_DELETED){
return OS_ECODE_TASKNOTSTARTED;
}
else{
return OS_ECODE_DONOTKNOW;
}
}
/* 恢复任务 */
s_ecode_t st_resume_task(s_tasknode_tsp node) MCUCFG_C51USING
{
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL){
return OS_ECODE_TASKNOTSTARTED;
}
#endif
if(node->status & OS_STATUS_SUSPENDED){
node->status &= (~OS_STATUS_SUSPENDED & 0xFF);
return OS_ECODE_NOERROR;
}
if(node->status < OS_STATUS_STOPPED){
return OS_ECODE_TASKNOTSUSPENDED;
}
if(node->status & OS_STATUS_STOPPED){
return OS_ECODE_TASKSTOPPED;
}
if(node->status == OS_STATUS_DELETED){
return OS_ECODE_TASKNOTSTARTED;
}
else{
return OS_ECODE_DONOTKNOW;
}
}
/* 删除任务 */
s_ecode_t st_delete_task(s_tasknode_tsp node) MCUCFG_C51USING
{
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL){
return OS_ECODE_TASKNOTSTARTED;
}
#endif
if(node->status < OS_STATUS_DELETED){
node->status = OS_STATUS_DELETED;
return OS_ECODE_NOERROR;
}
if(node->status == OS_STATUS_DELETED){
return OS_ECODE_TASKNOTSTARTED;
}
else{
return OS_ECODE_DONOTKNOW;
}
}
/* 设置任务优先级 */
s_ecode_t st_set_taskpri(s_tasknode_tsp node, s_u8_t pri) MCUCFG_C51USING
{
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL){
return OS_ECODE_TASKNOTSTARTED;
}
#endif
if(node->status < OS_STATUS_STOPPED){
if(node->pri != pri){
node->pri = pri;
sSetTaskPri(node);
return OS_ECODE_NOERROR;
}
else{
return OS_ECODE_TASKPRIUNCHANGED;
}
}
if(node->status & OS_STATUS_STOPPED){
return OS_ECODE_TASKSTOPPED;
}
if(node->status == OS_STATUS_DELETED){
return OS_ECODE_TASKNOTSTARTED;
}
else{
return OS_ECODE_DONOTKNOW;
}
}
/* 设置阻塞(时间)*/
s_ecode_t st_set_block(s_tasknode_tsp node, s_delay_t tick) MCUCFG_C51USING
{
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL){
return OS_ECODE_TASKNOTSTARTED;
}
#endif
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
s_delay_loader[node->tid] = tick;
if(!tick){
node->status = OS_STATUS_READY;
}
return OS_ECODE_NOERROR;
}
return OS_ECODE_TASKNOTBLOCKED;
}
/* 清除阻塞(状态)*/
s_ecode_t st_clear_block(s_tasknode_tsp node) MCUCFG_C51USING
{
#if SYSCFG_TASKCREATEMODE == __DYNAMIC__
if(node == NULL){
return OS_ECODE_TASKNOTSTARTED;
}
#endif
if(node->status == OS_STATUS_BLOCKED || node->status == OS_STATUS_FLOATING){
s_delay_loader[node->tid] = 0;
node->status = OS_STATUS_READY;
return OS_ECODE_NOERROR;
}
return OS_ECODE_TASKNOTBLOCKED;
}
/*
* 二值信号量
*/
/* 获取 */
s_bool_t st_take_binary(s_bool_t _OBJ_MEM_ *bin) MCUCFG_C51USING
{
if(*bin){
*bin = false;
return true;
}
return false;
}
/*
* 计数信号量
*/
#if SYSCFG_SEMAPHORE == __ENABLED__
/* 获取 */
s_bool_t st_take_semaphore(s_sem_tsp sem) MCUCFG_C51USING
{
if(sem->counter){
(sem->counter)--;
return true;
}
return false;
}
/* 给予/归还 */
void st_give_semaphore(s_sem_tsp sem) MCUCFG_C51USING
{
if(sem->counter < sem->maximum){
sem->counter++;
}
}
#endif
/*
* 飞信
*/
#if SYSCFG_FETION == __ENABLED__
/* 接收飞信 */
m_fetion_t st_recv_fetion(m_fetion_t _OBJ_MEM_ *ft) MCUCFG_C51USING
{
m_fetion_t fetion = *ft;
*ft = false;
return fetion;
}
#endif
/*
* 消息邮箱
*/
#if SYSCFG_MAILBOX == __ENABLED__
/* 发送邮件 */
void st_send_mail(void _OBJ_MEM_ *gm, void *lm, size_t size, s_bool_t _OBJ_MEM_ *gf) MCUCFG_C51USING
{
static s_mbox_ts accessor;
accessor.gm = gm;
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 1
accessor.lm = lm;
accessor.lf = true;
#endif
sWrite_MBoxAccessor(&accessor);
s_memcpy(gm, lm, size);
sWrite_MBoxAccessor(NULL);
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
*gf = true;
#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
*gf = accessor.lf;
#endif
}
#endif
/*
* 消息队列
*/
#if SYSCFG_MSGQUEUE == __ENABLED__
/* 接收消息 */
void *st_recv_msg(s_msgqueue_tsp queue) MCUCFG_C51USING
{
void *msg = NULL;
s_msgnode_tsp node;
queue->mutex = false;
if(!queue->counter);
else if(queue->type == __DYNAMIC__){
sRecvMsg_Dynamic(msg);
}
else{
sRecvMsg_Static(msg);
}
queue->mutex = true;
return msg;
}
/* 发送消息 */
s_ecode_t st_send_msg(s_msgqueue_tsp queue, void *msg) MCUCFG_C51USING
{
queue->mutex = false;
if(queue->counter == queue->len){
queue->mutex = true;
#if SYSCFG_DEBUGGING == __ENABLED__
s_alarm.overflow_msgqueue = true;
#endif
return OS_ECODE_OVERFLOW_MSGQUEUE;
}
if(queue->type == __DYNAMIC__){
s_msgnode_tsp node = NULL;
node = (s_msgnode_tsp)s_malloc(sizeof(s_msgnode_ts));
if(node == NULL){
queue->mutex = true;
#if SYSCFG_DEBUGGING == __ENABLED__
s_fault.mallocfailed_msgnode = true;
#endif
return OS_ECODE_MALLOCFAIL_MSGNODE;
}
sSendMsg_Dynamic(msg);
}
else{
sSendMsg_Static(msg);
}
queue->mutex = true;
return OS_ECODE_NOERROR;
}
#endif

195
System/sv_tick.h Normal file
View File

@@ -0,0 +1,195 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file sv_tick.h
* @brief 滴答服务(仅在滴答钩子、定时中断钩子、定时查询钩子中调用)
* @author 迟凯峰
* @version V1.2.0
* @date 2023.11.25
******************************************************************************/
#ifndef __SV_TICK_H
#define __SV_TICK_H
s_ecode_t st_suspend_task (s_tasknode_tsp node);
s_ecode_t st_resume_task (s_tasknode_tsp node);
s_ecode_t st_delete_task (s_tasknode_tsp node);
s_ecode_t st_set_taskpri (s_tasknode_tsp node, s_u8_t pri);
s_ecode_t st_set_block (s_tasknode_tsp node, s_delay_t tick);
s_ecode_t st_clear_block (s_tasknode_tsp node);
s_bool_t st_take_binary (s_bool_t _OBJ_MEM_ *bin);
s_bool_t st_take_semaphore (s_sem_tsp sem);
void st_give_semaphore (s_sem_tsp sem);
m_fetion_t st_recv_fetion (m_fetion_t _OBJ_MEM_ *ft);
void st_send_mail (void _OBJ_MEM_ *gm, void *lm, size_t size, s_bool_t _OBJ_MEM_ *gf);
void *st_recv_msg (s_msgqueue_tsp queue);
s_ecode_t st_send_msg (s_msgqueue_tsp queue, void *msg);
/*
* 任务
*/
/* 挂起指定任务 */
#define sTSV_SuspendTask(node) \
st_suspend_task(node)
/* 恢复指定任务 */
#define sTSV_ResumeTask(node) \
st_resume_task(node)
/* 删除指定任务 */
#define sTSV_DeleteTask(node) \
st_delete_task(node)
/* 设置任务优先级 */
#define sTSV_SetTaskPri(node, tpl) \
st_set_taskpri(node, tpl)
/* 设置阻塞(时间)*/
#define sTSV_SetBlock(node, tc) \
st_set_block(node, tc)
/* 清除阻塞(状态)*/
#define sTSV_ClearBlock(node) \
st_clear_block(node)
/*
* 定时
*/
/* 定时中断 */
#define sTSV_TimInt(tmid, tc) \
s_timint_loader[tmid] = s_timint_reload[tmid] = tc
/* 定时查询 */
#define sTSV_TimQry(tmid, tc) \
s_timqry_loader[tmid] = s_timqry_reload[tmid] = tc
/*
* 二值信号量
*/
/* 获取 */
#define sTSV_TakeBin(bin) \
st_take_binary((s_bool_t *)&bin)
/*
* 计数信号量
*/
/* 获取 */
#define sTSV_TakeSem(sem) \
st_take_semaphore(&sem)
/* 给予/归还 */
#define sTSV_GiveSem(sem) \
st_give_semaphore(&sem)
/*
* 飞信
*/
/* 接收飞信 */
#define sTSV_RecvFetion(tbox) \
( \
tbox ? st_recv_fetion((m_fetion_t *)&tbox) : false \
)
/*
* 私信
*/
/* 发送私信 */
#define sTSV_SendTaskMsg(task) \
s_sign_send_taskmsg = true; \
MCUCFG_TASKMSG_PSP; \
task(MCUCFG_TASKMSG_VAL,
/*
* 消息邮箱
*/
/* 接收邮件 */
#define sTSV_RecvMail(mail, mbox) \
( \
mbox##_gnmf \
? s_memcpy(mail, &mbox, sizeof(mbox)) || true \
? mbox##_gnmf-- \
: mbox##_gnmf-- \
: false \
)
/* 发送邮件 */
#define sTSV_SendMail(mbox, mail) \
st_send_mail(&mbox, mail, sizeof(mbox), (s_bool_t *)&mbox##_gnmf)
/*
* 消息队列
*/
/* 接收消息 */
#define sTSV_RecvMsg(que) \
st_recv_msg(que)
/* 发送消息 */
#define sTSV_SendMsg(que, msg) \
st_send_msg(que, msg)
/*
* 事件标志组
*/
/* 查询标志组 */
#define sTSV_QueryFlagGroup(group) \
( \
sizeof(group) == 1 ? *(s_u8_t *)&group ? true : false \
: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
: false \
)
/* 清除标志组 */
#define sTSV_ClearFlagGroup(group) \
do{ \
sizeof(group) == 1 ? *(s_u8_t *)&group = false : OS_NOPx1; \
sizeof(group) == 2 ? *(s_u16_t *)&group = false : OS_NOPx1; \
sizeof(group) == 4 ? *(s_u32_t *)&group = false : OS_NOPx1; \
}while(false)
/*
* 软件RTC
*/
/* 获取时间 */
#define sTSV_GetTime(t) \
s_memcpy(t, s_rtc[0], sizeof(s_rtc[0]))
/* 设置时间 */
#define sTSV_SetTime(t) \
do{ \
s_memcpy(s_rtc[0], t, sizeof(s_rtc[0])); \
tUpdateCopy_GVar(s_memcpy(s_rtc[1], s_rtc[0], sizeof(s_rtc[0]))); \
}while(false)
#endif

676
System/ur_api.h Normal file

File diff suppressed because it is too large Load Diff