mirror of
https://gitee.com/cosyos/cosyos.git
synced 2026-02-06 03:41:41 +08:00
58
System/os_api.c
Normal file
58
System/os_api.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_api.c
|
||||
* @brief 系统内核专用API
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_var.h"
|
||||
|
||||
#if SYSCFG_MCUCORE == 8051
|
||||
#pragma NOAREGS
|
||||
#endif
|
||||
|
||||
void s_schedule_taskpri(s_tasknode_tsp node)
|
||||
{
|
||||
if(node->pri > s_task_current->pri){
|
||||
if(s_task_switch == OS_NULL || node->pri > s_task_switch->pri){
|
||||
s_task_switch = node;
|
||||
}
|
||||
s_sign_schedule = true;
|
||||
}
|
||||
}
|
||||
|
||||
void s_schedule_taskmsg(s_tasknode_tsp node)
|
||||
{
|
||||
if(node->blocktype & OS_BLOCKED_TASKMSG){
|
||||
s_schedule_taskpri(node);
|
||||
}
|
||||
}
|
||||
|
||||
void s_schedule_notnull(s_tasknode_tsp node)
|
||||
{
|
||||
if(node != OS_NULL){
|
||||
s_schedule_taskpri(node);
|
||||
}
|
||||
}
|
||||
|
||||
void s_schedule_ready(s_tasknode_tsp node)
|
||||
{
|
||||
if(node->status == OS_STATUS_READY){
|
||||
s_schedule_taskpri(node);
|
||||
}
|
||||
}
|
||||
|
||||
void s_set_taskpri(s_tasknode_tsp node)
|
||||
{
|
||||
node->last->next = node->next;
|
||||
node->next->last = node->last;
|
||||
node->next = node->last = OS_NULL;
|
||||
if(s_taskpri_tail != OS_NULL){
|
||||
s_taskpri_tail->next = node;
|
||||
node->last = s_taskpri_tail;
|
||||
}
|
||||
s_taskpri_tail = node;
|
||||
s_sign_schedule_all = true;
|
||||
}
|
||||
462
System/os_api.h
Normal file
462
System/os_api.h
Normal file
@@ -0,0 +1,462 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_api.h
|
||||
* @brief 系统内核专用API
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OS_API_H
|
||||
#define __OS_API_H
|
||||
|
||||
void s_schedule_taskpri(s_tasknode_tsp node);
|
||||
void s_schedule_taskmsg(s_tasknode_tsp node);
|
||||
void s_schedule_notnull(s_tasknode_tsp node);
|
||||
void s_schedule_ready (s_tasknode_tsp node);
|
||||
void s_set_taskpri (s_tasknode_tsp node);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 标准库
|
||||
*/
|
||||
|
||||
#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_STATUS_SUSPENDED)
|
||||
|
||||
/* 启动定时查询任务 */
|
||||
#define sStartTask_TimQry(tmid) \
|
||||
sUSV_StartTask((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand, OS_STATUS_SUSPENDED)
|
||||
|
||||
/* 恢复定时中断任务 */
|
||||
#define sResumeTask_TimInt(tmid) \
|
||||
sTSV_ResumeTask(*((s_taskhand_tsp)s_timint_handle[tmid]->hookorhand)->handle)
|
||||
|
||||
/* 恢复定时查询任务 */
|
||||
#define sResumeTask_TimQry(tmid) \
|
||||
sTSV_ResumeTask(*((s_taskhand_tsp)s_timqry_handle[tmid]->hookorhand)->handle)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 更新全局变量副本
|
||||
*/
|
||||
|
||||
#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_taskcri_counter){ \
|
||||
uExitCritical; \
|
||||
} \
|
||||
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_Load; \
|
||||
}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{ \
|
||||
node->msg = p; \
|
||||
node->next = OS_NULL; \
|
||||
node->last = ((sd_queue_tsp)queue)->tail; \
|
||||
if(((sd_queue_tsp)queue)->tail != OS_NULL){ \
|
||||
((sd_queue_tsp)queue)->tail->next = node; \
|
||||
} \
|
||||
((sd_queue_tsp)queue)->tail = node; \
|
||||
if(((sd_queue_tsp)queue)->head == OS_NULL){ \
|
||||
((sd_queue_tsp)queue)->head = node; \
|
||||
} \
|
||||
queue->counter++; \
|
||||
}while(false)
|
||||
|
||||
/* 动态队列 - 接收消息 */
|
||||
#define sRecvMsg_Dynamic(p) \
|
||||
do{ \
|
||||
if(queue->mode == __MSGQUE_LIFO__){ \
|
||||
node = ((sd_queue_tsp)queue)->tail; \
|
||||
p = node->msg; \
|
||||
node = node->last; \
|
||||
s_free(((sd_queue_tsp)queue)->tail); \
|
||||
((sd_queue_tsp)queue)->tail = node; \
|
||||
if(node == OS_NULL){ \
|
||||
((sd_queue_tsp)queue)->head = OS_NULL; \
|
||||
} \
|
||||
else{ \
|
||||
node->next = OS_NULL; \
|
||||
} \
|
||||
} \
|
||||
else{ \
|
||||
node = ((sd_queue_tsp)queue)->head; \
|
||||
p = node->msg; \
|
||||
node = node->next; \
|
||||
s_free(((sd_queue_tsp)queue)->head); \
|
||||
((sd_queue_tsp)queue)->head = node; \
|
||||
if(node == OS_NULL){ \
|
||||
((sd_queue_tsp)queue)->tail = OS_NULL; \
|
||||
} \
|
||||
else{ \
|
||||
node->last = OS_NULL; \
|
||||
} \
|
||||
} \
|
||||
queue->counter--; \
|
||||
}while(false)
|
||||
|
||||
/* 静态队列 - 发送消息 */
|
||||
#define sSendMsg_Static(p) \
|
||||
do{ \
|
||||
if(((ss_queue_tsp)queue)->tail < ((ss_queue_tsp)queue)->base + queue->len - 1){ \
|
||||
((ss_queue_tsp)queue)->tail++; \
|
||||
} \
|
||||
else{ \
|
||||
((ss_queue_tsp)queue)->tail = ((ss_queue_tsp)queue)->base; \
|
||||
} \
|
||||
*((ss_queue_tsp)queue)->tail = p; \
|
||||
queue->counter++; \
|
||||
}while(false)
|
||||
|
||||
/* 静态队列 - 接收消息 */
|
||||
#define sRecvMsg_Static(p) \
|
||||
do{ \
|
||||
if(queue->mode == __MSGQUE_LIFO__){ \
|
||||
p = *((ss_queue_tsp)queue)->tail; \
|
||||
if(((ss_queue_tsp)queue)->tail > ((ss_queue_tsp)queue)->base){ \
|
||||
((ss_queue_tsp)queue)->tail--; \
|
||||
} \
|
||||
else{ \
|
||||
((ss_queue_tsp)queue)->tail = ((ss_queue_tsp)queue)->base + queue->len - 1; \
|
||||
} \
|
||||
} \
|
||||
else{ \
|
||||
p = *((ss_queue_tsp)queue)->head; \
|
||||
if(((ss_queue_tsp)queue)->head < ((ss_queue_tsp)queue)->base + queue->len - 1){ \
|
||||
((ss_queue_tsp)queue)->head++; \
|
||||
} \
|
||||
else{ \
|
||||
((ss_queue_tsp)queue)->head = ((ss_queue_tsp)queue)->base; \
|
||||
} \
|
||||
} \
|
||||
queue->counter--; \
|
||||
}while(false)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
23
System/os_base.h
Normal file
23
System/os_base.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_base.h
|
||||
* @brief 基本数据类型定义
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#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;
|
||||
typedef s_u8_t s_bool_t;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
96
System/os_debug.c
Normal file
96
System/os_debug.c
Normal file
@@ -0,0 +1,96 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_debug.c
|
||||
* @brief DEBUG接口(串口发送和接收解析)
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
|
||||
#if MCUCFG_ISA != __ARM__
|
||||
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
|
||||
|
||||
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_reload[OS_TMID_TASKMGR] = (1000UL * temp) / SYSCFG_SYSTICKCYCLE;
|
||||
mSysIRQ_Enable;
|
||||
}
|
||||
}
|
||||
}
|
||||
#undef hptr
|
||||
}
|
||||
|
||||
uCreateTask_TimInt(OS_TMID_DEBUGGER, false, Debugger, SYSCFG_TASKPRIORITY - 1, 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
136
System/os_def.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_def.h
|
||||
* @brief 初始宏定义
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#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 __STATIC__ 0
|
||||
#define __DYNAMIC__ 2
|
||||
#define __MSP__ 0
|
||||
#define __PSP__ 1
|
||||
#define __STCLK__ 0
|
||||
#define __FCLK__ 1
|
||||
#define __STANDARD__ 0
|
||||
#define __INTELLIGENT__ 0
|
||||
#define __PERFORMANCE__ 1
|
||||
#define __MSGQUE_FIFO__ 0
|
||||
#define __MSGQUE_LIFO__ 1
|
||||
#define __MCS_51__ 0
|
||||
#define __MCS_251__ 1
|
||||
#define __ARM__ 2
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 任务相关
|
||||
*/
|
||||
|
||||
#define OS_TASKQUEUELEN_MAX 255 // 任务队列最大长度
|
||||
|
||||
/* 任务状态 */
|
||||
#define OS_STATUS_READY 0x00 // 就绪
|
||||
#define OS_STATUS_FLOATING 0x01 // 浮动
|
||||
#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,中断挂起服务系统专用ID)
|
||||
*/
|
||||
|
||||
#define OS_SVID_RESUMETASK 0x00
|
||||
#define OS_SVID_SUSPENDTASK 0x01
|
||||
#define OS_SVID_DELETETASK 0x02
|
||||
#define OS_SVID_SETTASKPRI 0x03
|
||||
#define OS_SVID_SETBLOCK 0x04
|
||||
#define OS_SVID_CELARBLOCK 0x05
|
||||
#define OS_SVID_TIMINT 0x06
|
||||
#define OS_SVID_TIMQRY 0x07
|
||||
#define OS_SVID_BINARY 0x08
|
||||
#define OS_SVID_GIVESEM 0x09
|
||||
#define OS_SVID_SENDFETION 0x0A
|
||||
#define OS_SVID_SENDMAIL 0x0B
|
||||
#define OS_SVID_SENDMSG 0x0C
|
||||
#define OS_SVID_GROUP 0x0D
|
||||
#define OS_SVID_GVARWRITE 0x0E
|
||||
#define OS_SVID_PENDSVC 0x0F
|
||||
#define OS_SVID_SENDSIGN 0x10
|
||||
#define OS_SVID_END 0x11
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
897
System/os_handler.c
Normal file
897
System/os_handler.c
Normal file
File diff suppressed because it is too large
Load Diff
33
System/os_hook.h
Normal file
33
System/os_hook.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_hook.h
|
||||
* @brief 系统钩子函数声明
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OS_HOOK_H
|
||||
#define __OS_HOOK_H
|
||||
|
||||
/* 初始化钩子 */
|
||||
void init_hook(void);
|
||||
|
||||
/* 启动钩子 */
|
||||
void start_hook(void);
|
||||
|
||||
/* 滴答钩子 */
|
||||
void tick_hook(void);
|
||||
|
||||
/* 空闲钩子 */
|
||||
void idle_hook(void);
|
||||
|
||||
/* 挂起服务钩子 */
|
||||
void pendsv_hook(void);
|
||||
|
||||
/* 全局变量钩子 */
|
||||
void gvar_hook(void);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
26
System/os_link.h
Normal file
26
System/os_link.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_link.h
|
||||
* @brief 系统链接头文件(用户的各个c文件中应包含此文件)
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#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.h"
|
||||
#include "ur_api.h"
|
||||
#include "os_task.h"
|
||||
#include "os_hook.h"
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
32
System/os_main.c
Normal file
32
System/os_main.c
Normal file
@@ -0,0 +1,32 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_main.c
|
||||
* @brief 主函数
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
|
||||
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;
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
sStartTask_TimQry(OS_TMID_TASKMGR);
|
||||
#endif
|
||||
uStartTask(Starter, OS_STATUS_READY);
|
||||
uStartTask(Sysidle, OS_STATUS_READY);
|
||||
while(true);
|
||||
}
|
||||
638
System/os_redef.h
Normal file
638
System/os_redef.h
Normal file
File diff suppressed because it is too large
Load Diff
36
System/os_starter.c
Normal file
36
System/os_starter.c
Normal file
@@ -0,0 +1,36 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_starter.c
|
||||
* @brief 启动任务(Starter)
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
|
||||
dCreateTask(Starter, SYSCFG_TASKPRIORITY - 2, MCUCFG_STACKSIZE_STARTER, 0, 0)
|
||||
{
|
||||
#if OS_TIMINTTOTAL || OS_TIMQRYTOTAL
|
||||
s_u8_t i;
|
||||
#if OS_TIMINTTOTAL
|
||||
i = OS_TIMINTTOTAL;
|
||||
while(i--){
|
||||
if(s_timint_hookortask[i]){
|
||||
sStartTask_TimInt(i);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if OS_TIMQRYTOTAL
|
||||
i = OS_TIMQRYTOTAL - 1;
|
||||
while(i--){
|
||||
if(s_timqry_hookortask[i]){
|
||||
sStartTask_TimQry(i);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
start_hook();
|
||||
uDeleteTasking;
|
||||
uEndTasking;
|
||||
}
|
||||
36
System/os_sysidle.c
Normal file
36
System/os_sysidle.c
Normal file
@@ -0,0 +1,36 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_sysidle.c
|
||||
* @brief 系统空闲任务(Sysidle)
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#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 year = 0xFF;
|
||||
if(year != s_rtc[0][0]){
|
||||
year = s_rtc[0][0];
|
||||
s_month2day = year ? ((year & 3) ? 28 : 29) : ((sDefCentury & 3) ? 28 : 29);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if SYSCFG_IDLEHOOK == __ENABLED__
|
||||
idle_hook();
|
||||
#endif
|
||||
mSys_Idle;
|
||||
uEndTasking;
|
||||
}
|
||||
27
System/os_task.h
Normal file
27
System/os_task.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_task.h
|
||||
* @brief 系统任务声明
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OS_TASK_H
|
||||
#define __OS_TASK_H
|
||||
|
||||
/* 任务管理器 */
|
||||
uExternTask(Taskmgr);
|
||||
|
||||
/* 调试任务 */
|
||||
uExternTask(Debugger);
|
||||
|
||||
/* 启动任务 */
|
||||
dExternTask(Starter);
|
||||
|
||||
/* 系统空闲任务 */
|
||||
uExternTask(Sysidle);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
410
System/os_taskmgr.c
Normal file
410
System/os_taskmgr.c
Normal file
@@ -0,0 +1,410 @@
|
||||
/**************************************************************************//**
|
||||
* @item CosyOS-II Kernel
|
||||
* @file os_taskmgr.c
|
||||
* @brief 任务管理器(Taskmgr)
|
||||
* @author 迟凯峰
|
||||
* @version V2.2.0
|
||||
* @date 2024.04.15
|
||||
******************************************************************************/
|
||||
|
||||
#include "os_link.h"
|
||||
#if SYSCFG_DEBUGGING == __ENABLED__
|
||||
|
||||
#define _STR_MEM_ _OBJ_MEM_
|
||||
static char _STR_MEM_ str[8];
|
||||
static char _XDATA_MEM_ * _SYS_MEM_ mptr;
|
||||
|
||||
#define _chrcpy_(c) *mptr++ = c
|
||||
|
||||
static void _spccpy_(s_u8_t n)
|
||||
{
|
||||
do{
|
||||
*mptr++ = ' ';
|
||||
}while(--n);
|
||||
}
|
||||
|
||||
static void _strcpy_(const char *sub)
|
||||
{
|
||||
while(*sub){
|
||||
*mptr++ = *sub++;
|
||||
}
|
||||
}
|
||||
|
||||
static s_u8_t _strlen_(const char *src)
|
||||
{
|
||||
s_u8_t i = 0;
|
||||
while(*src++){
|
||||
i++;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static void _u8str_(const s_u8_t var)
|
||||
{
|
||||
char _STR_MEM_ *ptr = str;
|
||||
if(var >= 100){
|
||||
*ptr++ = var / 100 + '0';
|
||||
goto Lable_2;
|
||||
}
|
||||
if(var >= 10){
|
||||
*ptr++ = var / 10 + '0';
|
||||
goto Lable_1;
|
||||
}
|
||||
else{
|
||||
*ptr++ = var /**/+ '0';
|
||||
goto Lable_0;
|
||||
}
|
||||
Lable_2: *ptr++ = (var % 100) / 10 + '0';
|
||||
Lable_1: *ptr++ = (var % 10) /**/+ '0';
|
||||
Lable_0: *ptr = '\0';
|
||||
}
|
||||
|
||||
static void _u16str_(const s_u16_t var)
|
||||
{
|
||||
char _STR_MEM_ *ptr = str;
|
||||
if(var >= 10000){
|
||||
*ptr++ = var / 10000 + '0';
|
||||
goto Lable_4;
|
||||
}
|
||||
if(var >= 1000){
|
||||
*ptr++ = var / 1000 + '0';
|
||||
goto Lable_3;
|
||||
}
|
||||
if(var >= 100){
|
||||
*ptr++ = var / 100 + '0';
|
||||
goto Lable_2;
|
||||
}
|
||||
if(var >= 10){
|
||||
*ptr++ = var / 10 + '0';
|
||||
goto Lable_1;
|
||||
}
|
||||
else{
|
||||
*ptr++ = var /**/+ '0';
|
||||
goto Lable_0;
|
||||
}
|
||||
Lable_4: *ptr++ = (var % 10000) / 1000 + '0';
|
||||
Lable_3: *ptr++ = (var % 1000) / 100 + '0';
|
||||
Lable_2: *ptr++ = (var % 100) / 10 + '0';
|
||||
Lable_1: *ptr++ = (var % 10) /**/+ '0';
|
||||
Lable_0: *ptr = '\0';
|
||||
}
|
||||
|
||||
static s_u8_t _u16len_(const s_u16_t var)
|
||||
{
|
||||
if(var >= 10000) return 5;
|
||||
if(var >= 1000) return 4;
|
||||
if(var >= 100) return 3;
|
||||
if(var >= 10) return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void _used_ratio_(const s_u16_t permill)
|
||||
{
|
||||
s_u8_t i;
|
||||
if(!permill){
|
||||
str[0] = '0';
|
||||
str[1] = '\0';
|
||||
i = 2;
|
||||
}
|
||||
else{
|
||||
_u16str_(permill);
|
||||
i = _strlen_(str);
|
||||
if(i > 2){
|
||||
str[i-0] = str[i-1];
|
||||
str[i-1] = str[i-2];
|
||||
str[i-2] = '.';
|
||||
str[i+1] = '\0';
|
||||
i += 2;
|
||||
}
|
||||
else{
|
||||
if(i == 1){
|
||||
str[2] = '0';
|
||||
str[3] = str[0];
|
||||
}
|
||||
else{
|
||||
str[2] = str[0];
|
||||
str[3] = str[1];
|
||||
}
|
||||
str[0] = '0';
|
||||
str[1] = '.';
|
||||
str[4] = '\0';
|
||||
i = 5;
|
||||
}
|
||||
}
|
||||
_spccpy_((s_u8_t)(OS_TASKMGR_LEN_CPU - i));
|
||||
_strcpy_(str);
|
||||
_chrcpy_('%');
|
||||
}
|
||||
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
static void _u8str16_(const s_u8_t var)
|
||||
{
|
||||
str[0] = (var >> 4) + '0';
|
||||
str[1] = (var & 0x0F) + '0';
|
||||
if(str[0] > '9') str[0] += 0x07;
|
||||
if(str[1] > '9') str[1] += 0x07;
|
||||
*mptr++ = str[0];
|
||||
*mptr++ = str[1];
|
||||
}
|
||||
#endif
|
||||
|
||||
uCreateTask_TimQry(OS_TMID_TASKMGR, s_sign_taskmgr, true, Taskmgr, SYSCFG_TASKPRIORITY - 1, MCUCFG_STACKSIZE_TASKMGR, 0, 0)
|
||||
{
|
||||
static char _XDATA_MEM_ *p[2];
|
||||
mptr = s_taskmgr_sendbuff;
|
||||
/* Title1 */
|
||||
_strcpy_("CosyOS-II Taskmgr");
|
||||
_spccpy_(
|
||||
SYSCFG_TASKNAMELEN_MAX
|
||||
+ OS_TASKMGR_LEN_TID + OS_TASKMGR_LEN_PRI
|
||||
+ OS_TASKMGR_LEN_STA
|
||||
- 17 /* Title1 Len */
|
||||
);
|
||||
p[0] = mptr;
|
||||
_spccpy_(OS_TASKMGR_LEN_CPU + OS_TASKMGR_LEN_RAM);
|
||||
_strcpy_("\r\n");
|
||||
/* Title2 */
|
||||
_strcpy_("Name");
|
||||
_spccpy_(SYSCFG_TASKNAMELEN_MAX - 4);
|
||||
_spccpy_(OS_TASKMGR_LEN_TID - 3);
|
||||
_strcpy_("TID");
|
||||
_spccpy_(OS_TASKMGR_LEN_PRI - 3);
|
||||
_strcpy_("PRI");
|
||||
_spccpy_(OS_TASKMGR_LEN_STA - 3);
|
||||
_strcpy_("STA");
|
||||
_spccpy_(OS_TASKMGR_LEN_CPU - 3);
|
||||
_strcpy_("CPU");
|
||||
_spccpy_(OS_TASKMGR_LEN_RAM - 3);
|
||||
_strcpy_("RAM\r\n");
|
||||
/* NULL Line */
|
||||
_strcpy_("\r\n");
|
||||
/* - */
|
||||
p[1] = mptr;
|
||||
while(true){
|
||||
static s_timqry_t upspeed = (1000UL * SYSCFG_TASKMGRUPSPEED) / SYSCFG_SYSTICKCYCLE;
|
||||
static s_tasknode_ts node_temp;
|
||||
s_tasknode_tsp node_curr = u_taskhandle_Taskmgr;
|
||||
s_u16_t permill1 = 10000;
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
m_pc_t pc = s_pc;
|
||||
#endif
|
||||
mptr = p[1];
|
||||
while(true){
|
||||
s_u16_t permill2;
|
||||
mSysIRQ_Disable;
|
||||
s_memcpy(&node_temp, node_curr, sizeof(s_tasknode_ts));
|
||||
node_curr->usedtime[0] = 0;
|
||||
node_curr->usedtime[1] = 0;
|
||||
mSysIRQ_Enable;
|
||||
/* Name */
|
||||
_strcpy_(node_temp.name);
|
||||
if(SYSCFG_TASKNAMELEN_MAX > _strlen_(node_temp.name)){
|
||||
_spccpy_((s_u8_t)(SYSCFG_TASKNAMELEN_MAX - _strlen_(node_temp.name)));
|
||||
}
|
||||
/* TID */
|
||||
_u8str_ (node_temp.tid);
|
||||
_spccpy_((s_u8_t)(OS_TASKMGR_LEN_TID - _strlen_(str)));
|
||||
_strcpy_(str);
|
||||
/* PRI */
|
||||
_u8str_ (node_temp.pri);
|
||||
_spccpy_((s_u8_t)(OS_TASKMGR_LEN_PRI - _strlen_(str)));
|
||||
_strcpy_(str);
|
||||
/* STA */
|
||||
_spccpy_(OS_TASKMGR_LEN_STA - 3);
|
||||
if(node_temp.status <= OS_STATUS_FLOATING){
|
||||
_strcpy_("RDY");
|
||||
}
|
||||
else if(node_temp.status == OS_STATUS_BLOCKED){
|
||||
node_temp.blocktype &= 0xF0;
|
||||
switch(node_temp.blocktype){
|
||||
case OS_BLOCKED_DELAY: _strcpy_("DLY"); break;
|
||||
case OS_BLOCKED_BINARY: _strcpy_("BIN"); break;
|
||||
case OS_BLOCKED_MUTEX: _strcpy_("MUT"); break;
|
||||
case OS_BLOCKED_SEMAPHORE: _strcpy_("SEM"); break;
|
||||
case OS_BLOCKED_FLAGGROUP: _strcpy_("GRP"); break;
|
||||
case OS_BLOCKED_TASKMSG: _strcpy_(" TM"); break;
|
||||
case OS_BLOCKED_FETION: _strcpy_("FET"); break;
|
||||
case OS_BLOCKED_MAIL: _strcpy_("MAL"); break;
|
||||
case OS_BLOCKED_MSG: _strcpy_("MSG"); break;
|
||||
}
|
||||
}
|
||||
else if(node_temp.status == OS_STATUS_OVERTIME){
|
||||
_strcpy_("OSR");
|
||||
}
|
||||
else if(node_temp.status & OS_STATUS_SUSPENDED){
|
||||
_strcpy_("SPD");
|
||||
}
|
||||
else if(node_temp.status == OS_STATUS_STOPPED_TSOF){
|
||||
_strcpy_("!OF");
|
||||
}
|
||||
else if(node_temp.status == OS_STATUS_STOPPED_TSRF){
|
||||
_strcpy_("!RF");
|
||||
}
|
||||
else{
|
||||
_strcpy_("!XX");
|
||||
}
|
||||
/* CPU */
|
||||
permill2 = (
|
||||
(
|
||||
(node_temp.usedtime[0] * 10000UL)
|
||||
+ (node_temp.usedtime[1] * 10000UL) / mSysTick_Cycle
|
||||
) / upspeed
|
||||
);
|
||||
_used_ratio_(permill2);
|
||||
if(!node_temp.pri){
|
||||
permill1 -= permill2;
|
||||
}
|
||||
/* RAM */
|
||||
_spccpy_(
|
||||
(s_u8_t)(
|
||||
OS_TASKMGR_LEN_RAM - 4
|
||||
- _u16len_((s_u16_t)node_temp.stacklen_max)
|
||||
- _u16len_((s_u16_t)node_temp.stacksize)
|
||||
)
|
||||
);
|
||||
_u16str_(node_temp.stacklen_max);
|
||||
_strcpy_(str);
|
||||
_strcpy_("B/");
|
||||
switch(node_temp.create){
|
||||
case 0: _chrcpy_('s'); break;
|
||||
case 1: _chrcpy_('m'); break;
|
||||
case 2: _chrcpy_('r'); break;
|
||||
}
|
||||
_u16str_(node_temp.stacksize);
|
||||
_strcpy_(str);
|
||||
_chrcpy_('B');
|
||||
_strcpy_("\r\n");
|
||||
/* - */
|
||||
if(node_temp.next == u_taskhandle_Taskmgr){
|
||||
break;
|
||||
}
|
||||
node_curr = node_temp.next;
|
||||
}
|
||||
/* CPU-TOTAL */
|
||||
if(true){
|
||||
char _XDATA_MEM_ *p0 = mptr;
|
||||
mptr = p[0];
|
||||
_used_ratio_(permill1);
|
||||
mptr = p0;
|
||||
}
|
||||
/* NULL Line */
|
||||
_strcpy_("\r\n");
|
||||
/* PSVFIFO */
|
||||
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
|
||||
if(mPendSV_FIFO_DepthMAX > MCUCFG_PENDSVFIFO_DEPTH){
|
||||
s_fault.overflow_pendsvfifo = true;
|
||||
}
|
||||
_strcpy_("PSVFIFO: ");
|
||||
_u16str_(mPendSV_FIFO_DepthMAX);
|
||||
_strcpy_(str);
|
||||
_strcpy_("/");
|
||||
_u16str_(MCUCFG_PENDSVFIFO_DEPTH);
|
||||
_strcpy_(str);
|
||||
_strcpy_(".\r\n");
|
||||
#endif
|
||||
/* Task-PC */
|
||||
#if SYSCFG_TASKPC_MONITOR == __ENABLED__
|
||||
_strcpy_("Task-PC: ");
|
||||
#if MCUCFG_PCLEN > 2
|
||||
_u8str16_((s_u8_t)(pc >> 24));
|
||||
_u8str16_((s_u8_t)(pc >> 16));
|
||||
#endif
|
||||
_u8str16_((s_u8_t)(pc >> 8));
|
||||
_u8str16_((s_u8_t)(pc));
|
||||
_strcpy_(".\r\n");
|
||||
#endif
|
||||
/* SysTick */
|
||||
#if SYSCFG_SYSTICKTIME_COUNT == __ENABLED__
|
||||
mSysIRQ_Disable;
|
||||
if(s_tick_counter2){
|
||||
s_u32_t counter1 = s_tick_counter1;
|
||||
s_u32_t counter2 = s_tick_counter2;
|
||||
s_tick_counter1 = 0;
|
||||
s_tick_counter2 = 0;
|
||||
mSysIRQ_Enable;
|
||||
counter2 = (counter1 * 100 * mSysTick_CLKMOD) / (SYSCFG_SYSCLK / 1000000UL) / counter2;
|
||||
_strcpy_("SysTick: ");
|
||||
_u16str_((s_u16_t)(counter2 / 100));
|
||||
_strcpy_(str);
|
||||
_chrcpy_('.');
|
||||
_u8str_((s_u8_t)((counter2 % 100) / 10));
|
||||
_strcpy_(str);
|
||||
_u8str_((s_u8_t)(counter2 % 10));
|
||||
_strcpy_(str);
|
||||
_strcpy_("us.\r\n");
|
||||
}
|
||||
else{
|
||||
mSysIRQ_Enable;
|
||||
}
|
||||
#endif
|
||||
/* Alarm */
|
||||
if(*(s_u8_t *)&s_alarm){
|
||||
_strcpy_("Alarm: ");
|
||||
if(s_alarm.overflow_msgqueue){
|
||||
_strcpy_("omq, ");
|
||||
}
|
||||
if(s_alarm.overflow_taskqueue){
|
||||
_strcpy_("otq, ");
|
||||
}
|
||||
if(s_alarm.timedout_saferuntime){
|
||||
_strcpy_("osr, ");
|
||||
}
|
||||
if(s_alarm.outrange_taskpriority){
|
||||
_strcpy_("otp, ");
|
||||
}
|
||||
if(s_alarm.realloc_taskstack){
|
||||
_strcpy_("rts, ");
|
||||
}
|
||||
if(s_alarm.overflow_taskstack_future){
|
||||
_strcpy_("ots, ");
|
||||
}
|
||||
mptr -= 2;
|
||||
_strcpy_(".\r\n");
|
||||
}
|
||||
/* Fault */
|
||||
if(*(s_u8_t *)&s_fault){
|
||||
_strcpy_("Fault: ");
|
||||
if(s_fault.mallocfailed_msgnode){
|
||||
_strcpy_("mmn, ");
|
||||
}
|
||||
if(s_fault.mallocfailed_tasknode){
|
||||
_strcpy_("mtn, ");
|
||||
}
|
||||
if(s_fault.mallocfailed_taskstack){
|
||||
_strcpy_("mts, ");
|
||||
}
|
||||
if(s_fault.reallocfailed_taskstack){
|
||||
_strcpy_("rts, ");
|
||||
}
|
||||
if(s_fault.overflow_taskstack){
|
||||
_strcpy_("ots, ");
|
||||
}
|
||||
if(s_fault.failed_startuptask){
|
||||
_strcpy_("fst, ");
|
||||
}
|
||||
if(s_fault.error_recvmsg_int){
|
||||
_strcpy_("erm, ");
|
||||
}
|
||||
#if SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__
|
||||
if(s_fault.overflow_pendsvfifo){
|
||||
_strcpy_("opd, ");
|
||||
}
|
||||
#endif
|
||||
mptr -= 2;
|
||||
_strcpy_(".\r\n");
|
||||
}
|
||||
/* NULL Line */
|
||||
_strcpy_("\r\n");
|
||||
/* string tail */
|
||||
_chrcpy_('\0');
|
||||
/* - */
|
||||
mSysIRQ_Disable;
|
||||
upspeed = s_timqry_reload[OS_TMID_TASKMGR];
|
||||
s_debug_sendtype |= OS_DEBUG_SEND_TASKMGR;
|
||||
s_task_current->status |= OS_STATUS_SUSPENDED;
|
||||
su_exit_critical_psv();
|
||||
}
|
||||
uEndTasking;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user