Files
cosyos/Port/80251/port_80251.c
零中断延迟的RTOS ca65cdc039 update 移植文件.
Signed-off-by: 零中断延迟的RTOS <cosyos@139.com>
2026-01-13 09:27:48 +00:00

294 lines
6.1 KiB
C

/**************************************************************************//**
* @item CosyOS-III Port
* @file port_80251.c
* @brief 80251 Core Port File
* @author 迟凯峰
* @version V2.2.0
* @date 2026.01.13
******************************************************************************/
#include "os_var.h"
#ifdef __PORT_80251_H
s_u16_t _SYS_MEM_ m_bsp_add = sizeof(s_taskhand_ts);
static s_u8_t xdata mVOID _at_ 0;
/*
* 全局临界区
*/
static bit m_oldirq;
static volatile s_u8_t _SYS_MEM_ m_glocri_counter/**/sZeroInstall;
void mx_disable_irq(void)
{
if(_testbit_(EA)){
m_oldirq = 1;
}
else if(!m_glocri_counter){
m_oldirq = 0;
}
m_glocri_counter++;
}
void mx_resume_irq(void)
{
m_glocri_counter--;
if(!m_glocri_counter){
EA = m_oldirq;
}
}
/*
* 中断FIFO服务
*/
#if (MCUCFG_PENDSVFIFO_DEPTH > 0)
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
s_u8_t mPendSV_FIFO_DepthMAX/**/sZeroInstall;
#endif
bit m_sign_fifo = true;
static void _STATIC_MEM_ *mPendSV_FIFO_0[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0100;
static void _STATIC_MEM_ *mPendSV_FIFO_1[MCUCFG_PENDSVFIFO_DEPTH + MCUCFG_PENDSVFIFO_MUTEX - 1] _at_ 0x0200;
static void _fifo_x_(void _STATIC_MEM_ *sv)
{
(*sPendSV_FIFOHandler[*(const s_u8_t _STATIC_MEM_ *)sv])(sv);
}
s_u8_t _SYS_MEM_ m_fifo_0_count = MCUCFG_PENDSVFIFO_DEPTH;
s_u8_t _SYS_MEM_ m_fifo_1_count = MCUCFG_PENDSVFIFO_DEPTH;
#define mWriteCode(n) \
bit m_sign_fifo_0_##n = true; \
bit m_sign_fifo_1_##n = true
mWriteCode(0);
mWriteCode(1);
mWriteCode(2);
mWriteCode(3);
mWriteCode(4);
mWriteCode(5);
mWriteCode(6);
mWriteCode(7);
#if (MCUCFG_PENDSVFIFO_DEPTH > 8)
mWriteCode(8);
mWriteCode(9);
mWriteCode(10);
mWriteCode(11);
mWriteCode(12);
mWriteCode(13);
mWriteCode(14);
mWriteCode(15);
#if (MCUCFG_PENDSVFIFO_DEPTH > 16)
mWriteCode(16);
mWriteCode(17);
mWriteCode(18);
mWriteCode(19);
mWriteCode(20);
mWriteCode(21);
mWriteCode(22);
mWriteCode(23);
#if (MCUCFG_PENDSVFIFO_DEPTH > 24)
mWriteCode(24);
mWriteCode(25);
mWriteCode(26);
mWriteCode(27);
mWriteCode(28);
mWriteCode(29);
mWriteCode(30);
mWriteCode(31);
#if (MCUCFG_PENDSVFIFO_DEPTH > 32)
mWriteCode(32);
mWriteCode(33);
mWriteCode(34);
mWriteCode(35);
mWriteCode(36);
mWriteCode(37);
mWriteCode(38);
mWriteCode(39);
#endif
#endif
#endif
#endif
#undef mWriteCode
void mPendSV_FIFOHandler(void)
{
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
s_u8_t i;
#endif
__LABLE:
m_sign_fifo = false;
m_sign_fifo_0_0 = true;
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + 0));
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
#define mWriteCode(n) \
if(m_sign_fifo_0_##n){ i = n; goto __LABLE_0; } \
m_sign_fifo_0_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + n))
#else
#define mWriteCode(n) \
if(m_sign_fifo_0_##n) goto __LABLE_0; \
m_sign_fifo_0_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_0 + n))
#endif
mWriteCode(1);
mWriteCode(2);
mWriteCode(3);
mWriteCode(4);
mWriteCode(5);
mWriteCode(6);
mWriteCode(7);
#if (MCUCFG_PENDSVFIFO_DEPTH > 8)
mWriteCode(8);
mWriteCode(9);
mWriteCode(10);
mWriteCode(11);
mWriteCode(12);
mWriteCode(13);
mWriteCode(14);
mWriteCode(15);
#if (MCUCFG_PENDSVFIFO_DEPTH > 16)
mWriteCode(16);
mWriteCode(17);
mWriteCode(18);
mWriteCode(19);
mWriteCode(20);
mWriteCode(21);
mWriteCode(22);
mWriteCode(23);
#if (MCUCFG_PENDSVFIFO_DEPTH > 24)
mWriteCode(24);
mWriteCode(25);
mWriteCode(26);
mWriteCode(27);
mWriteCode(28);
mWriteCode(29);
mWriteCode(30);
mWriteCode(31);
#if (MCUCFG_PENDSVFIFO_DEPTH > 32)
mWriteCode(32);
mWriteCode(33);
mWriteCode(34);
mWriteCode(35);
mWriteCode(36);
mWriteCode(37);
mWriteCode(38);
mWriteCode(39);
#endif
#endif
#endif
#endif
#undef mWriteCode
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(m_fifo_0_count > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = m_fifo_0_count;
}
m_fifo_0_count = MCUCFG_PENDSVFIFO_DEPTH;
#endif
__LABLE_0:
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(i > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = i;
}
#endif
m_sign_fifo = true;
if(m_sign_fifo_1_0) return;
m_sign_fifo_1_0 = true;
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + 0));
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
#define mWriteCode(n) \
if(m_sign_fifo_1_##n){ i = n; goto __LABLE_1; } \
m_sign_fifo_1_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + n))
#else
#define mWriteCode(n) \
if(m_sign_fifo_1_##n) goto __LABLE_1; \
m_sign_fifo_1_##n = true; \
_fifo_x_(*(void _STATIC_MEM_ * _STATIC_MEM_ *)(mPendSV_FIFO_1 + n))
#endif
mWriteCode(1);
mWriteCode(2);
mWriteCode(3);
mWriteCode(4);
mWriteCode(5);
mWriteCode(6);
mWriteCode(7);
#if (MCUCFG_PENDSVFIFO_DEPTH > 8)
mWriteCode(8);
mWriteCode(9);
mWriteCode(10);
mWriteCode(11);
mWriteCode(12);
mWriteCode(13);
mWriteCode(14);
mWriteCode(15);
#if (MCUCFG_PENDSVFIFO_DEPTH > 16)
mWriteCode(16);
mWriteCode(17);
mWriteCode(18);
mWriteCode(19);
mWriteCode(20);
mWriteCode(21);
mWriteCode(22);
mWriteCode(23);
#if (MCUCFG_PENDSVFIFO_DEPTH > 24)
mWriteCode(24);
mWriteCode(25);
mWriteCode(26);
mWriteCode(27);
mWriteCode(28);
mWriteCode(29);
mWriteCode(30);
mWriteCode(31);
#if (MCUCFG_PENDSVFIFO_DEPTH > 32)
mWriteCode(32);
mWriteCode(33);
mWriteCode(34);
mWriteCode(35);
mWriteCode(36);
mWriteCode(37);
mWriteCode(38);
mWriteCode(39);
#endif
#endif
#endif
#endif
#undef mWriteCode
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(m_fifo_1_count > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = m_fifo_1_count;
}
m_fifo_1_count = MCUCFG_PENDSVFIFO_DEPTH;
#endif
__LABLE_1:
#if (SYSCFG_PENDSVFIFO_MONITOR == __ENABLED__)
if(i > mPendSV_FIFO_DepthMAX){
mPendSV_FIFO_DepthMAX = i;
}
#endif
if(!m_sign_fifo_0_0) goto __LABLE;
}
#endif
#endif