update CosyOS-内核文件.

Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
This commit is contained in:
零中断延迟的RTOS
2025-01-06 14:41:49 +00:00
committed by Gitee
parent 16c790afb5
commit 665141d92c
15 changed files with 3896 additions and 0 deletions

169
System/os_api.c Normal file
View File

@@ -0,0 +1,169 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_api.c
* @brief 内核服务公共函数
* @details 在服务层临界区中,由内核服务调用。
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#include "os_var.h"
#if SYSCFG_MCUCORE == 8051
#pragma NOAREGS /* 相对寄存器访问 for C51 */
#endif
/**
\brief 任务优先级切换
\details 如果该任务的优先级高于当前任务的优先级,立即切换任务。
\param[in] htask 任务句柄
\return 无
\note 直接关联服务(非滴答中):切换任务、恢复指定任务并挂起自身任务、设置阻塞(时间)、清除阻塞(状态)。
*/
void s_switch_taskpri(s_tasknode_tsp htask)
{
if(htask->pri > s_task_current->pri){
if(s_task_switch == OS_NULL){
s_task_switch = htask;
s_sign_schedule = true;
}
else if(htask->pri > s_task_switch->pri){
s_task_switch = htask;
s_sign_switch_prigroup = false;
}
else if(htask->pri == s_task_switch->pri){
s_sign_switch_prigroup = true;
}
}
}
/**
\brief 非空切换
\details 当任务非空时,实行任务优先级切换。
\param[in] htask 任务句柄
\return 无
\note 关联服务(非滴答中):给予/归还二值信号量、给予/归还计数信号量、发送飞信、发送邮件、发送消息。
*/
void s_switch_notnull(s_tasknode_tsp htask)
{
if(htask != OS_NULL){
s_switch_taskpri(htask);
}
}
/**
\brief 就绪切换
\details 当任务状态为就绪时,实行任务优先级切换。
\param[in] htask 任务句柄
\return 无
\note 关联服务(非滴答中):恢复任务。
*/
void s_switch_ready(s_tasknode_tsp htask)
{
if(htask->status == OS_STATUS_READY){
s_switch_taskpri(htask);
}
}
#if SYSCFG_TASKMSG == __ENABLED__
/**
\brief 私信切换
\details 当任务阻塞类型为接收私信阻塞时,实行任务优先级切换。
\param[in] htask 任务句柄
\return 无
\note 关联服务(非滴答中):发送私信。
*/
void s_switch_taskmsg(s_tasknode_tsp htask)
{
if(htask->blocktype & OS_BLOCKED_TASKMSG){
s_switch_taskpri(htask);
}
}
#endif
/**
\brief 移除 from 任务队列
\details 从任务队列中移除任务节点。
\param[in] htask 任务句柄
\return 移除的是否为队列尾节点?[truefalse不是]
*/
bool s_remove_taskque(s_tasknode_tsp htask)
{
s_u8_t pri = htask->pri;
s_tasknode_tsp node_tail = s_taskque_head[pri]->last;
if(s_taskque_head[pri] == node_tail){
s_taskque_head[pri] = OS_NULL;
return true;
}
else{
htask->last->next = htask->next;
htask->next->last = htask->last;
if(htask == node_tail){
return true;
}
else if(htask == s_taskque_head[pri]){
s_taskque_head[pri] = htask->next;
}
return false;
}
}
/**
\brief 插入 to 任务队列
\details 插入任务节点至任务队列尾。
\param[in] htask 任务句柄
\return 无
*/
void s_insert_taskque(s_tasknode_tsp htask)
{
s_u8_t pri = htask->pri;
if(s_taskque_head[pri] == OS_NULL){
s_taskque_head[pri] = htask->last = htask->next = htask;
}
else{
htask->last = s_taskque_head[pri]->last;
htask->next = s_taskque_head[pri];
s_taskque_head[pri]->last->next = htask;
s_taskque_head[pri]->last = htask;
}
}
/**
\brief 设置任务优先级
\details 从任务队列中移除该任务并重新加入队列。
\param[in] htask 任务句柄
\return 无
\note 关联服务:设置任务优先级、获取互斥信号量、归还互斥信号量。
*/
void s_set_taskpri(s_tasknode_tsp htask)
{
s_remove_taskque(htask);
s_insert_taskque(htask);
s_sign_schedule_all = true;
}
#if SYSCFG_GETRTC_INT == __ENABLED__
/**
\brief 更新RTC副本
\param 无
\return 无
*/
void s_update_rtccopy(void)
{
s_sign_updatecopy = true;
#if SYSCFG_MCUCORE == 8051
s_rtc_copy.yeah = s_rtc.yeah;
s_rtc_copy.year = s_rtc.year;
s_rtc_copy.month = s_rtc.month;
s_rtc_copy.date = s_rtc.date;
s_rtc_copy.hour = s_rtc.hour;
s_rtc_copy.minute = s_rtc.minute;
s_rtc_copy.second = s_rtc.second;
s_rtc_copy.day = s_rtc.day;
#else
s_rtc_copy = s_rtc;
#endif
s_sign_updatecopy = false;
}
#endif

473
System/os_api.h Normal file
View File

@@ -0,0 +1,473 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_api.h
* @brief 系统内核专用API
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#ifndef __OS_API_H
#define __OS_API_H
void s_switch_taskpri(s_tasknode_tsp htask);
void s_switch_taskmsg(s_tasknode_tsp htask);
void s_switch_notnull(s_tasknode_tsp htask);
void s_switch_ready (s_tasknode_tsp htask);
bool s_remove_taskque(s_tasknode_tsp htask);
void s_insert_taskque(s_tasknode_tsp htask);
void s_set_taskpri (s_tasknode_tsp htask);
void s_update_rtccopy(void);
/*
* 引用.标准库函数
*/
#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((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand, OS_NULL, OS_STATUS_SUSPENDED)
/** 启动定时查询任务 */
#define sStartTask_TimQry(tmid) \
sUSV_StartTask((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand, OS_NULL, OS_STATUS_SUSPENDED)
/** 恢复定时中断任务 */
#define sResumeTask_TimInt(tmid) \
sTSV_ResumeTask(*((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand)->dualhandle)
/** 恢复定时查询任务 */
#define sResumeTask_TimQry(tmid) \
sTSV_ResumeTask(*((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand)->dualhandle)
/** 调用定时中断钩子 */
#define sCallHook_TimInt(tmid) \
(*(s_voidvoid_tfp)s_timint_handle[tmid]->hookorhand)()
/** 调用定时查询钩子 */
#define sCallHook_TimQry(tmid) \
(*(s_voidvoid_tfp)s_timqry_handle[tmid]->hookorhand)()
/*
* 更新.全局变量副本
*/
#define sUpdateCopy(code) \
do{ \
s_sign_updatecopy = true; \
code; \
s_sign_updatecopy = false; \
}while(false)
/*
* 私信 - 创建信箱
*/
#define m0__ MCUCFG_TASKMSG_VAR
#if MCUCFG_TASKMSG_TYPE == 0
#define __dm static
#define sTaskMsg_Init \
if(s_sign_send_taskmsg){ \
s_sign_send_taskmsg = false; \
if(s_kernellock_counter){ \
su_kernel_unlock(); \
} \
return; \
} \
else{ \
m0_ = false; \
}
#define sCreateTaskMsg_0 \
(void) \
{ \
do
#define sCreateTaskMsg_1(m1) \
(m0__, m1##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_2(m1, m2) \
(m0__, m1##_, m2##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_3(m1, m2, m3) \
(m0__, m1##_, m2##_, m3##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_4(m1, m2, m3, m4) \
(m0__, m1##_, m2##_, m3##_, m4##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_5(m1, m2, m3, m4, m5) \
(m0__, m1##_, m2##_, m3##_, m4##_, m5##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_6(m1, m2, m3, m4, m5, m6) \
(m0__, m1##_, m2##_, m3##_, m4##_, m5##_, m6##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_7(m1, m2, m3, m4, m5, m6, m7) \
(m0__, m1##_, m2##_, m3##_, m4##_, m5##_, m6##_, m7##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_8(m1, m2, m3, m4, m5, m6, m7, m8) \
(m0__, m1##_, m2##_, m3##_, m4##_, m5##_, m6##_, m7##_, m8##_) \
{ \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; __dm m8; \
__dm m_taskmsg_t mx; \
sTaskMsg_Init; \
do
#elif MCUCFG_TASKMSG_TYPE == 1
#define __dm __align(4) static
#define sTaskMsg_Init \
if(s_sign_send_taskmsg){ \
register s_u32_t *p; \
register s_u8_t size; \
m0_ = true; \
p = &m0_ + 1; \
size = &m0 - &m0_ - 1; \
do{ \
*p++ = *m_taskmsg_psp++; \
}while(--size); \
s_sign_send_taskmsg = false; \
if(s_taskcri_counter){ \
uExitCritical; \
} \
return; \
}
#define sCreateTaskMsg_0 \
(void) \
{ \
do
#define sCreateTaskMsg_1(m1) \
(m0__, m1##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; \
__dm m_taskmsg_t m0; \
__dm m1; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_2(m1, m2) \
(m0__, m1##__, m2##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_3(m1, m2, m3) \
(m0__, m1##__, m2##__, m3##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; __dm m3##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_4(m1, m2, m3, m4) \
(m0__, m1##__, m2##__, m3##__, m4##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_5(m1, m2, m3, m4, m5) \
(m0__, m1##__, m2##__, m3##__, m4##__, m5##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_6(m1, m2, m3, m4, m5, m6) \
(m0__, m1##__, m2##__, m3##__, m4##__, m5##__, m6##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; __dm m6##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_7(m1, m2, m3, m4, m5, m6, m7) \
(m0__, m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; __dm m6##_; __dm m7##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; \
sTaskMsg_Init; \
do
#define sCreateTaskMsg_8(m1, m2, m3, m4, m5, m6, m7, m8) \
(m0__, m1##__, m2##__, m3##__, m4##__, m5##__, m6##__, m7##__, m8##__) \
{ \
__dm m_taskmsg_t m0_ = false; \
__dm m1##_; __dm m2##_; __dm m3##_; __dm m4##_; __dm m5##_; __dm m6##_; __dm m7##_; __dm m8##_; \
__dm m_taskmsg_t m0; \
__dm m1; __dm m2; __dm m3; __dm m4; __dm m5; __dm m6; __dm m7; __dm m8; \
sTaskMsg_Init; \
do
#endif
/*
* 事件标志组 - 写标志位
*/
#define siWriteFlagBits \
u_psv.value = ( \
sizeof(lv) == 1 ? *(s_u8_t *)&lv \
: sizeof(lv) == 2 ? *(s_u16_t *)&lv \
: sizeof(lv) == 4 ? *(s_u32_t *)&lv \
: 0 \
); \
} \
mPendSV_FIFOLoad; \
}while(false)
#define siWriteFlagBits_1(bit1) \
lv.bit1 = true; \
siWriteFlagBits
#define siWriteFlagBits_2(bit1, bit2) \
lv.bit1 = lv.bit2 = true; \
siWriteFlagBits
#define siWriteFlagBits_3(bit1, bit2, bit3) \
lv.bit1 = lv.bit2 = lv.bit3 = true; \
siWriteFlagBits
#define siWriteFlagBits_4(bit1, bit2, bit3, bit4) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = true; \
siWriteFlagBits
#define siWriteFlagBits_5(bit1, bit2, bit3, bit4, bit5) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = true; \
siWriteFlagBits
#define siWriteFlagBits_6(bit1, bit2, bit3, bit4, bit5, bit6) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = true; \
siWriteFlagBits
#define siWriteFlagBits_7(bit1, bit2, bit3, bit4, bit5, bit6, bit7) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = true; \
siWriteFlagBits
#define siWriteFlagBits_8(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
siWriteFlagBits
#define siWriteFlagBits_9(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = true; \
siWriteFlagBits
#define siWriteFlagBits_10(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = true; \
siWriteFlagBits
#define siWriteFlagBits_11(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = lv.bit11 = true; \
siWriteFlagBits
#define siWriteFlagBits_12(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = true; \
siWriteFlagBits
#define siWriteFlagBits_13(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = true; \
siWriteFlagBits
#define siWriteFlagBits_14(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = lv.bit14 = true; \
siWriteFlagBits
#define siWriteFlagBits_15(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14, bit15) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = lv.bit14 = lv.bit15 = true; \
siWriteFlagBits
#define siWriteFlagBits_16(bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9, bit10, bit11, bit12, bit13, bit14, bit15, bit16) \
lv.bit1 = lv.bit2 = lv.bit3 = lv.bit4 = lv.bit5 = lv.bit6 = lv.bit7 = lv.bit8 = true; \
lv.bit9 = lv.bit10 = lv.bit11 = lv.bit12 = lv.bit13 = lv.bit14 = lv.bit15 = lv.bit16 = true; \
siWriteFlagBits
/*
* 消息队列
*/
/** 动态队列 - 发送消息 */
#define sSendMsg_Dynamic(p) \
do{ \
hmsg->msg = p; \
hmsg->next = OS_NULL; \
hmsg->last = ((sd_queue_tsp)hque)->tail; \
if(((sd_queue_tsp)hque)->tail != OS_NULL){ \
((sd_queue_tsp)hque)->tail->next = hmsg; \
} \
((sd_queue_tsp)hque)->tail = hmsg; \
if(((sd_queue_tsp)hque)->head == OS_NULL){ \
((sd_queue_tsp)hque)->head = hmsg; \
} \
hque->counter++; \
}while(false)
/** 动态队列 - 接收消息 */
#define sRecvMsg_Dynamic(p) \
do{ \
if(hque->mode == __QUE_LIFO__){ \
hmsg = ((sd_queue_tsp)hque)->tail; \
p = hmsg->msg; \
hmsg = hmsg->last; \
s_free(((sd_queue_tsp)hque)->tail); \
((sd_queue_tsp)hque)->tail = hmsg; \
if(hmsg == OS_NULL){ \
((sd_queue_tsp)hque)->head = OS_NULL; \
} \
else{ \
hmsg->next = OS_NULL; \
} \
} \
else{ \
hmsg = ((sd_queue_tsp)hque)->head; \
p = hmsg->msg; \
hmsg = hmsg->next; \
s_free(((sd_queue_tsp)hque)->head); \
((sd_queue_tsp)hque)->head = hmsg; \
if(hmsg == OS_NULL){ \
((sd_queue_tsp)hque)->tail = OS_NULL; \
} \
else{ \
hmsg->last = OS_NULL; \
} \
} \
hque->counter--; \
}while(false)
/** 静态队列 - 发送消息 */
#define sSendMsg_Static(p) \
do{ \
if(((ss_queue_tsp)hque)->tail < ((ss_queue_tsp)hque)->base + hque->len - 1){ \
((ss_queue_tsp)hque)->tail++; \
} \
else{ \
((ss_queue_tsp)hque)->tail = ((ss_queue_tsp)hque)->base; \
} \
*((ss_queue_tsp)hque)->tail = p; \
hque->counter++; \
}while(false)
/** 静态队列 - 接收消息 */
#define sRecvMsg_Static(p) \
do{ \
if(hque->mode == __QUE_LIFO__){ \
p = *((ss_queue_tsp)hque)->tail; \
if(((ss_queue_tsp)hque)->tail > ((ss_queue_tsp)hque)->base){ \
((ss_queue_tsp)hque)->tail--; \
} \
else{ \
((ss_queue_tsp)hque)->tail = ((ss_queue_tsp)hque)->base + hque->len - 1; \
} \
} \
else{ \
p = *((ss_queue_tsp)hque)->head; \
if(((ss_queue_tsp)hque)->head < ((ss_queue_tsp)hque)->base + hque->len - 1){ \
((ss_queue_tsp)hque)->head++; \
} \
else{ \
((ss_queue_tsp)hque)->head = ((ss_queue_tsp)hque)->base; \
} \
} \
hque->counter--; \
}while(false)
#endif

22
System/os_base.h Normal file
View File

@@ -0,0 +1,22 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_base.h
* @brief 基本数据类型定义
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#ifndef __OS_BASE_H
#define __OS_BASE_H
typedef char s_s8_t;
typedef short s_s16_t;
typedef long s_s32_t;
typedef unsigned char s_u8_t;
typedef unsigned short s_u16_t;
typedef unsigned long s_u32_t;
#endif

113
System/os_debug.c Normal file
View File

@@ -0,0 +1,113 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_debug.c
* @brief DEBUG接口
* @details DEBUG接口串口发送和接收解析。
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#include "os_link.h"
#if SYSCFG_DEBUGGING == __ENABLED__
#if MCUCFG_ISA != __ARM__
/**
\brief 字符串转整型
\param[in] str 字符串指针
\return 转换后的整型数据
\note Keil C51/C251 标准库中的 atoi() 是非线程安全的,故额外定义此函数,
专用于DEBUG接口的串口接收解析。
*/
static int _atoi_(const char* str)
{
if(str == OS_NULL || !*str){
return 0;
}
else{
int a = 0;
int k = 1;
s_u8_t i = s_strlen(str);
while(i--){
if(str[i] >= '0' && str[i] <= '9'){
a += (str[i] - '0') * k;
k *= 10;
}
else if(str[i] == '+'){
return a;
}
else if(str[i] == '-'){
return -a;
}
else{
return 0;
}
}
return a;
}
}
#else
#define _atoi_ atoi
#endif
/**
\brief 接收解析
\details DEBUG接口串口接收解析。
\param 无
\return 无
*/
static void _debug_recv_(void)
{
#define hptr s_debug_recvbuff
s_u16_t temp;
char strtmp[8];
char _XDATA_MEM_ *mptr = hptr;
char _XDATA_MEM_ *tptr = hptr + s_strlen(hptr) - 2;
if(!s_strcmp(tptr, "\r\n")){
if(!s_strcmp(hptr, "taskmgr\r\n")){
s_sign_taskmgr = true;
}
else if(!s_strcmp(hptr, "exit\r\n")){
s_sign_taskmgr = false;
}
else if(!s_memcmp(hptr, "taskmgr /s=", 11)){
mptr += 11;
s_memcpy(strtmp, mptr, tptr - mptr);
strtmp[tptr - mptr] = '\0';
temp = _atoi_(strtmp);
if(temp >= 50 && temp <= 5000){
mSysIRQ_Disable;
s_timqry_handle[OS_TMID_TASKMGR]->reload = (1000UL * temp) / SYSCFG_SYSTICKCYCLE;
mSysIRQ_Enable;
}
}
}
}
uCreateTask_TimInt
(
OS_TMID_DEBUGGER, false,
Debugger, SYSCFG_TASKPRIORITY - 2, MCUCFG_STACKSIZE_DEBUGGER, 0, 0
)
{
s_debug_recvptr[0] = '\0';
_debug_recv_();
s_debug_recvptr = s_debug_recvbuff;
uSuspendTasking;
uEndTasking;
}
uCreateHook_TimQry(OS_TMID_DEBUGHOOK, s_debug_sendtype, false, debug_hook)
{
if(s_debug_sendtype & OS_DEBUG_SEND_TASKMGR){
s_debug_sendtype &= ~OS_DEBUG_SEND_TASKMGR;
s_debug_sendptr = s_taskmgr_sendbuff;
}/*
else if(s_debug_sendtype & OS_DEBUG_SEND_CMDLINE){
s_debug_sendtype &= ~OS_DEBUG_SEND_CMDLINE;
s_debug_sendptr = s_cmdline_sendbuff;
}*/
SYSCFG_DEBUGSEND;
}
#endif

136
System/os_def.h Normal file
View File

@@ -0,0 +1,136 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_def.h
* @brief 初始宏定义
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#ifndef __OS_DEF_H
#define __OS_DEF_H
#define OS_NULL 0
#define false 0
#define true 1
/*
* CONFIG VALUE
*/
#define __DISABLED__ 0
#define __ENABLED__ 1
#define __MSP__ 0 /*!< 任务栈模式MSP模式 .. */
#define __PSP__ 1 /*!< 任务栈模式PSP模式 .. */
#define __INTELLIGENT__ 0 /*!< 私信创建模式:智能创建 */
#define __PERFORMANCE__ 1 /*!< 私信创建模式:性能创建 */
#define __STATIC__ 0 /*!< 静态队列 ............. */
#define __DYNAMIC__ 1 /*!< 动态队列 ............. */
#define __QUE_FIFO__ 0 /*!< 先入先出队列 ......... */
#define __QUE_LIFO__ 1 /*!< 后入先出队列 ......... */
#define __MCS_51__ 0 /*!< 指令集架构MCS51 .... */
#define __MCS_251__ 1 /*!< 指令集架构MCS251 ... */
#define __ARM__ 2 /*!< 指令集架构ARM ...... */
#define __COOPERATIVE__ 1 /*!< 协作式调度............ */
#define __TIMESHARING__ 2 /*!< 时间片轮转调度........ */
/*
* 任务相关
*/
#define OS_TASKQUEUELEN_MAX 255 /*!< 任务队列最大长度 ......... */
/* 任务状态 */
#define OS_STATUS_READY 0x00 /*!< 就绪/运行状态 ............ */
#define OS_STATUS_BLOCKED 0x02 /*!< 阻塞状态 ................. */
#define OS_STATUS_OVERTIME 0x04 /*!< 超时状态 ................. */
#define OS_STATUS_SUSPENDED 0x08 /*!< 挂起状态 ................. */
#define OS_STATUS_STOPPED 0x10 /*!< 停止状态 ................. */
#define OS_STATUS_STOPPED_TSOF 0x30 /*!< 任务栈溢出停止 ........... */
#define OS_STATUS_STOPPED_TSRF 0x50 /*!< 任务栈重分配失败停止 ..... */
#define OS_STATUS_DELETED 0x80 /*!< 已删除/未启动状态 ........ */
/* 阻塞类型 */
#define OS_BLOCKED_DELAY 0x00 /*!< 延时阻塞 ................. */
#define OS_BLOCKED_BINARY 0x10 /*!< 二值信号量阻塞(获取/等待)*/
#define OS_BLOCKED_MUTEX 0x20 /*!< 互斥信号量阻塞(获取).... */
#define OS_BLOCKED_SEMAPHORE 0x30 /*!< 计数信号量阻塞(获取).... */
#define OS_BLOCKED_FLAGGROUP 0x40 /*!< 事件标志组阻塞(等待).... */
#define OS_BLOCKED_TASKMSG 0x50 /*!< 接收私信阻塞 ............. */
#define OS_BLOCKED_FETION 0x60 /*!< 接收飞信阻塞 ............. */
#define OS_BLOCKED_MAIL 0x70 /*!< 接收邮件阻塞 ............. */
#define OS_BLOCKED_MSG 0x80 /*!< 接收消息阻塞 ............. */
/*
* DEBUG SEND TYPE
*/
#define OS_DEBUG_SEND_CMDLINE 0x01 /*!< 命令行发送 ... */
#define OS_DEBUG_SEND_TASKMGR 0x02 /*!< 任务管理器发送 */
/*
* TASKMGR LEN
*/
#define OS_TASKMGR_LEN_PRI 6
#define OS_TASKMGR_LEN_STA 6
#define OS_TASKMGR_LEN_CPU 9
/*
* SVID服务ID中断挂起服务_FIFO 系统专用ID
*/
#define OS_SVID_CLEARDELAY 0x00
#define OS_SVID_SWITCHTASK 0x01
#define OS_SVID_RESUMETASK 0x02
#define OS_SVID_SUSPENDTASK 0x03
#define OS_SVID_DELETETASK 0x04
#define OS_SVID_SETTASKPRI 0x05
#define OS_SVID_SETBLOCK 0x06
#define OS_SVID_CLEARBLOCK 0x07
#define OS_SVID_TIMINT 0x08
#define OS_SVID_TIMQRY 0x09
#define OS_SVID_BINARY 0x0A
#define OS_SVID_GIVESEM 0x0B
#define OS_SVID_SENDFETION 0x0C
#define OS_SVID_SENDMAIL 0x0D
#define OS_SVID_SENDMSG 0x0E
#define OS_SVID_GROUP 0x0F
#define OS_SVID_GVARWRITE 0x10
#define OS_SVID_PENDSVC 0x11
#define OS_SVID_SENDSIGN 0x12
#define OS_SVID_END 0x13
/*
* ECODE错误码
*/
#define OS_ECODE_NOERROR 0 /*!< 无错误 ............. */
#define OS_ECODE_OVERFLOW_MSGQUEUE 1 /*!< 消息队列溢出 ....... */
#define OS_ECODE_OVERFLOW_TASKQUEUE 2 /*!< 任务队列溢出 ....... */
#define OS_ECODE_OVERFLOW_TASKSTACK 3 /*!< 任务栈溢出 ......... */
#define OS_ECODE_MALLOCFAIL_MSGNODE 4 /*!< 消息节点内存分配失败 */
#define OS_ECODE_MALLOCFAIL_TASKNODE 5 /*!< 任务节点内存分配失败 */
#define OS_ECODE_MALLOCFAIL_TASKSTACK 6 /*!< 任务栈内存分配失败 . */
#define OS_ECODE_TASKSUSPENDED 7 /*!< 任务已挂起 ......... */
#define OS_ECODE_TASKSTOPPED 8 /*!< 任务已停止 ......... */
#define OS_ECODE_TASKNOTSTARTED 9 /*!< 任务未启动/已删除 .. */
#define OS_ECODE_TASKNOTREADY 10 /*!< 任务未就绪 ......... */
#define OS_ECODE_TASKNOTBLOCKED 11 /*!< 任务未阻塞 ......... */
#define OS_ECODE_TASKNOTSUSPENDED 12 /*!< 任务未挂起 ......... */
#define OS_ECODE_TASKPRIUNCHANGED 13 /*!< 任务优先级未改变 ... */
#define OS_ECODE_DONOTKNOW 255 /*!< 未知错误 ........... */
#endif

670
System/os_handler.c Normal file

File diff suppressed because it is too large Load Diff

33
System/os_hook.h Normal file
View File

@@ -0,0 +1,33 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_hook.h
* @brief 系统钩子函数声明
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#ifndef __OS_HOOK_H
#define __OS_HOOK_H
/* 初始化钩子 */
void init_hook(void);
/* 启动钩子 */
void start_hook(void);
/* 空闲钩子 */
void idle_hook(void);
/* 滴答钩子 */
void tick_hook(void);
/* 挂起服务钩子 */
void pendsv_hook(void);
/* 副本钩子 */
void copy_hook(void);
#endif

29
System/os_link.h Normal file
View File

@@ -0,0 +1,29 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_link.h
* @brief 系统链接头文件
* @details 用户的各个c文件中应包含此文件。
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#ifndef __OS_LINK_H
#define __OS_LINK_H
#include "os_var.h"
#include "os_api.h"
#include "sv_create.h"
#include "sv_task.h"
#include "sv_tick.h"
#include "sv_int_loc.h"
#include "sv_int_pend_fifo.h"
#include "sv_int_pend_flag.h"
#include "ur_api.h"
#include "ur_eapi.h"
#include "os_task.h"
#include "os_hook.h"
#endif

37
System/os_main.c Normal file
View File

@@ -0,0 +1,37 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_main.c
* @brief 主函数
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#include "os_link.h"
/**
\brief 主函数
\param 无
\return 无
\note CosyOS 的主函数是系统托管的,如非必要不建议用户擅自调整及修改。
可在 init_hook 中进行前期的初始化工作,而后在 start_hook 中
启动用户任务。
*/
int main(void)
{
void s_init_timing(void);
#if SYSCFG_SAFERUNTIME == __ENABLED__
s_tid_t i;
for(i = 0; i < OS_TASKTOTAL + 1; i++){
s_sign_timeout[i] = 0;
}
#endif
#if OS_TIMINTTOTAL || OS_TIMQRYTOTAL
s_init_timing();
#endif
init_hook();
mSys_INIT;
uStartTask(Starter, OS_STATUS_READY);
uStartTask(Sysidle, OS_STATUS_READY);
while(true);
}

713
System/os_redef.h Normal file

File diff suppressed because it is too large Load Diff

40
System/os_starter.c Normal file
View File

@@ -0,0 +1,40 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_starter.c
* @brief 启动任务Starter
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#include "os_link.h"
sCat2Str
(
SYSCFG_STARTERCREATE,
CreateTask(Starter, SYSCFG_TASKPRIORITY - 2, MCUCFG_STACKSIZE_STARTER, 0, 0)
)
{
#if OS_TIMINTTOTAL || OS_TIMQRYTOTAL
s_u8_t i;
#if OS_TIMQRYTOTAL
i = OS_TIMQRYTOTAL;
while(i--){
if(s_timqry_handle[i]->hookortask){
sStartTask_TimQry(i);
}
}
#endif
#if OS_TIMINTTOTAL
i = OS_TIMINTTOTAL;
while(i--){
if(s_timint_handle[i]->hookortask){
sStartTask_TimInt(i);
}
}
#endif
#endif
start_hook();
uDeleteTasking;
uEndTasking;
}

39
System/os_sysidle.c Normal file
View File

@@ -0,0 +1,39 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_sysidle.c
* @brief 系统空闲任务Sysidle
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#include "os_link.h"
uCreateTask(Sysidle, 0, MCUCFG_STACKSIZE_SYSIDLE, 0, 0)
{
#if SYSCFG_SAFERUNTIME == __ENABLED__
if(true){
s_tid_t i;
for(i = 1; i < OS_TASKTOTAL + 1; i++){
s_sign_timeout[i] = 0;
}
}
#endif
#if SYSCFG_SOFTRTC == __ENABLED__
if(true){
static s_u8_t _SYS_MEM_ year = 0xFF;
if(year != s_rtc.year){
year = s_rtc.year;
s_month2day = year ? ((year & 3) ? 28 : 29) : ((s_rtc.yeah & 3) ? 28 : 29);
}
}
#endif
#if SYSCFG_IDLEHOOK == __ENABLED__
idle_hook();
#endif
#if SYSCFG_LOWPOWERMODE == __ENABLED__
mSys_Idle;
#endif
OS_NOPx2;
uEndTasking;
}

27
System/os_task.h Normal file
View File

@@ -0,0 +1,27 @@
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_task.h
* @brief 系统任务声明
* @author 迟凯峰
* @version V3.4.0
* @date 2025.01.06
******************************************************************************/
#ifndef __OS_TASK_H
#define __OS_TASK_H
/* 任务管理器 */
uExternTask(Taskmgr);
/* 调试任务 */
uExternTask(Debugger);
/* 启动任务 */
sCat2Str(SYSCFG_STARTERCREATE, ExternTask(Starter));
/* 系统空闲任务 */
uExternTask(Sysidle);
#endif

572
System/os_taskmgr.c Normal file

File diff suppressed because it is too large Load Diff

823
System/os_timing.c Normal file

File diff suppressed because it is too large Load Diff